Version 1.7.0-dev.0.0

svn merge -r 39190:39648 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@39655 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/README b/README
index 1789fbe..d483ef6 100644
--- a/README
+++ b/README
@@ -12,7 +12,7 @@
 lib/           Libraries that ship with the Dart runtime (core, html, etc.).
 pkg/           Packages that are not shipped with the core runtime.
 runtime/       Dart VM and code for running it as a standalone app.
-samples/       Sample Dart programs. 
+samples/       Sample Dart programs.
 tests/         Automated tests.
 third_party/   External dependencies.
 tools/         Build scripts, text editor support files, etc.
diff --git a/README.dart-sdk b/README.dart-sdk
index 9815d25..7b82656 100644
--- a/README.dart-sdk
+++ b/README.dart-sdk
@@ -12,10 +12,10 @@
   pub            Pub, the Dart package manager
   dartfmt        Dart code formatter
 
-lib/             Libraries that are shipped with the Dart runtime. More 
+lib/             Libraries that are shipped with the Dart runtime. More
                  information is available at api.dartlang.org.
 
-packages/        Additional packages that are shipped outside of the Dart 
+packages/        Additional packages that are shipped outside of the Dart
                  runtime. More information is available at api.dartlang.org.
 
 version          The version number of the SDK (ex. 1.5.1).
diff --git a/client/tools/buildbot_annotated_steps.py b/client/tools/buildbot_annotated_steps.py
index 7363364..32f8579 100755
--- a/client/tools/buildbot_annotated_steps.py
+++ b/client/tools/buildbot_annotated_steps.py
@@ -201,6 +201,8 @@
     status = ProcessBot(name, 'functional_testing')
   elif name.startswith('version-checker'):
     status = ProcessBot(name, 'version_checker')
+  elif name.startswith('dart2js-dump-info'):
+    status = ProcessBot(name, 'dart2js_dump_info')
   else:
     status = ProcessBot(name, 'compiler')
 
diff --git a/create_sdk.gyp b/create_sdk.gyp
index e1896ba..59e157b 100644
--- a/create_sdk.gyp
+++ b/create_sdk.gyp
@@ -13,6 +13,7 @@
         'utils/pub/pub.gyp:pub',
         'utils/pub/pub.gyp:core_stubs',
         'utils/dartfmt/dartfmt.gyp:dartfmt',
+        'utils/analysis_server/analysis_server.gyp:analysis_server',
         'utils/dartanalyzer/dartanalyzer.gyp:dartanalyzer',
       ],
       'actions': [
@@ -31,6 +32,7 @@
             '<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/dartfmt.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/core_stubs/dart_io.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/analysis_server.dart.snapshot',
             'tools/VERSION'
           ],
           'outputs': [
diff --git a/dart.gyp b/dart.gyp
index 86a0bae..41f90c3 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -8,6 +8,7 @@
       'target_name': 'most',
       'type': 'none',
       'dependencies': [
+        'analysis_server',
         'analyzer_java',
         'create_sdk',
         'dart2js',
@@ -70,6 +71,13 @@
       ],
     },
     {
+      'target_name': 'analysis_server',
+      'type': 'none',
+      'dependencies': [
+        'utils/analysis_server/analysis_server.gyp:analysis_server',
+      ],
+    },
+    {
       # This is the target that is built on the dart2dart bots.
       # It must depend on anything that is required by dart2dart
       # tests.
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 6b35f804..fe9ef27 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -1206,7 +1206,7 @@
 
 Then, the initializer list of the constructor $S$ (respectively $S.id$) is executed with respect to the bindings that resulted from the evaluation of the argument list,  with \THIS{} bound to the current binding of \THIS{}, and  the type parameters (if any) of class $S$ bound to the current bindings of $U_1, , \ldots, U_m$.
 
-It is a compile-time error if class $S$ does not declare a generative constructor named $S$ (respectively $S.id$)
+It is a compile-time error if class $S$ does not declare a generative constructor named $S$ (respectively $S.id$).
 
 \subsubsection{Factories}
 \label{factories}
@@ -1510,7 +1510,7 @@
 %} 
 
 %It is a compile-time error if  the \EXTENDS{} clause of a class $C$ includes a type expression that does not denote a class available in the lexical scope of $C$. 
-It is a compile-time error if  the \EXTENDS{} clause of a class $C$ specifies a malformed  type or a deferred type (\ref{staticTypes}) as a superclass.
+It is a compile-time error if  the \EXTENDS{} clause of a class $C$ specifies an enumerated type (\ref{enums}), a malformed  type or a deferred type (\ref{staticTypes}) as a superclass.
 % too strict? Do we e want extends List<Undeclared> to work as List<dynamic>? 
 
 \commentary{ The type parameters of a generic class are available in the lexical scope of the superclass clause, potentially shadowing classes in the surrounding scope. The following code is therefore illegal and should cause a compile-time error:
@@ -1633,7 +1633,7 @@
     .
 \end{grammar}
 
-It is a compile-time error if  the \IMPLEMENTS{}  clause of a class $C$ specifies a type variable as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies  a malformed type or deferred type (\ref{staticTypes}) as a superinterface  It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifies type \DYNAMIC{} as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies  a type $T$ as a superinterface more than once.
+It is a compile-time error if  the \IMPLEMENTS{}  clause of a class $C$ specifies a type variable as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies an enumerated type (\ref{enums}),  a malformed type or deferred type (\ref{staticTypes}) as a superinterface  It is a compile-time error if the \IMPLEMENTS{} clause of a class $C$ specifies type \DYNAMIC{} as a superinterface. It is a compile-time error if  the  \IMPLEMENTS{} clause of a class $C$ specifies  a type $T$ as a superinterface more than once.
 It is a compile-time error if the superclass of a class $C$ is specified as a superinterface of $C$.
 
 \rationale{
@@ -1824,7 +1824,7 @@
 
 If the mixin application declares support for interfaces, the resulting class implements those interfaces.
 
-It is a compile-time error if $S$ is a malformed type. It is a compile-time error if $M$ (respectively, any of $M_1, \ldots, M_k$) is a malformed type. It is a compile time error if a well formed mixin cannot be derived from $M$ (respectively, from each of $M_1, \ldots, M_k$). 
+It is a compile-time error if $S$ is an enumerated type (\ref{enums}) or a malformed type. It is a compile-time error if $M$ (respectively, any of $M_1, \ldots, M_k$) is an enumerated type (\ref{enums}) or a malformed type. It is a compile time error if a well formed mixin cannot be derived from $M$ (respectively, from each of $M_1, \ldots, M_k$). 
 
 Let $K$ be a class declaration  with the same constructors, superclass and interfaces as $C$,  and the instance members declared by $M$ (respectively $M_1, \ldots, M_k$). It is a static warning if the declaration of $K$ would cause a static warning.  It is a compile-time error if the declaration of $K$ would cause a compile-time error.
 
@@ -1876,6 +1876,38 @@
 }
 
 
+\section{Enums}
+\label{enums}
+
+An {\em enumerated type}, or {\em enum}, is used to represent a fixed number of constant values.
+
+\begin{grammar}
+{\bf enumType:}
+metadata \ENUM{} id `\{' id [`,' id]* [`,'] `\}'
+    .
+\end{grammar}
+
+The declaration of an enum of the form \code{metadata \ENUM{} E \{ id$_0$, \ldots id$_{n-1}$\};}
+has the same effect as a class declaration
+
+\begin{dartCode}
+metadata \CLASS{} E \{
+  \FINAL{} int index;
+  \CONST{} E(\THIS{}.index);
+  \STATIC{} \CONST{} E id$_0$ = \CONST{} E(0);
+  $\ldots$
+  \STATIC{} \CONST{} E id$_{n-1}$ = const E(n - 1);
+  \STATIC{} \CONST{} List$<$E$>$ values = const $<$E$>$[id$_0 \ldots $ id$_{n-1}$];
+  String toString() =$>$ \{ 0: `E.id$_0$', $\ldots$, n-1: `E.id$_{n-1}$'\}[index]
+\}
+\end{dartCode}
+
+\commentary {
+It is also a compile-time error to subclass, mix-in or implement an enum or to explicitly instantiate an enum.  These restrictions are given in normative form in sections \ref{superclasses}, \ref{superinterfaces}, \ref{mixinApplication} and \ref{instanceCreation} as appropriate.
+}
+
+
+
 \section{Generics}
 \label{generics}
 
@@ -2777,6 +2809,18 @@
 \CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,  
 
 \CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ is malformed (\ref{dynamicTypeSystem}) or malbounded (\ref{parameterizedTypes}).
+
+It is a compile-time error if the type $T$ in an instance creation expression of one of the forms 
+
+\NEW{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,  
+
+\NEW{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,
+
+\CONST{} $T.id(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$,  
+
+\CONST{} $T(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$ 
+
+is an enumerated type (\ref{enums}).
 %any of the type arguments to a constructor of a generic type $G$ invoked by a new expression or a constant object expression are not subtypes of the bounds of the corresponding formal type parameters of $G$.
 
 
@@ -4659,6 +4703,17 @@
   Very elaborate code in a case clause is probably bad style in any case, and such code can always be refactored.
 }
  
+ It is a static warning if all of the following conditions hold:
+ \begin{itemize}
+\item  The switch statement does not have a default clause.
+ \item The static type of $e$ is an enumerated typed with elements $id_1, \ldots, id_n$.
+\item The sets $\{e_1, \ldots,  e_k\} $ and $\{id_1, \ldots, id_n\}$ are not the same.
+\end{itemize}
+
+\commentary{
+In other words, a warning will be issued if a switch statement over an enum is not exhaustive.
+}
+
  
 \subsection{ Rethrow}
 \label{rethrow}
@@ -4979,6 +5034,7 @@
 
  \begin{grammar}
 {\bf topLevelDefinition:}classDefinition;
+     enumType;
 %      classDefinitionOrInterfaceInjection;
 %      interfaceDefinitionOrInterfaceInjection;
  %     mixinApplication;
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index d87f813..96f2cc0 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1,9 +1,17 @@
 <html><head>
     <meta charset="UTF-8">
     <title>Analysis Server API Specification</title>
-  <style>h1 {
+  <style>body {
+  font-family: sans-serif, serif;
+  padding-left: 5%;
+  padding-right: 5%;
+}
+h1 {
   text-align: center;
 }
+h2.domain {
+  border-bottom: 3px solid rgb(160, 160, 160);
+}
 pre {
   margin: 0px;
 }
@@ -12,13 +20,25 @@
   background-color: rgb(207, 226, 243);
   padding: 0.5em;
 }
+div.hangingIndent {
+  padding-left: 3em;
+  text-indent: -3em;
+}
 dt {
   margin-top: 1em;
   margin-bottom: 1em;
 }
-div.hangingIndent {
-  padding-left: 3em;
-  text-indent: -3em;
+dt.notification {
+  font-weight: bold;
+}
+dt.refactoring {
+  font-weight: bold;
+}
+dt.request {
+  font-weight: bold;
+}
+dt.typeDefinition {
+  font-weight: bold;
 }
 </style></head>
   <body>
@@ -153,7 +173,7 @@
       flag is not specified then notifications will be sent for all
       errors produced for all files in the actual analysis roots.
     </p>
-    <h2><a name="domain_server">Domain: server</a></h2>
+    <h2 class="domain"><a name="domain_server">Domain: server</a></h2>
       <p>
         The server domain contains API’s related to the execution of
         the server.
@@ -233,7 +253,7 @@
       </dd><dt class="notification">server.error</dt><dd><div class="box"><pre>notification: {
   "event": "server.error"
   "params": {
-    "<b>fatal</b>": bool
+    "<b>isFatal</b>": bool
     "<b>message</b>": String
     "<b>stackTrace</b>": String
   }
@@ -251,7 +271,7 @@
           notification.
         </p>
         
-      <h4>Parameters</h4><dl><dt class="field"><b><i>fatal ( bool )</i></b></dt><dd>
+      <h4>Parameters</h4><dl><dt class="field"><b><i>isFatal ( bool )</i></b></dt><dd>
             
             <p>
               True if the error is a fatal error, meaning that the
@@ -296,7 +316,7 @@
               analyzed.
             </p>
           </dd></dl></dd></dl>
-    <h2><a name="domain_analysis">Domain: analysis</a></h2>
+    <h2 class="domain"><a name="domain_analysis">Domain: analysis</a></h2>
       <p>
         The analysis domain contains API’s related to the analysis of
         files.
@@ -565,7 +585,7 @@
   "id": String
   "method": "analysis.updateContent"
   "params": {
-    "<b>files</b>": Map&lt;<a href="#type_FilePath">FilePath</a>, object&gt;
+    "<b>files</b>": Map&lt;<a href="#type_FilePath">FilePath</a>, <a href="#type_AddContentOverlay">AddContentOverlay</a> | <a href="#type_ChangeContentOverlay">ChangeContentOverlay</a> | <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>&gt;
   }
 }</pre><br><pre>response: {
   "id": String
@@ -582,13 +602,11 @@
           filesystem.
         </p>
         
-      <h4>Parameters</h4><dl><dt class="field"><b><i>files ( Map&lt;<a href="#type_FilePath">FilePath</a>, object&gt; )</i></b></dt><dd>
+      <h4>Parameters</h4><dl><dt class="field"><b><i>files ( Map&lt;<a href="#type_FilePath">FilePath</a>, <a href="#type_AddContentOverlay">AddContentOverlay</a> | <a href="#type_ChangeContentOverlay">ChangeContentOverlay</a> | <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>&gt; )</i></b></dt><dd>
             
             <p>
               A table mapping the files whose content has changed to a
-              description of the content change.  Each value should be
-              one of the following types: <a href="#type_AddContentOverlay">AddContentOverlay</a>, <a href="#type_ChangeContentOverlay">ChangeContentOverlay</a>,
-              or <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>.
+              description of the content change.
             </p>
           </dd></dl></dd><dt class="request">analysis.updateOptions</dt><dd><div class="box"><pre>request: {
   "id": String
@@ -604,9 +622,8 @@
           Update the options controlling analysis based on the given
           set of options. Any options that are not included in the
           analysis options will not be changed. If there are options
-          in the analysis options that are not valid an error will be
-          reported but the values of the valid options will still be
-          updated.
+          in the analysis options that are not valid, they will be
+          silently ignored.
         </p>
         
       <h4>Parameters</h4><dl><dt class="field"><b><i>options ( <a href="#type_AnalysisOptions">AnalysisOptions</a> )</i></b></dt><dd>
@@ -832,10 +849,7 @@
   }
 }</pre></div>
         <p>
-          Reports the overridding members in a file. This notification
-          currently includes only members that override a member from
-          a superclass. In particular, it does not include members
-          that override members from interfaces.
+          Reports the overridding members in a file.
         </p>
         <p>
           This notification is not subscribed to by default. Clients
@@ -855,7 +869,7 @@
               The overrides associated with the file.
             </p>
           </dd></dl></dd></dl>
-    <h2><a name="domain_completion">Domain: completion</a></h2>
+    <h2 class="domain"><a name="domain_completion">Domain: completion</a></h2>
       <p>
         The code completion domain contains commands related to
         getting code completion suggestions.
@@ -907,7 +921,7 @@
     "<b>replacementOffset</b>": int
     "<b>replacementLength</b>": int
     "<b>results</b>": List&lt;<a href="#type_CompletionSuggestion">CompletionSuggestion</a>&gt;
-    "<b>last</b>": bool
+    "<b>isLast</b>": bool
   }
 }</pre></div>
         <p>
@@ -943,16 +957,21 @@
           </dd><dt class="field"><b><i>results ( List&lt;<a href="#type_CompletionSuggestion">CompletionSuggestion</a>&gt; )</i></b></dt><dd>
             
             <p>
-              The completion suggestions being reported.
+              The completion suggestions being reported.  The
+              notification contains all possible completions at the
+              requested cursor position, even those that do not match
+              the characters the user has already typed.  This allows
+              the client to respond to further keystrokes from the
+              user without having to make additional requests.
             </p>
-          </dd><dt class="field"><b><i>last ( bool )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>isLast ( bool )</i></b></dt><dd>
             
             <p>
               True if this is that last set of results that will be
               returned for the indicated completion.
             </p>
           </dd></dl></dd></dl>
-    <h2><a name="domain_search">Domain: search</a></h2>
+    <h2 class="domain"><a name="domain_search">Domain: search</a></h2>
       <p>
         The search domain contains commands related to searches that
         can be performed against the code base.
@@ -976,7 +995,7 @@
   "error": <span style="color:#999999">optional</span> <a href="#type_Error">Error</a>
   "result": {
     "<b>id</b>": <a href="#type_SearchId">SearchId</a>
-    "<b>element</b>": <a href="#type_Element">Element</a>
+    "<b>element</b>": <span style="color:#999999">optional</span> <a href="#type_Element">Element</a>
   }
 }</pre></div>
         <p>
@@ -1014,13 +1033,17 @@
               The identifier used to associate results with this
               search request.
             </p>
-          </dd><dt class="field"><b><i>element ( <a href="#type_Element">Element</a> )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>element ( <span style="color:#999999">optional</span> <a href="#type_Element">Element</a> )</i></b></dt><dd>
             
             <p>
               The element referenced or defined at the given offset
               and whose references will be returned in the search
               results.
             </p>
+            <p>
+              If no element was found at the given location, this
+              field will be absent.
+            </p>
           </dd></dl></dd><dt class="request">search.findMemberDeclarations</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "search.findMemberDeclarations"
@@ -1182,7 +1205,7 @@
   "params": {
     "<b>id</b>": <a href="#type_SearchId">SearchId</a>
     "<b>results</b>": List&lt;<a href="#type_SearchResult">SearchResult</a>&gt;
-    "<b>last</b>": bool
+    "<b>isLast</b>": bool
   }
 }</pre></div>
         <p>
@@ -1203,14 +1226,14 @@
             <p>
               The search results being reported.
             </p>
-          </dd><dt class="field"><b><i>last ( bool )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>isLast ( bool )</i></b></dt><dd>
             
             <p>
               True if this is that last set of results that will be
               returned for the indicated search.
             </p>
           </dd></dl></dd></dl>
-    <h2><a name="domain_edit">Domain: edit</a></h2>
+    <h2 class="domain"><a name="domain_edit">Domain: edit</a></h2>
       <p>
         The edit domain contains commands related to edits that can be
         applied to the code.
@@ -1358,7 +1381,7 @@
   "id": String
   "method": "edit.getRefactoring"
   "params": {
-    "<b>kindId</b>": <a href="#type_RefactoringKind">RefactoringKind</a>
+    "<b>kind</b>": <a href="#type_RefactoringKind">RefactoringKind</a>
     "<b>file</b>": <a href="#type_FilePath">FilePath</a>
     "<b>offset</b>": int
     "<b>length</b>": int
@@ -1369,9 +1392,10 @@
   "id": String
   "error": <span style="color:#999999">optional</span> <a href="#type_Error">Error</a>
   "result": {
-    "<b>status</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
+    "<b>problems</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
     "<b>feedback</b>": <span style="color:#999999">optional</span> object
     "<b>change</b>": <span style="color:#999999">optional</span> <a href="#type_SourceChange">SourceChange</a>
+    "<b>potentialEdits</b>": <span style="color:#999999">optional</span> List&lt;String&gt;
   }
 }</pre></div>
         <p>
@@ -1379,11 +1403,10 @@
         </p>
         
         
-      <h4>Parameters</h4><dl><dt class="field"><b><i>kindId ( <a href="#type_RefactoringKind">RefactoringKind</a> )</i></b></dt><dd>
+      <h4>Parameters</h4><dl><dt class="field"><b><i>kind ( <a href="#type_RefactoringKind">RefactoringKind</a> )</i></b></dt><dd>
             
             <p>
-              The identifier of the kind of refactoring to be
-              performed.
+              The kind of refactoring to be performed.
             </p>
           </dd><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
             
@@ -1418,7 +1441,7 @@
               does not require any options or if the values of those
               options are not known.
             </p>
-          </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>status ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
+          </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>problems ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
             
             <p>
               The status of the refactoring. The array will be empty
@@ -1438,13 +1461,24 @@
             <p>
               The changes that are to be applied to affect the
               refactoring. This field will be omitted if there are
-              problems that prevent a set of changed from being
+              problems that prevent a set of changes from being
               computed, such as having no options specified for a
               refactoring that requires them, or if only validation
               was requested.
             </p>
+          </dd><dt class="field"><b><i>potentialEdits ( <span style="color:#999999">optional</span> List&lt;String&gt; )</i></b></dt><dd>
+            
+            <p>
+              The ids of source edits that are not known to be valid. An edit is
+              not known to be valid if there was insufficient type information
+              for the server to be able to determine whether or not the code
+              needs to be modified, such as when a member is being renamed and
+              there is a reference to a member from an unknown type. This field
+              will be omitted if the change field is omitted or if there are no
+              potential edits for the refactoring.
+            </p>
           </dd></dl></dd></dl>
-    <h2><a name="domain_debug">Domain: debug</a></h2>
+    <h2 class="domain"><a name="domain_debug">Domain: debug</a></h2>
       <p>
         The debugging domain contains commands related to providing a
         debugging experience.
@@ -1682,6 +1716,7 @@
       
       
       
+      
     <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
         <p>
           A directive to begin overlaying the contents of a file.  The
@@ -1741,21 +1776,8 @@
           performed. If the value of a field is omitted the value of the
           option will not be changed.
         </p>
-        <p>
-          NOTE: These options need to change.
-        </p>
         
-      <dl><dt class="field"><b><i>analyzeAngular ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
-            
-            <p>
-              True if the client wants Angular code to be analyzed.
-            </p>
-          </dd><dt class="field"><b><i>analyzePolymer ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
-            
-            <p>
-              True if the client wants Polymer code to be analyzed.
-            </p>
-          </dd><dt class="field"><b><i>enableAsync ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
+      <dl><dt class="field"><b><i>enableAsync ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
             <p>
               True if the client wants to enable support for the
@@ -1777,15 +1799,13 @@
             
             <p>
               True if hints that are specific to dart2js should be
-              generated. This option is ignored if either provideErrors
-              or generateHints is false.
+              generated. This option is ignored if generateHints is false.
             </p>
           </dd><dt class="field"><b><i>generateHints ( <span style="color:#999999">optional</span> bool )</i></b></dt><dd>
             
             <p>
               True is hints should be generated as part of generating
-              errors and warnings. This option is ignored if
-              provideErrors is false.
+              errors and warnings.
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_AnalysisService">AnalysisService: String</a></dt><dd>
         <p>
@@ -1798,7 +1818,7 @@
           An indication of the current state of analysis.
         </p>
         
-      <dl><dt class="field"><b><i>analyzing ( bool )</i></b></dt><dd>
+      <dl><dt class="field"><b><i>isAnalyzing ( bool )</i></b></dt><dd>
             
             <p>True if analysis is currently being performed.</p>
           </dd><dt class="field"><b><i>analysisTarget ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
@@ -1809,33 +1829,25 @@
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_ChangeContentOverlay">ChangeContentOverlay: object</a></dt><dd>
         <p>
-          A directive to modify an existing file content overlay.  A
-          range of text is deleted from the old file content overlay
-          and replaced with new text.
+          A directive to modify an existing file content overlay. One or more
+          ranges of text are deleted from the old file content overlay and
+          replaced with new text.
         </p>
         <p>
-          It is an error to use this directive is used on a file that
-          does not yet have a file content overlay (or that has had
-          its overlay removed via <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>).
+        The edits are applied in the order in which they occur in the list.
+        This means that the offset of each edit must be correct under the
+        assumption that all previous edits have been applied.
+        </p>
+        <p>
+          It is an error to use this overlay on a file that does not yet have
+          a file content overlay or that has had its overlay removed via
+          <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>.
         </p>
         
-      <dl><dt class="field"><b><i>type = "change"</i></b></dt><dd></dd><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
+      <dl><dt class="field"><b><i>type = "change"</i></b></dt><dd></dd><dt class="field"><b><i>edits ( List&lt;<a href="#type_SourceEdit">SourceEdit</a>&gt; )</i></b></dt><dd>
             
             <p>
-              The offset of the text to be remove from the file
-              content overlay.
-            </p>
-          </dd><dt class="field"><b><i>length ( int )</i></b></dt><dd>
-            
-            <p>
-              The length of the text to be removed from the file
-              content overlay, or 0 if no text should be removed.
-            </p>
-          </dd><dt class="field"><b><i>replacement ( String )</i></b></dt><dd>
-            
-            <p>
-              The new text which should be inserted in place of the
-              removed text.
+              The edits to be applied to the file.
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_CompletionId">CompletionId: String</a></dt><dd>
         
@@ -1973,7 +1985,7 @@
           in a completion suggestion.
         </p>
         
-      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">CLASS</dt><dt class="value">CLASS_ALIAS</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">IMPORT</dt><dt class="value">LIBRARY_PREFIX</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">METHOD_NAME</dt><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_DebugContextId">DebugContextId: String</a></dt><dd>
+      <dl><dt class="value">ARGUMENT_LIST</dt><dt class="value">CLASS</dt><dt class="value">CLASS_ALIAS</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">IMPORT</dt><dt class="value">KEYWORD</dt><dt class="value">LIBRARY_PREFIX</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">METHOD_NAME</dt><dt class="value">NAMED_ARGUMENT</dt><dt class="value">OPTIONAL_ARGUMENT</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_DebugContextId">DebugContextId: String</a></dt><dd>
         
         <p>
           The identifier for a debug context.
@@ -2041,7 +2053,7 @@
           An enumeration of the kinds of elements.
         </p>
         
-      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">GETTER</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNKNOWN</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt></dl></dd><dt class="typeDefinition"><a name="type_Error">Error: object</a></dt><dd>
+      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_Error">Error: object</a></dt><dd>
         <p>
           An indication of a problem with the execution of the server,
           typically in response to a request. The error codes that can
@@ -2450,21 +2462,6 @@
             <p>
               The name of the class in which the member is defined.
             </p>
-          </dd></dl></dd><dt class="typeDefinition"><a name="type_Parameter">Parameter: object</a></dt><dd>
-        <p>
-          A description of a parameter.
-        </p>
-        
-      <dl><dt class="field"><b><i>type ( String )</i></b></dt><dd>
-            
-            <p>
-              The type that should be given to the parameter.
-            </p>
-          </dd><dt class="field"><b><i>name ( String )</i></b></dt><dd>
-            
-            <p>
-              The name that should be given to the parameter.
-            </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_Position">Position: object</a></dt><dd>
         <p>
           A position within a file.
@@ -2486,7 +2483,47 @@
           created.
         </p>
         
-      <dl><dt class="value">CONVERT_GETTER_TO_METHOD</dt><dt class="value">CONVERT_METHOD_TO_GETTER</dt><dt class="value">EXTRACT_LOCAL_VARIABLE</dt><dt class="value">EXTRACT_METHOD</dt><dt class="value">INLINE_LOCAL_VARIABLE</dt><dt class="value">INLINE_METHOD</dt><dt class="value">RENAME</dt></dl></dd><dt class="typeDefinition"><a name="type_RefactoringProblem">RefactoringProblem: object</a></dt><dd>
+      <dl><dt class="value">CONVERT_GETTER_TO_METHOD</dt><dt class="value">CONVERT_METHOD_TO_GETTER</dt><dt class="value">EXTRACT_LOCAL_VARIABLE</dt><dt class="value">EXTRACT_METHOD</dt><dt class="value">INLINE_LOCAL_VARIABLE</dt><dt class="value">INLINE_METHOD</dt><dt class="value">RENAME</dt></dl></dd><dt class="typeDefinition"><a name="type_RefactoringMethodParameter">RefactoringMethodParameter: object</a></dt><dd>
+        <p>
+          A description of a parameter in a method refactoring.
+        </p>
+        
+      <dl><dt class="field"><b><i>id ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
+            
+            <p>
+              The unique identifier of the parameter.
+              Clients may omit this field for the parameters they want to add.
+            </p>
+          </dd><dt class="field"><b><i>kind ( <a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a> )</i></b></dt><dd>
+            
+            <p>
+              The kind of the parameter.
+            </p>
+          </dd><dt class="field"><b><i>type ( String )</i></b></dt><dd>
+            
+            <p>
+              The type that should be given to the parameter, or the return type
+              of the parameter's function type.
+            </p>
+          </dd><dt class="field"><b><i>name ( String )</i></b></dt><dd>
+            
+            <p>
+              The name that should be given to the parameter.
+            </p>
+          </dd><dt class="field"><b><i>parameters ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
+            
+            <p>
+              The parameter list of the parameter's function type.
+              If the parameter is not of a function type, this field will
+              not be defined. If the function type has zero parameters, this
+              field will have a value of "()".
+            </p>
+          </dd></dl></dd><dt class="typeDefinition"><a name="type_RefactoringMethodParameterKind">RefactoringMethodParameterKind: String</a></dt><dd>
+        <p>
+          An enumeration of the kinds of parameters.
+        </p>
+        
+      <dl><dt class="value">REQUIRED</dt><dt class="value">POSITIONAL</dt><dt class="value">NAMED</dt></dl></dd><dt class="typeDefinition"><a name="type_RefactoringProblem">RefactoringProblem: object</a></dt><dd>
         <p>
           A description of a problem related to a refactoring.
         </p>
@@ -2502,10 +2539,13 @@
               A human-readable description of the problem being
               represented.
             </p>
-          </dd><dt class="field"><b><i>location ( <a href="#type_Location">Location</a> )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>location ( <span style="color:#999999">optional</span> <a href="#type_Location">Location</a> )</i></b></dt><dd>
             
             <p>
               The location of the problem being represented.
+              This field is omitted unless there is a specific location
+              associated with the problem (such as a location where an element
+              being renamed will be shadowed).
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_RefactoringProblemSeverity">RefactoringProblemSeverity: String</a></dt><dd>
         <p>
@@ -2593,6 +2633,11 @@
             <p>
               A reference to an element.
             </p>
+          </dd><dt class="value">UNKNOWN</dt><dd>
+            
+            <p>
+              Some other kind of search result.
+            </p>
           </dd><dt class="value">WRITE</dt><dd>
             
             <p>
@@ -2653,6 +2698,21 @@
               The code that is to replace the specified region in the
               original code.
             </p>
+          </dd><dt class="field"><b><i>id ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
+            
+            <p>
+              An identifier that uniquely identifies this source edit from other
+              edits in the same response. This field is omitted unless a
+              containing structure needs to be able to identify the edit for
+              some reason.
+            </p>
+            <p>
+              For example, some refactoring operations can produce edits that
+              might not be appropriate (referred to as potential edits). Such
+              edits will have an id so that they can be referenced. Edits in
+              the same response that do not need to be referenced will not have
+              an id.
+            </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_SourceFileEdit">SourceFileEdit: object</a></dt><dd>
         <p>
           A description of a set of changes to a single file.
@@ -2848,7 +2908,7 @@
             <p>
               True if a getter could be created rather than a method.
             </p>
-          </dd><dt class="field"><b><i>parameters ( List&lt;<a href="#type_Parameter">Parameter</a>&gt; )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>parameters ( List&lt;<a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a>&gt; )</i></b></dt><dd>
             
             <p>
               The proposed parameters for the method.
@@ -2891,11 +2951,25 @@
             <p>
               The name that the method should be given.
             </p>
-          </dd><dt class="field"><b><i>parameters ( List&lt;<a href="#type_Parameter">Parameter</a>&gt; )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>parameters ( List&lt;<a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a>&gt; )</i></b></dt><dd>
             
             <p>
               The parameters that should be defined for the method.
-            </p>
+              </p><p>
+                It is an error if a REQUIRED or NAMED parameter follows a
+                POSITIONAL parameter.
+                It is an error if a REQUIRED or POSITIONAL parameter follows a
+                NAMED parameter.
+              </p>
+              <ul>
+                <li>
+                  To change the order and/or update proposed paramerers, add
+                  parameters with the same identifiers as proposed.
+                </li>
+                <li>To add new parameters, omit their identifier.</li>
+                <li>To remove some parameters, omit them in this list.</li>
+              </ul>
+            <p></p>
           </dd><dt class="field"><b><i>extractAll ( bool )</i></b></dt><dd>
             
             <p>
diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
index 0a5dc85..b4bff7f 100644
--- a/pkg/analysis_server/lib/src/analysis_manager.dart
+++ b/pkg/analysis_server/lib/src/analysis_manager.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:analysis_server/src/channel.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 
 /**
@@ -121,7 +120,7 @@
       return channel.close().then((_) => false);
     }
     return channel
-        .sendRequest(new Request('0', SERVER_SHUTDOWN))
+        .sendRequest(new ServerShutdownParams().toRequest('0'))
         .timeout(new Duration(seconds: 2), onTimeout: () {
           print('Expected shutdown response');
         })
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 4264fec..c7a723c 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -10,14 +10,12 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/context_manager.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
-import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -25,10 +23,10 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
+import 'package:analysis_server/src/services/correction/namespace.dart';
 
 
 class ServerContextManager extends ContextManager {
@@ -206,7 +204,7 @@
         this, resourceProvider, packageMapProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
-    Notification notification = new Notification(SERVER_CONNECTED);
+    Notification notification = new ServerConnectedParams().toNotification();
     channel.sendNotification(notification);
     channel.listen(handleRequest, onDone: done, onError: error);
   }
@@ -441,11 +439,9 @@
       return;
     }
     statusAnalyzing = isAnalyzing;
-    Notification notification = new Notification(SERVER_STATUS);
-    Map<String, Object> analysis = new HashMap();
-    analysis['analyzing'] = isAnalyzing;
-    notification.params['analysis'] = analysis;
-    channel.sendNotification(notification);
+    AnalysisStatus analysis = new AnalysisStatus(isAnalyzing);
+    channel.sendNotification(new ServerStatusParams(
+        analysis: analysis).toNotification());
   }
 
   /**
@@ -475,7 +471,7 @@
   /**
    * Implementation for `analysis.updateContent`.
    */
-  void updateContent(Map<String, ContentChange> changes) {
+  void updateContent(Map<String, dynamic> changes) {
     changes.forEach((file, change) {
       AnalysisContext analysisContext = getAnalysisContext(file);
       // TODO(paulberry): handle the case where a file is referred to by more
@@ -484,18 +480,22 @@
       // and user modifies a file in package B).
       if (analysisContext != null) {
         Source source = getSource(file);
-        if (change.offset == null) {
-          analysisContext.setContents(source, change.contentOrReplacement);
-        } else {
+        if (change is AddContentOverlay) {
+          analysisContext.setContents(source, change.content);
+        } else if (change is ChangeContentOverlay) {
           // TODO(paulberry): an error should be generated if source is not
           // currently in the content cache.
           TimestampedData<String> oldContents = analysisContext.getContents(
               source);
-          int offsetEnd = change.offset + change.length;
-          String newContents = oldContents.data.substring(0, change.offset) +
-              change.contentOrReplacement + oldContents.data.substring(offsetEnd);
-          analysisContext.setChangedContents(source, newContents, change.offset,
-              change.length, change.contentOrReplacement.length);
+          String newContents = SourceEdit.applySequence(oldContents.data, change.edits);
+          // TODO(paulberry): to aid in incremental processing it would be
+          // better to use setChangedContents.
+          analysisContext.setContents(source, newContents);
+        } else if (change is RemoveContentOverlay) {
+          analysisContext.setContents(source, null);
+        } else {
+          // Protocol parsing should have ensured that we never get here.
+          throw new AnalysisException('Illegal change type');
         }
         schedulePerformAnalysisOperation(analysisContext);
       }
@@ -664,17 +664,44 @@
   }
 
   /**
-   * Returns [Element]s of the Dart file with the given [path], at the given
-   * offset.
+   * Returns [AstNode]s at the given [offset] of the given [file].
    *
    * May be empty, but not `null`.
    */
-  List<Element> getElementsAtOffset(String path, int offset) {
-    List<CompilationUnit> units = getResolvedCompilationUnits(path);
-    List<Element> elements = <Element>[];
+  List<AstNode> getNodesAtOffset(String file, int offset) {
+    List<CompilationUnit> units = getResolvedCompilationUnits(file);
+    List<AstNode> nodes = <AstNode>[];
     for (CompilationUnit unit in units) {
       AstNode node = new NodeLocator.con1(offset).searchWithin(unit);
+      if (node != null) {
+        nodes.add(node);
+      }
+    }
+    return nodes;
+  }
+
+  /**
+   * Returns [Element]s at the given [offset] of the given [file].
+   *
+   * May be empty if not resolved, but not `null`.
+   */
+  List<Element> getElementsAtOffset(String file, int offset) {
+    List<AstNode> nodes = getNodesAtOffset(file, offset);
+    return getElementsOfNodes(nodes, offset);
+  }
+
+  /**
+   * Returns [Element]s of the given [nodes].
+   *
+   * May be empty if not resolved, but not `null`.
+   */
+  List<Element> getElementsOfNodes(List<AstNode> nodes, int offset) {
+    List<Element> elements = <Element>[];
+    for (AstNode node in nodes) {
       Element element = ElementLocator.locateWithOffset(node, offset);
+      if (node is SimpleIdentifier && element is PrefixElement) {
+        element = getImportElement(node);
+      }
       if (element != null) {
         elements.add(element);
       }
@@ -795,41 +822,10 @@
       stackTraceString = 'null stackTrace';
     }
     // send the notification
-    Notification notification = new Notification(SERVER_ERROR);
-    notification.setParameter(FATAL, true);
-    notification.setParameter(MESSAGE, exceptionString);
-    notification.setParameter(STACK_TRACE, stackTraceString);
-    channel.sendNotification(notification);
+    channel.sendNotification(new ServerErrorParams(true, exceptionString,
+        stackTraceString).toNotification());
   }
 }
 
 
-/**
- * An enumeration of the services provided by the analysis domain.
- */
-class AnalysisService extends Enum2<AnalysisService> {
-  static const HIGHLIGHTS = const AnalysisService('HIGHLIGHTS', 1);
-  static const NAVIGATION = const AnalysisService('NAVIGATION', 2);
-  static const OCCURRENCES = const AnalysisService('OCCURRENCES', 3);
-  static const OUTLINE = const AnalysisService('OUTLINE', 4);
-  static const OVERRIDES = const AnalysisService('OVERRIDES', 5);
-
-  static const List<AnalysisService> VALUES =
-      const [HIGHLIGHTS, NAVIGATION, OCCURRENCES, OUTLINE, OVERRIDES];
-
-  const AnalysisService(String name, int ordinal) : super(name, ordinal);
-}
-
-
 typedef void OptionUpdater(AnalysisOptionsImpl options);
-
-/**
- * An enumeration of the services provided by the server domain.
- */
-class ServerService extends Enum2<ServerService> {
-  static const ServerService STATUS = const ServerService('STATUS', 0);
-
-  static const List<ServerService> VALUES = const [STATUS];
-
-  const ServerService(String name, int ordinal) : super(name, ordinal);
-}
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 3d4e0e5..c01c4ac 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -4,8 +4,7 @@
 
 library computer.highlights;
 
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -35,16 +34,16 @@
     while (token != null && token.type != TokenType.EOF) {
       Token commentToken = token.precedingComments;
       while (commentToken != null) {
-        HighlightType highlightType = null;
+        HighlightRegionType highlightType = null;
         if (commentToken.type == TokenType.MULTI_LINE_COMMENT) {
           if (commentToken.lexeme.startsWith('/**')) {
-            highlightType = HighlightType.COMMENT_DOCUMENTATION;
+            highlightType = HighlightRegionType.COMMENT_DOCUMENTATION;
           } else {
-            highlightType = HighlightType.COMMENT_BLOCK;
+            highlightType = HighlightRegionType.COMMENT_BLOCK;
           }
         }
         if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
-          highlightType = HighlightType.COMMENT_END_OF_LINE;
+          highlightType = HighlightRegionType.COMMENT_END_OF_LINE;
         }
         if (highlightType != null) {
           _addRegion_token(commentToken, highlightType);
@@ -95,19 +94,19 @@
     if (_addIdentifierRegion_typeParameter(node)) {
       return;
     }
-    _addRegion_node(node, HighlightType.IDENTIFIER_DEFAULT);
+    _addRegion_node(node, HighlightRegionType.IDENTIFIER_DEFAULT);
   }
 
   void _addIdentifierRegion_annotation(Annotation node) {
     ArgumentList arguments = node.arguments;
     if (arguments == null) {
-      _addRegion_node(node, HighlightType.ANNOTATION);
+      _addRegion_node(node, HighlightRegionType.ANNOTATION);
     } else {
       _addRegion_nodeStart_tokenEnd(
           node,
           arguments.beginToken,
-          HighlightType.ANNOTATION);
-      _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
+          HighlightRegionType.ANNOTATION);
+      _addRegion_token(arguments.endToken, HighlightRegionType.ANNOTATION);
     }
   }
 
@@ -116,7 +115,7 @@
     if (element is! ClassElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.CLASS);
+    return _addRegion_node(node, HighlightRegionType.CLASS);
   }
 
   bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
@@ -124,7 +123,7 @@
     if (element is! ConstructorElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.CONSTRUCTOR);
+    return _addRegion_node(node, HighlightRegionType.CONSTRUCTOR);
   }
 
   bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
@@ -143,7 +142,7 @@
       return false;
     }
     // OK
-    return _addRegion_node(node, HighlightType.DYNAMIC_TYPE);
+    return _addRegion_node(node, HighlightRegionType.DYNAMIC_TYPE);
   }
 
   bool _addIdentifierRegion_field(SimpleIdentifier node) {
@@ -156,13 +155,13 @@
     }
     if (element is FieldElement) {
       if ((element as FieldElement).isStatic) {
-        return _addRegion_node(node, HighlightType.FIELD_STATIC);
+        return _addRegion_node(node, HighlightRegionType.FIELD_STATIC);
       } else {
-        return _addRegion_node(node, HighlightType.FIELD);
+        return _addRegion_node(node, HighlightRegionType.FIELD);
       }
     }
     if (element is TopLevelVariableElement) {
-      return _addRegion_node(node, HighlightType.TOP_LEVEL_VARIABLE);
+      return _addRegion_node(node, HighlightRegionType.TOP_LEVEL_VARIABLE);
     }
     return false;
   }
@@ -172,11 +171,11 @@
     if (element is! FunctionElement) {
       return false;
     }
-    HighlightType type;
+    HighlightRegionType type;
     if (node.inDeclarationContext()) {
-      type = HighlightType.FUNCTION_DECLARATION;
+      type = HighlightRegionType.FUNCTION_DECLARATION;
     } else {
-      type = HighlightType.FUNCTION;
+      type = HighlightRegionType.FUNCTION;
     }
     return _addRegion_node(node, type);
   }
@@ -186,7 +185,7 @@
     if (element is! FunctionTypeAliasElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.FUNCTION_TYPE_ALIAS);
+    return _addRegion_node(node, HighlightRegionType.FUNCTION_TYPE_ALIAS);
   }
 
   bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
@@ -204,9 +203,9 @@
     PropertyAccessorElement propertyAccessorElement =
         element as PropertyAccessorElement;
     if (propertyAccessorElement.isGetter) {
-      return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
+      return _addRegion_node(node, HighlightRegionType.GETTER_DECLARATION);
     } else {
-      return _addRegion_node(node, HighlightType.SETTER_DECLARATION);
+      return _addRegion_node(node, HighlightRegionType.SETTER_DECLARATION);
     }
   }
 
@@ -215,13 +214,13 @@
     if (element is! PrefixElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.IMPORT_PREFIX);
+    return _addRegion_node(node, HighlightRegionType.IMPORT_PREFIX);
   }
 
   bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
     String name = node.name;
     if (name == "void") {
-      return _addRegion_node(node, HighlightType.KEYWORD);
+      return _addRegion_node(node, HighlightRegionType.KEYWORD);
     }
     return false;
   }
@@ -232,11 +231,11 @@
       return false;
     }
     // OK
-    HighlightType type;
+    HighlightRegionType type;
     if (node.inDeclarationContext()) {
-      type = HighlightType.LOCAL_VARIABLE_DECLARATION;
+      type = HighlightRegionType.LOCAL_VARIABLE_DECLARATION;
     } else {
-      type = HighlightType.LOCAL_VARIABLE;
+      type = HighlightRegionType.LOCAL_VARIABLE;
     }
     return _addRegion_node(node, type);
   }
@@ -249,18 +248,18 @@
     MethodElement methodElement = element as MethodElement;
     bool isStatic = methodElement.isStatic;
     // OK
-    HighlightType type;
+    HighlightRegionType type;
     if (node.inDeclarationContext()) {
       if (isStatic) {
-        type = HighlightType.METHOD_DECLARATION_STATIC;
+        type = HighlightRegionType.METHOD_DECLARATION_STATIC;
       } else {
-        type = HighlightType.METHOD_DECLARATION;
+        type = HighlightRegionType.METHOD_DECLARATION;
       }
     } else {
       if (isStatic) {
-        type = HighlightType.METHOD_STATIC;
+        type = HighlightRegionType.METHOD_STATIC;
       } else {
-        type = HighlightType.METHOD;
+        type = HighlightRegionType.METHOD;
       }
     }
     return _addRegion_node(node, type);
@@ -271,7 +270,7 @@
     if (element is! ParameterElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.PARAMETER);
+    return _addRegion_node(node, HighlightRegionType.PARAMETER);
   }
 
   bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
@@ -279,27 +278,27 @@
     if (element is! TypeParameterElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightType.TYPE_PARAMETER);
+    return _addRegion_node(node, HighlightRegionType.TYPE_PARAMETER);
   }
 
-  void _addRegion(int offset, int length, HighlightType type) {
-    _regions.add(new HighlightRegion(offset, length, type));
+  void _addRegion(int offset, int length, HighlightRegionType type) {
+    _regions.add(new HighlightRegion(type, offset, length));
   }
 
-  bool _addRegion_node(AstNode node, HighlightType type) {
+  bool _addRegion_node(AstNode node, HighlightRegionType type) {
     int offset = node.offset;
     int length = node.length;
     _addRegion(offset, length, type);
     return true;
   }
 
-  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightType type) {
+  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightRegionType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
   }
 
-  void _addRegion_token(Token token, HighlightType type) {
+  void _addRegion_token(Token token, HighlightRegionType type) {
     if (token != null) {
       int offset = token.offset;
       int length = token.length;
@@ -307,7 +306,7 @@
     }
   }
 
-  void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightType type) {
+  void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightRegionType type) {
     int offset = a.offset;
     int end = b.end;
     _addRegion(offset, end - offset, type);
@@ -315,142 +314,6 @@
 }
 
 
-class HighlightRegion implements HasToJson {
-  final int offset;
-  final int length;
-  final HighlightType type;
-
-  HighlightRegion(this.offset, this.length, this.type);
-
-  factory HighlightRegion.fromJson(Map<String, Object> map) {
-    HighlightType type = HighlightType.valueOf(map[TYPE]);
-    return new HighlightRegion(map[OFFSET], map[LENGTH], type);
-  }
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = <String, Object>{};
-    json[OFFSET] = offset;
-    json[LENGTH] = length;
-    json[TYPE] = type.name;
-    return json;
-  }
-
-  @override
-  String toString() => toJson().toString();
-}
-
-
-/**
- * Highlighting kinds constants.
- */
-class HighlightType {
-  static const HighlightType ANNOTATION = const HighlightType('ANNOTATION');
-  static const HighlightType BUILT_IN = const HighlightType('BUILT_IN');
-  static const HighlightType CLASS = const HighlightType('CLASS');
-  static const HighlightType COMMENT_BLOCK =
-      const HighlightType('COMMENT_BLOCK');
-  static const HighlightType COMMENT_DOCUMENTATION =
-      const HighlightType('COMMENT_DOCUMENTATION');
-  static const HighlightType COMMENT_END_OF_LINE =
-      const HighlightType('COMMENT_END_OF_LINE');
-  static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR');
-  static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE');
-  static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE');
-  static const HighlightType FIELD = const HighlightType('FIELD');
-  static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC');
-  static const HighlightType FUNCTION_DECLARATION =
-      const HighlightType('FUNCTION_DECLARATION');
-  static const HighlightType FUNCTION = const HighlightType('FUNCTION');
-  static const HighlightType FUNCTION_TYPE_ALIAS =
-      const HighlightType('FUNCTION_TYPE_ALIAS');
-  static const HighlightType GETTER_DECLARATION =
-      const HighlightType('GETTER_DECLARATION');
-  static const HighlightType KEYWORD = const HighlightType('KEYWORD');
-  static const HighlightType IDENTIFIER_DEFAULT =
-      const HighlightType('IDENTIFIER_DEFAULT');
-  static const HighlightType IMPORT_PREFIX =
-      const HighlightType('IMPORT_PREFIX');
-  static const HighlightType LITERAL_BOOLEAN =
-      const HighlightType('LITERAL_BOOLEAN');
-  static const HighlightType LITERAL_DOUBLE =
-      const HighlightType('LITERAL_DOUBLE');
-  static const HighlightType LITERAL_INTEGER =
-      const HighlightType('LITERAL_INTEGER');
-  static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST');
-  static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP');
-  static const HighlightType LITERAL_STRING =
-      const HighlightType('LITERAL_STRING');
-  static const HighlightType LOCAL_VARIABLE_DECLARATION =
-      const HighlightType('LOCAL_VARIABLE_DECLARATION');
-  static const HighlightType LOCAL_VARIABLE =
-      const HighlightType('LOCAL_VARIABLE');
-  static const HighlightType METHOD_DECLARATION =
-      const HighlightType('METHOD_DECLARATION');
-  static const HighlightType METHOD_DECLARATION_STATIC =
-      const HighlightType('METHOD_DECLARATION_STATIC');
-  static const HighlightType METHOD = const HighlightType('METHOD');
-  static const HighlightType METHOD_STATIC =
-      const HighlightType('METHOD_STATIC');
-  static const HighlightType PARAMETER = const HighlightType('PARAMETER');
-  static const HighlightType SETTER_DECLARATION =
-      const HighlightType('SETTER_DECLARATION');
-  static const HighlightType TOP_LEVEL_VARIABLE =
-      const HighlightType('TOP_LEVEL_VARIABLE');
-  static const HighlightType TYPE_NAME_DYNAMIC =
-      const HighlightType('TYPE_NAME_DYNAMIC');
-  static const HighlightType TYPE_PARAMETER =
-      const HighlightType('TYPE_PARAMETER');
-
-  final String name;
-
-  const HighlightType(this.name);
-
-  @override
-  String toString() => name;
-
-  static HighlightType valueOf(String name) {
-    if (ANNOTATION.name == name) return ANNOTATION;
-    if (BUILT_IN.name == name) return BUILT_IN;
-    if (CLASS.name == name) return CLASS;
-    if (COMMENT_BLOCK.name == name) return COMMENT_BLOCK;
-    if (COMMENT_DOCUMENTATION.name == name) return COMMENT_DOCUMENTATION;
-    if (COMMENT_END_OF_LINE.name == name) return COMMENT_END_OF_LINE;
-    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
-    if (DIRECTIVE.name == name) return DIRECTIVE;
-    if (DYNAMIC_TYPE.name == name) return DYNAMIC_TYPE;
-    if (FIELD.name == name) return FIELD;
-    if (FIELD_STATIC.name == name) return FIELD_STATIC;
-    if (FUNCTION_DECLARATION.name == name) return FUNCTION_DECLARATION;
-    if (FUNCTION.name == name) return FUNCTION;
-    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
-    if (GETTER_DECLARATION.name == name) return GETTER_DECLARATION;
-    if (KEYWORD.name == name) return KEYWORD;
-    if (IDENTIFIER_DEFAULT.name == name) return IDENTIFIER_DEFAULT;
-    if (IMPORT_PREFIX.name == name) return IMPORT_PREFIX;
-    if (LITERAL_BOOLEAN.name == name) return LITERAL_BOOLEAN;
-    if (LITERAL_DOUBLE.name == name) return LITERAL_DOUBLE;
-    if (LITERAL_INTEGER.name == name) return LITERAL_INTEGER;
-    if (LITERAL_LIST.name == name) return LITERAL_LIST;
-    if (LITERAL_MAP.name == name) return LITERAL_MAP;
-    if (LITERAL_STRING.name == name) return LITERAL_STRING;
-    if (LOCAL_VARIABLE_DECLARATION.name ==
-        name) return LOCAL_VARIABLE_DECLARATION;
-    if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
-    if (METHOD_DECLARATION.name == name) return METHOD_DECLARATION;
-    if (METHOD_DECLARATION_STATIC.name ==
-        name) return METHOD_DECLARATION_STATIC;
-    if (METHOD.name == name) return METHOD;
-    if (METHOD_STATIC.name == name) return METHOD_STATIC;
-    if (PARAMETER.name == name) return PARAMETER;
-    if (SETTER_DECLARATION.name == name) return SETTER_DECLARATION;
-    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
-    if (TYPE_NAME_DYNAMIC.name == name) return TYPE_NAME_DYNAMIC;
-    if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER;
-    throw new ArgumentError('Unknown HighlightType: $name');
-  }
-}
-
-
 /**
  * An AST visitor for [DartUnitHighlightsComputer].
  */
@@ -467,227 +330,227 @@
 
   @override
   Object visitAsExpression(AsExpression node) {
-    computer._addRegion_token(node.asOperator, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.asOperator, HighlightRegionType.BUILT_IN);
     return super.visitAsExpression(node);
   }
 
   @override
   Object visitAssertStatement(AssertStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitAssertStatement(node);
   }
 
   @override
   Object visitBooleanLiteral(BooleanLiteral node) {
-    computer._addRegion_node(node, HighlightType.KEYWORD);
-    computer._addRegion_node(node, HighlightType.LITERAL_BOOLEAN);
+    computer._addRegion_node(node, HighlightRegionType.KEYWORD);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_BOOLEAN);
     return super.visitBooleanLiteral(node);
   }
 
   @override
   Object visitBreakStatement(BreakStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitBreakStatement(node);
   }
 
   @override
   Object visitCatchClause(CatchClause node) {
-    computer._addRegion_token(node.catchKeyword, HighlightType.KEYWORD);
-    computer._addRegion_token(node.onKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.catchKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
     return super.visitCatchClause(node);
   }
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    computer._addRegion_token(node.classKeyword, HighlightType.KEYWORD);
-    computer._addRegion_token(node.abstractKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.abstractKeyword, HighlightRegionType.BUILT_IN);
     return super.visitClassDeclaration(node);
   }
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.factoryKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.factoryKeyword, HighlightRegionType.BUILT_IN);
     return super.visitConstructorDeclaration(node);
   }
 
   @override
   Object visitContinueStatement(ContinueStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitContinueStatement(node);
   }
 
   @override
   Object visitDoStatement(DoStatement node) {
-    computer._addRegion_token(node.doKeyword, HighlightType.KEYWORD);
-    computer._addRegion_token(node.whileKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.doKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
     return super.visitDoStatement(node);
   }
 
   @override
   Object visitDoubleLiteral(DoubleLiteral node) {
-    computer._addRegion_node(node, HighlightType.LITERAL_DOUBLE);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_DOUBLE);
     return super.visitDoubleLiteral(node);
   }
 
   @override
   Object visitExportDirective(ExportDirective node) {
-    computer._addRegion_node(node, HighlightType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitExportDirective(node);
   }
 
   @override
   Object visitFieldDeclaration(FieldDeclaration node) {
-    computer._addRegion_token(node.staticKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     return super.visitFieldDeclaration(node);
   }
 
   @override
   Object visitForEachStatement(ForEachStatement node) {
-    computer._addRegion_token(node.forKeyword, HighlightType.KEYWORD);
-    computer._addRegion_token(node.inKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
     return super.visitForEachStatement(node);
   }
 
   @override
   Object visitForStatement(ForStatement node) {
-    computer._addRegion_token(node.forKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
     return super.visitForStatement(node);
   }
 
   @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.propertyKeyword, HighlightRegionType.BUILT_IN);
     return super.visitFunctionDeclaration(node);
   }
 
   @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitFunctionTypeAlias(node);
   }
 
   @override
   Object visitHideCombinator(HideCombinator node) {
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitHideCombinator(node);
   }
 
   @override
   Object visitIfStatement(IfStatement node) {
-    computer._addRegion_token(node.ifKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.ifKeyword, HighlightRegionType.KEYWORD);
     return super.visitIfStatement(node);
   }
 
   @override
   Object visitImplementsClause(ImplementsClause node) {
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitImplementsClause(node);
   }
 
   @override
   Object visitImportDirective(ImportDirective node) {
-    computer._addRegion_node(node, HighlightType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.deferredToken, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.asToken, HighlightType.BUILT_IN);
+    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.deferredToken, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.asToken, HighlightRegionType.BUILT_IN);
     return super.visitImportDirective(node);
   }
 
   @override
   Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitInstanceCreationExpression(node);
   }
 
   @override
   Object visitIntegerLiteral(IntegerLiteral node) {
-    computer._addRegion_node(node, HighlightType.LITERAL_INTEGER);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_INTEGER);
     return super.visitIntegerLiteral(node);
   }
 
   @override
   Object visitIsExpression(IsExpression node) {
-    computer._addRegion_token(node.isOperator, HighlightType.KEYWORD);
+    computer._addRegion_token(node.isOperator, HighlightRegionType.KEYWORD);
     return super.visitIsExpression(node);
   }
 
   @override
   Object visitLibraryDirective(LibraryDirective node) {
-    computer._addRegion_node(node, HighlightType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitLibraryDirective(node);
   }
 
   @override
   Object visitListLiteral(ListLiteral node) {
-    computer._addRegion_node(node, HighlightType.LITERAL_LIST);
-    computer._addRegion_token(node.constKeyword, HighlightType.KEYWORD);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
+    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
     return super.visitListLiteral(node);
   }
 
   @override
   Object visitMapLiteral(MapLiteral node) {
-    computer._addRegion_node(node, HighlightType.LITERAL_MAP);
-    computer._addRegion_token(node.constKeyword, HighlightType.KEYWORD);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
+    computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
     return super.visitMapLiteral(node);
   }
 
   @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.modifierKeyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.operatorKeyword, HighlightType.BUILT_IN);
-    computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.externalKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.modifierKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.operatorKeyword, HighlightRegionType.BUILT_IN);
+    computer._addRegion_token(node.propertyKeyword, HighlightRegionType.BUILT_IN);
     return super.visitMethodDeclaration(node);
   }
 
   @override
   Object visitNativeClause(NativeClause node) {
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitNativeClause(node);
   }
 
   @override
   Object visitNativeFunctionBody(NativeFunctionBody node) {
-    computer._addRegion_token(node.nativeToken, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.nativeToken, HighlightRegionType.BUILT_IN);
     return super.visitNativeFunctionBody(node);
   }
 
   @override
   Object visitPartDirective(PartDirective node) {
-    computer._addRegion_node(node, HighlightType.DIRECTIVE);
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitPartDirective(node);
   }
 
   @override
   Object visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_node(node, HighlightType.DIRECTIVE);
+    computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_tokenStart_tokenEnd(
         node.partToken,
         node.ofToken,
-        HighlightType.BUILT_IN);
+        HighlightRegionType.BUILT_IN);
     return super.visitPartOfDirective(node);
   }
 
   @override
   Object visitRethrowExpression(RethrowExpression node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitRethrowExpression(node);
   }
 
   @override
   Object visitReturnStatement(ReturnStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitReturnStatement(node);
   }
 
   @override
   Object visitShowCombinator(ShowCombinator node) {
-    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     return super.visitShowCombinator(node);
   }
 
@@ -699,44 +562,44 @@
 
   @override
   Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    computer._addRegion_node(node, HighlightType.LITERAL_STRING);
+    computer._addRegion_node(node, HighlightRegionType.LITERAL_STRING);
     return super.visitSimpleStringLiteral(node);
   }
 
   @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitSuperConstructorInvocation(node);
   }
 
   @override
   Object visitSwitchCase(SwitchCase node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitSwitchCase(node);
   }
 
   @override
   Object visitSwitchDefault(SwitchDefault node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitSwitchDefault(node);
   }
 
   @override
   Object visitSwitchStatement(SwitchStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitSwitchStatement(node);
   }
 
   @override
   Object visitThisExpression(ThisExpression node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitThisExpression(node);
   }
 
   @override
   Object visitTryStatement(TryStatement node) {
-    computer._addRegion_token(node.tryKeyword, HighlightType.KEYWORD);
-    computer._addRegion_token(node.finallyKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.tryKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.finallyKeyword, HighlightRegionType.KEYWORD);
     return super.visitTryStatement(node);
   }
 
@@ -745,7 +608,7 @@
     DartType type = node.type;
     if (type != null) {
       if (type.isDynamic && node.name.name == "dynamic") {
-        computer._addRegion_node(node, HighlightType.TYPE_NAME_DYNAMIC);
+        computer._addRegion_node(node, HighlightRegionType.TYPE_NAME_DYNAMIC);
         return null;
       }
     }
@@ -754,19 +617,19 @@
 
   @override
   Object visitVariableDeclarationList(VariableDeclarationList node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitVariableDeclarationList(node);
   }
 
   @override
   Object visitWhileStatement(WhileStatement node) {
-    computer._addRegion_token(node.keyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     return super.visitWhileStatement(node);
   }
 
   @override
   Object visitWithClause(WithClause node) {
-    computer._addRegion_token(node.withKeyword, HighlightType.KEYWORD);
+    computer._addRegion_token(node.withKeyword, HighlightRegionType.KEYWORD);
     return super.visitWithClause(node);
   }
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 960129f..bab5770 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -4,10 +4,7 @@
 
 library computer.hover;
 
-import 'dart:collection';
-
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart' show HoverInformation;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
@@ -69,10 +66,10 @@
   /**
    * Returns the computed hover, maybe `null`.
    */
-  Hover compute() {
+  HoverInformation compute() {
     AstNode node = new NodeLocator.con1(_offset).searchWithin(_unit);
     if (node is Expression) {
-      Hover hover = new Hover(node.offset, node.length);
+      HoverInformation hover = new HoverInformation(node.offset, node.length);
       // element
       Element element = ElementLocator.locateWithOffset(node, _offset);
       if (element != null) {
@@ -95,7 +92,7 @@
         // documentation
         String dartDoc = element.computeDocumentationComment();
         dartDoc = _removeDartDocDelimiters(dartDoc);
-        hover.dartDoc = dartDoc;
+        hover.dartdoc = dartDoc;
       }
       // parameter
       hover.parameter = _safeToString(node.bestParameterElement);
@@ -111,65 +108,3 @@
 
   static _safeToString(obj) => obj != null ? obj.toString() : null;
 }
-
-
-class Hover implements HasToJson {
-  final int offset;
-  final int length;
-  String containingLibraryName;
-  String containingLibraryPath;
-  String dartDoc;
-  String elementDescription;
-  String elementKind;
-  String parameter;
-  String propagatedType;
-  String staticType;
-
-  Hover(this.offset, this.length);
-
-  factory Hover.fromJson(Map<String, Object> map) {
-    int offset = map[OFFSET];
-    int length = map[LENGTH];
-    Hover hover = new Hover(offset, length);
-    hover.containingLibraryName = map[CONTAINING_LIBRARY_NAME];
-    hover.containingLibraryPath = map[CONTAINING_LIBRARY_PATH];
-    hover.dartDoc = map[DART_DOC];
-    hover.elementDescription = map[ELEMENT_DESCRIPTION];
-    hover.elementKind = map[ELEMENT_KIND];
-    hover.parameter = map[PARAMETER];
-    hover.propagatedType = map[PROPAGATED_TYPE];
-    hover.staticType = map[STATIC_TYPE];
-    return hover;
-  }
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = new HashMap<String, Object>();
-    json[OFFSET] = offset;
-    json[LENGTH] = length;
-    if (containingLibraryName != null) {
-      json[CONTAINING_LIBRARY_NAME] = containingLibraryName;
-    }
-    if (containingLibraryName != null) {
-      json[CONTAINING_LIBRARY_PATH] = containingLibraryPath;
-    }
-    if (dartDoc != null) {
-      json[DART_DOC] = dartDoc;
-    }
-    if (elementDescription != null) {
-      json[ELEMENT_DESCRIPTION] = elementDescription;
-    }
-    if (elementKind != null) {
-      json[ELEMENT_KIND] = elementKind;
-    }
-    if (parameter != null) {
-      json[PARAMETER] = parameter;
-    }
-    if (propagatedType != null) {
-      json[PROPAGATED_TYPE] = propagatedType;
-    }
-    if (staticType != null) {
-      json[STATIC_TYPE] = staticType;
-    }
-    return json;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index 03ea941..ac2cfec 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -4,13 +4,11 @@
 
 library computer.navigation;
 
-import 'package:analysis_services/constants.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 
-import 'element.dart' as computer;
-
 
 /**
  * A computer for navigation regions in a Dart [CompilationUnit].
@@ -18,14 +16,14 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  final List<Map<String, Object>> _regions = <Map<String, Object>>[];
+  final List<protocol.NavigationRegion> _regions = <protocol.NavigationRegion>[];
 
   DartUnitNavigationComputer(this._unit);
 
   /**
    * Returns the computed navigation regions, not `null`.
    */
-  List<Map<String, Object>> compute() {
+  List<protocol.NavigationRegion> compute() {
     _unit.accept(new _DartUnitNavigationComputerVisitor(this));
     return new List.from(_regions);
   }
@@ -37,12 +35,8 @@
     if (element is FieldFormalParameterElement) {
       element = (element as FieldFormalParameterElement).field;
     }
-    var elementJson = new computer.Element.fromEngine(element).toJson();
-    _regions.add({
-      OFFSET: offset,
-      LENGTH: length,
-      TARGETS: [elementJson]
-    });
+    protocol.Element target = new protocol.Element.fromEngine(element);
+    _regions.add(new protocol.NavigationRegion(offset, length, [target]));
   }
 
   void _addRegionForNode(AstNode node, Element element) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
index 64f4687..dba4f37 100644
--- a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
@@ -6,9 +6,7 @@
 
 import 'dart:collection';
 
-import 'package:analysis_server/src/computer/element.dart' as server;
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
@@ -27,13 +25,13 @@
   /**
    * Returns the computed occurrences, not `null`.
    */
-  List<Occurrences> compute() {
+  List<protocol.Occurrences> compute() {
     _unit.accept(new _DartUnitOccurrencesComputerVisitor(this));
-    List<Occurrences> occurrences = <Occurrences>[];
+    List<protocol.Occurrences> occurrences = <protocol.Occurrences>[];
     _elementsOffsets.forEach((engineElement, offsets) {
-      var serverElement = new server.Element.fromEngine(engineElement);
+      var serverElement = new protocol.Element.fromEngine(engineElement);
       var length = engineElement.displayName.length;
-      occurrences.add(new Occurrences(serverElement, offsets, length));
+      occurrences.add(new protocol.Occurrences(serverElement, offsets, length));
     });
     return occurrences;
   }
@@ -66,33 +64,6 @@
 }
 
 
-class Occurrences implements HasToJson {
-  final server.Element element;
-  final List<int> offsets;
-  final int length;
-
-  Occurrences(this.element, this.offsets, this.length);
-
-  factory Occurrences.fromJson(Map<String, Object> map) {
-    server.Element element = new server.Element.fromJson(map[ELEMENT]);
-    List<int> offsets = map[OFFSETS];
-    int length = map[LENGTH];
-    return new Occurrences(element, offsets, length);
-  }
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = new HashMap<String, Object>();
-    json[ELEMENT] = element.toJson();
-    json[OFFSETS] = offsets;
-    json[LENGTH] = length;
-    return json;
-  }
-
-  @override
-  String toString() => toJson().toString();
-}
-
-
 class _DartUnitOccurrencesComputerVisitor extends RecursiveAstVisitor {
   final DartUnitOccurrencesComputer computer;
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 4e58235..36bcb84 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -4,9 +4,7 @@
 
 library computer.outline;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
 import 'package:analyzer/src/generated/engine.dart';
@@ -30,15 +28,15 @@
    * Returns the computed outline, not `null`.
    */
   Outline compute() {
-    Outline unitOutline = _newUnitOutline();
+    List<Outline> unitContents = <Outline>[];
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
         ClassDeclaration classDeclaration = unitMember;
-        Outline classOutline = _newClassOutline(unitOutline, classDeclaration);
+        List<Outline> classContents = <Outline>[];
         for (ClassMember classMember in classDeclaration.members) {
           if (classMember is ConstructorDeclaration) {
             ConstructorDeclaration constructorDeclaration = classMember;
-            _newConstructorOutline(classOutline, constructorDeclaration);
+            classContents.add(_newConstructorOutline(constructorDeclaration));
           }
           if (classMember is FieldDeclaration) {
             FieldDeclaration fieldDeclaration = classMember;
@@ -48,16 +46,17 @@
               String fieldTypeName = fieldType != null ? fieldType.toSource() :
                   '';
               for (VariableDeclaration field in fields.variables) {
-                _newVariableOutline(classOutline, fieldTypeName,
-                    ElementKind.FIELD, field, fieldDeclaration.isStatic);
+                classContents.add(_newVariableOutline(fieldTypeName,
+                    ElementKind.FIELD, field, fieldDeclaration.isStatic));
               }
             }
           }
           if (classMember is MethodDeclaration) {
             MethodDeclaration methodDeclaration = classMember;
-            _newMethodOutline(classOutline, methodDeclaration);
+            classContents.add(_newMethodOutline(methodDeclaration));
           }
         }
+        unitContents.add(_newClassOutline(classDeclaration, classContents));
       }
       if (unitMember is TopLevelVariableDeclaration) {
         TopLevelVariableDeclaration fieldDeclaration = unitMember;
@@ -66,29 +65,32 @@
           TypeName fieldType = fields.type;
           String fieldTypeName = fieldType != null ? fieldType.toSource() : '';
           for (VariableDeclaration field in fields.variables) {
-            _newVariableOutline(unitOutline, fieldTypeName,
-                ElementKind.TOP_LEVEL_VARIABLE, field, false);
+            unitContents.add(_newVariableOutline(fieldTypeName,
+                ElementKind.TOP_LEVEL_VARIABLE, field, false));
           }
         }
       }
       if (unitMember is FunctionDeclaration) {
         FunctionDeclaration functionDeclaration = unitMember;
-        _newFunctionOutline(unitOutline, functionDeclaration, true);
+        unitContents.add(_newFunctionOutline(functionDeclaration, true));
       }
       if (unitMember is ClassTypeAlias) {
         ClassTypeAlias alias = unitMember;
-        _newClassTypeAlias(unitOutline, alias);
+        unitContents.add(_newClassTypeAlias(alias));
       }
       if (unitMember is FunctionTypeAlias) {
         FunctionTypeAlias alias = unitMember;
-        _newFunctionTypeAliasOutline(unitOutline, alias);
+        unitContents.add(_newFunctionTypeAliasOutline(alias));
       }
     }
+    Outline unitOutline = _newUnitOutline(unitContents);
     return unitOutline;
   }
 
-  void _addLocalFunctionOutlines(Outline parent, FunctionBody body) {
-    body.accept(new _LocalFunctionOutlinesVisitor(this, parent));
+  List<Outline> _addLocalFunctionOutlines(FunctionBody body) {
+    List<Outline> contents = <Outline>[];
+    body.accept(new _LocalFunctionOutlinesVisitor(this, contents));
+    return contents;
   }
 
   Location _getLocationNode(AstNode node) {
@@ -151,33 +153,33 @@
     return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd);
   }
 
-  Outline _newClassOutline(Outline parent, ClassDeclaration classDeclaration) {
+  Outline _newClassOutline(ClassDeclaration classDeclaration,
+      List<Outline> classContents) {
     SimpleIdentifier nameNode = classDeclaration.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
-    Element element = new Element(ElementKind.CLASS, name, _getLocationNode(
-        nameNode), Identifier.isPrivateName(name), _isDeprecated(classDeclaration),
-        isAbstract: classDeclaration.isAbstract);
-    Outline outline = new Outline(element, sourceRegion.offset,
-        sourceRegion.length);
-    parent.children.add(outline);
-    return outline;
+    Element element = new Element(ElementKind.CLASS, name,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(classDeclaration),
+            isAbstract: classDeclaration.isAbstract),
+        location: _getLocationNode(nameNode));
+    return new Outline(element, sourceRegion.offset,
+        sourceRegion.length, children: classContents);
   }
 
-  void _newClassTypeAlias(Outline parent, ClassTypeAlias alias) {
+  Outline _newClassTypeAlias(ClassTypeAlias alias) {
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(alias);
     Element element = new Element(ElementKind.CLASS_TYPE_ALIAS, name,
-        _getLocationNode(nameNode), Identifier.isPrivateName(name), _isDeprecated(
-        alias), isAbstract: alias.isAbstract);
-    Outline outline = new Outline(element, sourceRegion.offset,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(alias), isAbstract: alias.isAbstract),
+        location: _getLocationNode(nameNode));
+    return new Outline(element, sourceRegion.offset,
         sourceRegion.length);
-    parent.children.add(outline);
   }
 
-  void _newConstructorOutline(Outline parent,
-      ConstructorDeclaration constructor) {
+  Outline _newConstructorOutline(ConstructorDeclaration constructor) {
     Identifier returnType = constructor.returnType;
     String name = returnType.name;
     int offset = returnType.offset;
@@ -195,16 +197,17 @@
     FormalParameterList parameters = constructor.parameters;
     String parametersStr = parameters != null ? parameters.toSource() : '';
     Element element = new Element(ElementKind.CONSTRUCTOR, name,
-        _getLocationOffsetLength(offset, length), isPrivate, _isDeprecated(constructor),
+        Element.makeFlags(isPrivate: isPrivate,
+            isDeprecated: _isDeprecated(constructor)),
+        location: _getLocationOffsetLength(offset, length),
         parameters: parametersStr);
+    List<Outline> contents = _addLocalFunctionOutlines(constructor.body);
     Outline outline = new Outline(element, sourceRegion.offset,
-        sourceRegion.length);
-    parent.children.add(outline);
-    _addLocalFunctionOutlines(outline, constructor.body);
+        sourceRegion.length, children: contents);
+    return outline;
   }
 
-  void _newFunctionOutline(Outline parent, FunctionDeclaration function,
-      bool isStatic) {
+  Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) {
     TypeName returnType = function.returnType;
     SimpleIdentifier nameNode = function.name;
     String name = nameNode.name;
@@ -221,16 +224,18 @@
     _SourceRegion sourceRegion = _getSourceRegion(function);
     String parametersStr = parameters != null ? parameters.toSource() : '';
     String returnTypeStr = returnType != null ? returnType.toSource() : '';
-    Element element = new Element(kind, name, _getLocationNode(nameNode),
-        Identifier.isPrivateName(name), _isDeprecated(function), parameters:
-        parametersStr, returnType: returnTypeStr, isStatic: isStatic);
+    Element element = new Element(kind, name,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(function), isStatic: isStatic),
+        location: _getLocationNode(nameNode), parameters: parametersStr,
+        returnType: returnTypeStr);
+    List<Outline> contents = _addLocalFunctionOutlines(functionExpression.body);
     Outline outline = new Outline(element, sourceRegion.offset,
-        sourceRegion.length);
-    parent.children.add(outline);
-    _addLocalFunctionOutlines(outline, functionExpression.body);
+        sourceRegion.length, children: contents);
+    return outline;
   }
 
-  void _newFunctionTypeAliasOutline(Outline parent, FunctionTypeAlias alias) {
+  Outline _newFunctionTypeAliasOutline(FunctionTypeAlias alias) {
     TypeName returnType = alias.returnType;
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
@@ -239,14 +244,15 @@
     String parametersStr = parameters != null ? parameters.toSource() : '';
     String returnTypeStr = returnType != null ? returnType.toSource() : '';
     Element element = new Element(ElementKind.FUNCTION_TYPE_ALIAS, name,
-        _getLocationNode(nameNode), Identifier.isPrivateName(name), _isDeprecated(
-        alias), parameters: parametersStr, returnType: returnTypeStr);
-    Outline outline = new Outline(element, sourceRegion.offset,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(alias)),
+        location: _getLocationNode(nameNode), parameters: parametersStr,
+        returnType: returnTypeStr);
+    return new Outline(element, sourceRegion.offset,
         sourceRegion.length);
-    parent.children.add(outline);
   }
 
-  void _newMethodOutline(Outline parent, MethodDeclaration method) {
+  Outline _newMethodOutline(MethodDeclaration method) {
     TypeName returnType = method.returnType;
     SimpleIdentifier nameNode = method.name;
     String name = nameNode.name;
@@ -262,33 +268,38 @@
     _SourceRegion sourceRegion = _getSourceRegion(method);
     String parametersStr = parameters != null ? parameters.toSource() : '';
     String returnTypeStr = returnType != null ? returnType.toSource() : '';
-    Element element = new Element(kind, name, _getLocationNode(nameNode),
-        Identifier.isPrivateName(name), _isDeprecated(method), parameters:
-        parametersStr, returnType: returnTypeStr, isAbstract: method.isAbstract,
-        isStatic: method.isStatic);
+    Element element = new Element(kind, name,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(method), isAbstract: method.isAbstract,
+            isStatic: method.isStatic), location: _getLocationNode(nameNode),
+        parameters: parametersStr, returnType: returnTypeStr);
+    List<Outline> contents = _addLocalFunctionOutlines(method.body);
     Outline outline = new Outline(element, sourceRegion.offset,
-        sourceRegion.length);
-    parent.children.add(outline);
-    _addLocalFunctionOutlines(outline, method.body);
+        sourceRegion.length, children: contents);
+    return outline;
   }
 
-  Outline _newUnitOutline() {
+  Outline _newUnitOutline(List<Outline> unitContents) {
     Element element = new Element(ElementKind.COMPILATION_UNIT, '<unit>',
-        _getLocationNode(_unit), false, false);
-    return new Outline(element, _unit.offset, _unit.length);
+        Element.makeFlags(), location: _getLocationNode(_unit));
+    return new Outline(element, _unit.offset, _unit.length,
+        children: unitContents);
   }
 
-  void _newVariableOutline(Outline parent, String typeName, ElementKind kind,
+  Outline _newVariableOutline(String typeName, ElementKind kind,
       VariableDeclaration variable, bool isStatic) {
     SimpleIdentifier nameNode = variable.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(variable);
-    Element element = new Element(kind, name, _getLocationNode(nameNode),
-        Identifier.isPrivateName(name), _isDeprecated(variable), returnType: typeName,
-        isStatic: isStatic, isConst: variable.isConst, isFinal: variable.isFinal);
+    Element element = new Element(kind, name,
+        Element.makeFlags(isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(variable),
+            isStatic: isStatic, isConst: variable.isConst,
+            isFinal: variable.isFinal), location: _getLocationNode(nameNode),
+        returnType: typeName);
     Outline outline = new Outline(element, sourceRegion.offset,
         sourceRegion.length);
-    parent.children.add(outline);
+    return outline;
   }
 
   /**
@@ -302,74 +313,17 @@
 
 
 /**
- * An element outline.
- */
-class Outline implements HasToJson {
-  static const List<Outline> EMPTY_ARRAY = const <Outline>[];
-
-  /**
-   * The children of the node.
-   * The field will be omitted in JSON if the node has no children.
-   */
-  final List<Outline> children = <Outline>[];
-
-  /**
-   * A description of the element represented by this node.
-   */
-  final Element element;
-
-  /**
-   * The length of the element.
-   */
-  final int length;
-
-  /**
-   * The offset of the first character of the element.
-   */
-  final int offset;
-
-  Outline(this.element, this.offset, this.length);
-
-  factory Outline.fromJson(Map<String, Object> map) {
-    Element element = new Element.fromJson(map[ELEMENT]);
-    Outline outline = new Outline(element, map[OFFSET], map[LENGTH]);
-    // add children
-    List<Map<String, Object>> childrenMaps = map[CHILDREN];
-    if (childrenMaps != null) {
-      childrenMaps.forEach((childMap) {
-        outline.children.add(new Outline.fromJson(childMap));
-      });
-    }
-    // done
-    return outline;
-  }
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      ELEMENT: element.toJson(),
-      OFFSET: offset,
-      LENGTH: length
-    };
-    if (children.isNotEmpty) {
-      json[CHILDREN] = children.map((child) => child.toJson()).toList();
-    }
-    return json;
-  }
-}
-
-
-/**
  * A visitor for building local function outlines.
  */
 class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor {
   final DartUnitOutlineComputer outlineComputer;
-  final Outline parent;
+  final List<Outline> contents;
 
-  _LocalFunctionOutlinesVisitor(this.outlineComputer, this.parent);
+  _LocalFunctionOutlinesVisitor(this.outlineComputer, this.contents);
 
   @override
   visitFunctionDeclaration(FunctionDeclaration node) {
-    outlineComputer._newFunctionOutline(parent, node, false);
+    contents.add(outlineComputer._newFunctionOutline(node, false));
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index ad92386..674140b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -4,9 +4,7 @@
 
 library computer.overrides;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
 
@@ -44,7 +42,7 @@
         }
       }
     }
-    return _overrides.map((override) => override.toJson()).toList();
+    return _overrides;
   }
 
   void _addOverride(int offset, int length, String name) {
@@ -68,12 +66,14 @@
     // is there any override?
     if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
       OverriddenMember superMember = superEngineElement != null ?
-          OverriddenMember.fromEngine(superEngineElement) :
+          new OverriddenMember.fromEngine(superEngineElement) :
           null;
       List<OverriddenMember> interfaceMembers =
-          interfaceEngineElements.map(OverriddenMember.fromEngine).toList();
+          interfaceEngineElements.map((engine.Element member) =>
+              new OverriddenMember.fromEngine(member)).toList();
       _overrides.add(
-          new Override(offset, length, superMember, interfaceMembers));
+          new Override(offset, length, superclassMember: superMember,
+              interfaceMembers: interfaceMembers));
     }
   }
 
@@ -102,84 +102,3 @@
     return null;
   }
 }
-
-
-class OverriddenMember implements HasToJson {
-  final Element element;
-  final String className;
-
-  OverriddenMember(this.element, this.className);
-
-  Map<String, Object> toJson() {
-    return {
-      ELEMENT: element.toJson(),
-      CLASS_NAME: className
-    };
-  }
-
-  @override
-  String toString() => toJson().toString();
-
-  static OverriddenMember fromEngine(engine.Element member) {
-    Element element = new Element.fromEngine(member);
-    String className = member.enclosingElement.displayName;
-    return new OverriddenMember(element, className);
-  }
-
-  static OverriddenMember fromJson(Map<String, Object> json) {
-    Map<String, Object> elementJson = json[ELEMENT];
-    Element element = new Element.fromJson(elementJson);
-    String className = json[CLASS_NAME];
-    return new OverriddenMember(element, className);
-  }
-}
-
-
-class Override implements HasToJson {
-  final int offset;
-  final int length;
-  final OverriddenMember superclassMember;
-  final List<OverriddenMember> interfaceMembers;
-
-  Override(this.offset, this.length, this.superclassMember,
-      this.interfaceMembers);
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = <String, Object>{};
-    json[OFFSET] = offset;
-    json[LENGTH] = length;
-    if (superclassMember != null) {
-      json[SUPER_CLASS_MEMBER] = superclassMember.toJson();
-    }
-    if (interfaceMembers != null && interfaceMembers.isNotEmpty) {
-      json[INTERFACE_MEMBERS] = objectToJson(interfaceMembers);
-    }
-    return json;
-  }
-
-  @override
-  String toString() => toJson().toString();
-
-  static Override fromJson(Map<String, Object> map) {
-    int offset = map[OFFSET];
-    int length = map[LENGTH];
-    // super
-    OverriddenMember superclassMember = null;
-    {
-      Map<String, Object> superJson = map[SUPER_CLASS_MEMBER];
-      if (superJson != null) {
-        superclassMember = OverriddenMember.fromJson(superJson);
-      }
-    }
-    // interfaces
-    List<OverriddenMember> interfaceElements = null;
-    {
-      List<Map<String, Object>> jsonList = map[INTERFACE_MEMBERS];
-      if (jsonList != null) {
-        interfaceElements = jsonList.map(OverriddenMember.fromJson).toList();
-      }
-    }
-    // done
-    return new Override(offset, length, superclassMember, interfaceElements);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
index 4ccca7f..f61e631 100644
--- a/pkg/analysis_server/lib/src/computer/element.dart
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -4,9 +4,8 @@
 
 library computer.element;
 
-import 'package:analysis_services/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 
 
@@ -18,388 +17,100 @@
 }
 
 
-/**
- * Information about an element.
- */
-class Element {
-  static const List<Element> EMPTY_ARRAY = const <Element>[];
-
-  static const int FLAG_ABSTRACT = 0x01;
-  static const int FLAG_CONST = 0x02;
-  static const int FLAG_FINAL = 0x04;
-  static const int FLAG_STATIC = 0x08;
-  static const int FLAG_PRIVATE = 0x10;
-  static const int FLAG_DEPRECATED = 0x20;
-
-  /**
-   * The kind of the element.
-   */
-  final ElementKind kind;
-
-  /**
-   * The name of the element. This is typically used as the label in the outline.
-   */
-  final String name;
-
-  /**
-   * The location of the element.
-   */
-  final Location location;
-
-  /**
-   * The parameter list for the element.
-   * If the element is not a method or function then `null`.
-   * If the element has zero parameters, then `()`.
-   */
-  final String parameters;
-
-  /**
-   * The return type of the element.
-   * If the element is not a method or function then `null`.
-   * If the element does not have a declared return type, then an empty string.
-   */
-  final String returnType;
-
-  final bool isAbstract;
-  final bool isConst;
-  final bool isFinal;
-  final bool isStatic;
-  final bool isPrivate;
-  final bool isDeprecated;
-
-  Element(this.kind, this.name, this.location, this.isPrivate,
-      this.isDeprecated, {this.parameters, this.returnType, this.isAbstract: false,
-      this.isConst: false, this.isFinal: false, this.isStatic: false});
-
-  factory Element.fromEngine(engine.Element element) {
-    String name = element.displayName;
-    String elementParameters = _getParametersString(element);
-    String elementReturnType = _getReturnTypeString(element);
-    return new Element(
-        ElementKind.valueOfEngine(element.kind),
-        name,
-        new Location.fromElement(element),
-        element.isPrivate,
-        element.isDeprecated,
-        parameters: elementParameters,
-        returnType: elementReturnType,
+Element elementFromEngine(engine.Element element) {
+  String name = element.displayName;
+  String elementParameters = _getParametersString(element);
+  String elementReturnType = _getReturnTypeString(element);
+  return new Element(
+    new ElementKind.fromEngine(element.kind),
+    name,
+    Element.makeFlags(isPrivate: element.isPrivate,
+        isDeprecated: element.isDeprecated,
         isAbstract: _isAbstract(element),
         isConst: _isConst(element),
         isFinal: _isFinal(element),
-        isStatic: _isStatic(element));
-  }
+        isStatic: _isStatic(element)),
+    location: new Location.fromElement(element),
+    parameters: elementParameters,
+    returnType: elementReturnType);
+}
 
-  factory Element.fromJson(Map<String, Object> map) {
-    ElementKind kind = ElementKind.valueOf(map[KIND]);
-    int flags = map[FLAGS];
-    return new Element(
-        kind,
-        map[NAME],
-        new Location.fromJson(map[LOCATION]),
-        _hasFlag(flags, FLAG_PRIVATE),
-        _hasFlag(flags, FLAG_DEPRECATED),
-        parameters: map[PARAMETERS],
-        returnType: map[RETURN_TYPE],
-        isAbstract: _hasFlag(flags, FLAG_ABSTRACT),
-        isConst: _hasFlag(flags, FLAG_CONST),
-        isFinal: _hasFlag(flags, FLAG_FINAL),
-        isStatic: _hasFlag(flags, FLAG_STATIC));
-  }
-
-  int get flags {
-    int flags = 0;
-    if (isAbstract) flags |= FLAG_ABSTRACT;
-    if (isConst) flags |= FLAG_CONST;
-    if (isFinal) flags |= FLAG_FINAL;
-    if (isStatic) flags |= FLAG_STATIC;
-    if (isPrivate) flags |= FLAG_PRIVATE;
-    if (isDeprecated) flags |= FLAG_DEPRECATED;
-    return flags;
-  }
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      KIND: kind.name,
-      NAME: name,
-      LOCATION: location.toJson(),
-      FLAGS: flags
-    };
-    if (parameters != null) {
-      json[PARAMETERS] = parameters;
-    }
-    if (returnType != null) {
-      json[RETURN_TYPE] = returnType;
-    }
-    return json;
-  }
-
-  @override
-  String toString() => toJson().toString();
-
-  static Map<String, Object> asJson(Element element) {
-    return element.toJson();
-  }
-
-  static String _getParametersString(engine.Element element) {
-    // TODO(scheglov) expose the corresponding feature from ExecutableElement
-    if (element is engine.ExecutableElement) {
-      var sb = new StringBuffer();
-      String closeOptionalString = '';
-      for (var parameter in element.parameters) {
-        if (sb.isNotEmpty) {
-          sb.write(', ');
-        }
-        if (closeOptionalString.isEmpty) {
-          if (parameter.kind == engine.ParameterKind.NAMED) {
-            sb.write('{');
-            closeOptionalString = '}';
-          }
-          if (parameter.kind == engine.ParameterKind.POSITIONAL) {
-            sb.write('[');
-            closeOptionalString = ']';
-          }
-        }
-        sb.write(parameter.toString());
+String _getParametersString(engine.Element element) {
+  // TODO(scheglov) expose the corresponding feature from ExecutableElement
+  if (element is engine.ExecutableElement) {
+    var sb = new StringBuffer();
+    String closeOptionalString = '';
+    for (var parameter in element.parameters) {
+      if (sb.isNotEmpty) {
+        sb.write(', ');
       }
-      sb.write(closeOptionalString);
-      return '(' + sb.toString() + ')';
-    } else {
-      return null;
+      if (closeOptionalString.isEmpty) {
+        if (parameter.kind == engine.ParameterKind.NAMED) {
+          sb.write('{');
+          closeOptionalString = '}';
+        }
+        if (parameter.kind == engine.ParameterKind.POSITIONAL) {
+          sb.write('[');
+          closeOptionalString = ']';
+        }
+      }
+      sb.write(parameter.toString());
     }
-  }
-
-  static String _getReturnTypeString(engine.Element element) {
-    if ((element is engine.ExecutableElement)) {
-      return element.returnType.toString();
-    } else {
-      return null;
-    }
-  }
-
-  static bool _hasFlag(int flags, int flag) => (flags & flag) != 0;
-
-  static bool _isAbstract(engine.Element element) {
-    // TODO(scheglov) add isAbstract to Element API
-    if (element is engine.ClassElement) {
-      return element.isAbstract;
-    }
-    if (element is engine.MethodElement) {
-      return element.isAbstract;
-    }
-    if (element is engine.PropertyAccessorElement) {
-      return element.isAbstract;
-    }
-    return false;
-  }
-
-  static bool _isConst(engine.Element element) {
-    // TODO(scheglov) add isConst to Element API
-    if (element is engine.ConstructorElement) {
-      return element.isConst;
-    }
-    if (element is engine.VariableElement) {
-      return element.isConst;
-    }
-    return false;
-  }
-
-  static bool _isFinal(engine.Element element) {
-    // TODO(scheglov) add isFinal to Element API
-    if (element is engine.VariableElement) {
-      return element.isFinal;
-    }
-    return false;
-  }
-
-  static bool _isStatic(engine.Element element) {
-    // TODO(scheglov) add isStatic to Element API
-    if (element is engine.ExecutableElement) {
-      return element.isStatic;
-    }
-    if (element is engine.PropertyInducingElement) {
-      return element.isStatic;
-    }
-    return false;
+    sb.write(closeOptionalString);
+    return '(' + sb.toString() + ')';
+  } else {
+    return null;
   }
 }
 
-
-/**
- * An enumeration of the kinds of elements.
- */
-class ElementKind {
-  static const CLASS = const ElementKind('CLASS');
-  static const CLASS_TYPE_ALIAS = const ElementKind('CLASS_TYPE_ALIAS');
-  static const COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT');
-  static const CONSTRUCTOR = const ElementKind('CONSTRUCTOR');
-  static const FIELD = const ElementKind('FIELD');
-  static const FUNCTION = const ElementKind('FUNCTION');
-  static const FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS');
-  static const GETTER = const ElementKind('GETTER');
-  static const LIBRARY = const ElementKind('LIBRARY');
-  static const LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE');
-  static const METHOD = const ElementKind('METHOD');
-  static const PARAMETER = const ElementKind('PARAMETER');
-  static const SETTER = const ElementKind('SETTER');
-  static const TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE');
-  static const TYPE_PARAMETER = const ElementKind('TYPE_PARAMETER');
-  static const UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE');
-  static const UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP');
-  static const UNKNOWN = const ElementKind('UNKNOWN');
-
-  final String name;
-
-  const ElementKind(this.name);
-
-  @override
-  String toString() => name;
-
-  static ElementKind valueOf(String name) {
-    if (CLASS.name == name) return CLASS;
-    if (CLASS_TYPE_ALIAS.name == name) return CLASS_TYPE_ALIAS;
-    if (COMPILATION_UNIT.name == name) return COMPILATION_UNIT;
-    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
-    if (FIELD.name == name) return FIELD;
-    if (FUNCTION.name == name) return FUNCTION;
-    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
-    if (GETTER.name == name) return GETTER;
-    if (LIBRARY.name == name) return LIBRARY;
-    if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
-    if (METHOD.name == name) return METHOD;
-    if (PARAMETER.name == name) return PARAMETER;
-    if (SETTER.name == name) return SETTER;
-    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
-    if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER;
-    if (UNIT_TEST_CASE.name == name) return UNIT_TEST_CASE;
-    if (UNIT_TEST_GROUP.name == name) return UNIT_TEST_GROUP;
-    if (UNKNOWN.name == name) return UNKNOWN;
-    throw new ArgumentError('Unknown ElementKind: $name');
-  }
-
-  static ElementKind valueOfEngine(engine.ElementKind kind) {
-    if (kind == engine.ElementKind.CLASS) {
-      return CLASS;
-    }
-    if (kind == engine.ElementKind.COMPILATION_UNIT) {
-      return COMPILATION_UNIT;
-    }
-    if (kind == engine.ElementKind.CONSTRUCTOR) {
-      return CONSTRUCTOR;
-    }
-    if (kind == engine.ElementKind.FIELD) {
-      return FIELD;
-    }
-    if (kind == engine.ElementKind.FUNCTION) {
-      return FUNCTION;
-    }
-    if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) {
-      return FUNCTION_TYPE_ALIAS;
-    }
-    if (kind == engine.ElementKind.GETTER) {
-      return GETTER;
-    }
-    if (kind == engine.ElementKind.LIBRARY) {
-      return LIBRARY;
-    }
-    if (kind == engine.ElementKind.LOCAL_VARIABLE) {
-      return LOCAL_VARIABLE;
-    }
-    if (kind == engine.ElementKind.METHOD) {
-      return METHOD;
-    }
-    if (kind == engine.ElementKind.PARAMETER) {
-      return PARAMETER;
-    }
-    if (kind == engine.ElementKind.SETTER) {
-      return SETTER;
-    }
-    if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) {
-      return TOP_LEVEL_VARIABLE;
-    }
-    if (kind == engine.ElementKind.TYPE_PARAMETER) {
-      return TYPE_PARAMETER;
-    }
-    return UNKNOWN;
+String _getReturnTypeString(engine.Element element) {
+  if ((element is engine.ExecutableElement)) {
+    return element.returnType.toString();
+  } else {
+    return null;
   }
 }
 
-
-/**
- * Information about a location.
- */
-class Location {
-  final String file;
-  final int offset;
-  final int length;
-  final int startLine;
-  final int startColumn;
-
-  Location(this.file, this.offset, this.length, this.startLine,
-      this.startColumn);
-
-  factory Location.fromElement(engine.Element element) {
-    Source source = element.source;
-    LineInfo lineInfo = element.context.getLineInfo(source);
-    String name = element.displayName;
-    // prepare location
-    int offset = element.nameOffset;
-    int length = name != null ? name.length : 0;
-    LineInfo_Location lineLocation = lineInfo.getLocation(offset);
-    int startLine = lineLocation.lineNumber;
-    int startColumn = lineLocation.columnNumber;
-    if (element is engine.CompilationUnitElement) {
-      offset = 0;
-      length = 0;
-      startLine = 1;
-      startColumn = 1;
-    }
-    // done
-    return new Location(
-        source.fullName,
-        offset,
-        length,
-        startLine,
-        startColumn);
+bool _isAbstract(engine.Element element) {
+  // TODO(scheglov) add isAbstract to Element API
+  if (element is engine.ClassElement) {
+    return element.isAbstract;
   }
-
-  factory Location.fromJson(Map<String, Object> map) {
-    return new Location(
-        map[FILE],
-        map[OFFSET],
-        map[LENGTH],
-        map[START_LINE],
-        map[START_COLUMN]);
+  if (element is engine.MethodElement) {
+    return element.isAbstract;
   }
-
-  factory Location.fromOffset(engine.Element element, int offset, int length) {
-    Source source = element.source;
-    LineInfo lineInfo = element.context.getLineInfo(source);
-    // prepare location
-    LineInfo_Location lineLocation = lineInfo.getLocation(offset);
-    int startLine = lineLocation.lineNumber;
-    int startColumn = lineLocation.columnNumber;
-    // done
-    return new Location(
-        source.fullName,
-        offset,
-        length,
-        startLine,
-        startColumn);
+  if (element is engine.PropertyAccessorElement) {
+    return element.isAbstract;
   }
+  return false;
+}
 
-  Map<String, Object> toJson() {
-    return {
-      FILE: file,
-      OFFSET: offset,
-      LENGTH: length,
-      START_LINE: startLine,
-      START_COLUMN: startColumn
-    };
+bool _isConst(engine.Element element) {
+  // TODO(scheglov) add isConst to Element API
+  if (element is engine.ConstructorElement) {
+    return element.isConst;
   }
+  if (element is engine.VariableElement) {
+    return element.isConst;
+  }
+  return false;
+}
 
-  @override
-  String toString() {
-    return 'Location(file=$file; offset=$offset; length=$length; '
-        'startLine=$startLine; startColumn=$startColumn)';
+bool _isFinal(engine.Element element) {
+  // TODO(scheglov) add isFinal to Element API
+  if (element is engine.VariableElement) {
+    return element.isFinal;
   }
+  return false;
+}
+
+bool _isStatic(engine.Element element) {
+  // TODO(scheglov) add isStatic to Element API
+  if (element is engine.ExecutableElement) {
+    return element.isStatic;
+  }
+  if (element is engine.PropertyInducingElement) {
+    return element.isStatic;
+  }
+  return false;
 }
diff --git a/pkg/analysis_server/lib/src/computer/error.dart b/pkg/analysis_server/lib/src/computer/error.dart
index 21960c5..11f6d68 100644
--- a/pkg/analysis_server/lib/src/computer/error.dart
+++ b/pkg/analysis_server/lib/src/computer/error.dart
@@ -4,9 +4,7 @@
 
 library computer.error;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/error.dart' as engine;
 import 'package:analyzer/src/generated/source.dart' as engine;
@@ -15,90 +13,9 @@
 /**
  * Returns a JSON correponding to the given list of Engine errors.
  */
-List<Map<String, Object>> engineErrorInfoToJson(engine.AnalysisErrorInfo info) {
-  return engineErrorsToJson(info.lineInfo, info.errors);
-}
-
-
-/**
- * Returns a JSON correponding to the given list of Engine errors.
- */
 List<Map<String, Object>> engineErrorsToJson(engine.LineInfo lineInfo,
     List<engine.AnalysisError> errors) {
   return errors.map((engine.AnalysisError error) {
     return new AnalysisError.fromEngine(lineInfo, error).toJson();
   }).toList();
 }
-
-
-/**
- * An indication of an error, warning, or hint that was produced by the
- * analysis. 
- */
-class AnalysisError implements HasToJson {
-  final String severity;
-  final String type;
-  final Location location;
-  final String message;
-  final String correction;
-
-  AnalysisError(this.severity, this.type, this.location, this.message,
-      this.correction);
-
-  factory AnalysisError.fromEngine(engine.LineInfo lineInfo,
-      engine.AnalysisError error) {
-    engine.ErrorCode errorCode = error.errorCode;
-    // prepare location
-    Location location;
-    {
-      String file = error.source.fullName;
-      int offset = error.offset;
-      int length = error.length;
-      int startLine = -1;
-      int startColumn = -1;
-      if (lineInfo != null) {
-        engine.LineInfo_Location lineLocation = lineInfo.getLocation(offset);
-        if (lineLocation != null) {
-          startLine = lineLocation.lineNumber;
-          startColumn = lineLocation.columnNumber;
-        }
-      }
-      location = new Location(file, offset, length, startLine, startColumn);
-    }
-    // done
-    String severity = errorCode.errorSeverity.toString();
-    String type = errorCode.type.toString();
-    String message = error.message;
-    String correction = error.correction;
-    return new AnalysisError(severity, type, location, message, correction);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      SEVERITY: severity,
-      TYPE: type,
-      LOCATION: location.toJson(),
-      MESSAGE: message
-    };
-    if (correction != null) {
-      json[CORRECTION] = correction;
-    }
-    return json;
-  }
-
-  @override
-  String toString() {
-    return 'AnalysisError(location=$location message=$message; '
-        'severity=$severity; type=$type; correction=$correction';
-  }
-
-  static AnalysisError fromJson(Map<String, Object> json) {
-    return new AnalysisError(
-        json[SEVERITY],
-        json[TYPE],
-        new Location.fromJson(json[LOCATION]),
-        json[MESSAGE],
-        json[CORRECTION]);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 30067ff..3a53fc4 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -68,13 +68,10 @@
 //
 // Edit methods
 //
-const String EDIT_APPLY_REFACTORING = 'edit.applyRefactoring';
-const String EDIT_CREATE_REFACTORING = 'edit.createRefactoring';
-const String EDIT_DELETE_REFACTORING = 'edit.deleteRefactoring';
 const String EDIT_GET_ASSISTS = 'edit.getAssists';
+const String EDIT_GET_AVAILABLE_REFACTORINGS = 'edit.getAvailableRefactorings';
 const String EDIT_GET_FIXES = 'edit.getFixes';
-const String EDIT_GET_REFACTORINGS = 'edit.getRefactorings';
-const String EDIT_SET_REFACTORING_OPTIONS = 'edit.setRefactoringOptions';
+const String EDIT_GET_REFACTORING = 'edit.getRefactoring';
 
 //
 // Analysis option names
@@ -86,3 +83,94 @@
 const String ENABLE_ENUMS = 'enableEnums'; // boolean
 const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints'; // boolean
 const String GENERATE_HINTS = 'generateHints'; // boolean
+
+//
+// Property names
+//
+const String ADD = 'add';
+const String ADDED = 'added';
+const String ASSISTS = 'assists';
+const String CHANGE = 'change';
+const String CHILDREN = 'children';
+const String CLASS_ELEMENT = 'classElement';
+const String CLASS_NAME = 'className';
+const String COMPLETION = 'completion';
+const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
+const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
+const String CONTENT = 'content';
+const String CORRECTION = 'correction';
+const String DART_DOC = 'dartdoc';
+const String DEFAULT = 'default';
+const String DISPLAY_NAME = 'displayName';
+const String EDITS = 'edits';
+const String ELEMENT = 'element';
+const String ELEMENT_DESCRIPTION = 'elementDescription';
+const String ELEMENT_KIND = 'elementKind';
+const String EXCLUDED = 'excluded';
+const String ERROR = 'error';
+const String ERRORS = 'errors';
+const String FATAL = 'fatal';
+const String FILE = 'file';
+const String FILES = 'files';
+const String FIXES = 'fixes';
+const String FLAGS = 'flags';
+const String HIERARCHY_ITEMS = 'hierarchyItems';
+const String HOVERS = 'hovers';
+const String ID = 'id';
+const String INCLUDE_POTENTIAL = 'includePotential';
+const String INCLUDED = 'included';
+const String INTERFACE_MEMBERS = 'interfaceMembers';
+const String INTERFACES = 'interfaces';
+const String IS_ABSTRACT = 'isAbstract';
+const String IS_DEPRECATED = 'isDeprecated';
+const String IS_POTENTIAL = 'isPotential';
+const String IS_STATIC = 'isStatic';
+const String KIND = 'kind';
+const String KINDS = 'kinds';
+const String LAST = 'last';
+const String LENGTH = 'length';
+const String LINKED_EDIT_GROUPS = 'linkedEditGroups';
+const String LOCATION = 'location';
+const String MEMBER_ELEMENT = 'memberElement';
+const String MESSAGE = 'message';
+const String MIXINS = 'mixins';
+const String NAME = 'name';
+const String OCCURRENCES = 'occurrences';
+const String OFFSET = 'offset';
+const String OFFSETS = 'offsets';
+const String OPTIONS = 'options';
+const String OUTLINE = 'outline';
+const String OVERRIDES = 'overrides';
+const String PARAMETER = 'parameter';
+const String PARAMETERS = 'parameters';
+const String PATH = 'path';
+const String PATTERN = 'pattern';
+const String POSITIONS = 'positions';
+const String PROPAGATED_TYPE = 'propagatedType';
+const String REFACTORINGS = 'refactorings';
+const String REGIONS = 'regions';
+const String RELEVANCE = 'relevance';
+const String REMOVE = 'remove';
+const String REMOVED = 'removed';
+const String REPLACEMENT = 'replacement';
+const String REPLACEMENT_OFFSET = 'replacementOffset';
+const String REPLACEMENT_LENGTH = 'replacementLength';
+const String RETURN_TYPE = 'returnType';
+const String RESULTS = 'results';
+const String SELECTION = 'selection';
+const String SEVERITY = 'severity';
+const String SELECTION_LENGTH = 'selectionLength';
+const String SELECTION_OFFSET = 'selectionOffset';
+const String STACK_TRACE = 'stackTrace';
+const String START_COLUMN = 'startColumn';
+const String START_LINE = 'startLine';
+const String STATIC_TYPE = 'staticType';
+const String SUBCLASSES = 'subclasses';
+const String SUBSCRIPTIONS = 'subscriptions';
+const String SUGGESTIONS = 'suggestions';
+const String SUPERCLASS = 'superclass';
+const String SUPER_CLASS_MEMBER = 'superclassMember';
+const String TARGETS = 'targets';
+const String TYPE = 'type';
+const String VALUE = 'value';
+const String VERSION = 'version';
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 32a72d3..ee538e0 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -4,16 +4,12 @@
 
 library domain.analysis;
 
-import 'dart:collection';
-
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/computer/computer_hover.dart';
-import 'package:analysis_server/src/computer/error.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/engine.dart' as engine;
 
 
 /**
@@ -35,25 +31,26 @@
    * Implement the `analysis.getErrors` request.
    */
   Response getErrors(Request request) {
-    String file = request.getRequiredParameter(FILE).asString();
+    String file = new AnalysisGetErrorsParams.fromRequest(request).file;
     server.onFileAnalysisComplete(file).then((_) {
-      Response response = new Response(request.id);
-      AnalysisErrorInfo errorInfo = server.getErrors(file);
+      engine.AnalysisErrorInfo errorInfo = server.getErrors(file);
+      List<AnalysisError> errors;
       if (errorInfo == null) {
-        response.setResult(ERRORS, []);
+        errors = [];
       } else {
-        response.setResult(ERRORS, engineErrorInfoToJson(errorInfo));
+        errors = AnalysisError.listFromEngine(errorInfo.lineInfo,
+            errorInfo.errors);
       }
-      server.sendResponse(response);
+      server.sendResponse(new AnalysisGetErrorsResult(errors).toResponse(
+          request.id));
     }).catchError((message) {
       if (message is! String) {
-        AnalysisEngine.instance.logger.logError(
+        engine.AnalysisEngine.instance.logger.logError(
             'Illegal error message during getErrors: $message');
         message = '';
       }
-      Response response = new Response.getErrorsError(request, message);
-      response.setResult(ERRORS, []);
-      server.sendResponse(response);
+      server.sendResponse(new Response.getErrorsError(request, message,
+          new AnalysisGetErrorsResult([]).toJson()));
     });
     // delay response
     return Response.DELAYED_RESPONSE;
@@ -64,22 +61,20 @@
    */
   Response getHover(Request request) {
     // prepare parameters
-    String file = request.getRequiredParameter(FILE).asString();
-    int offset = request.getRequiredParameter(OFFSET).asInt();
+    var params = new AnalysisGetHoverParams.fromRequest(request);
     // prepare hovers
-    List<Hover> hovers = <Hover>[];
-    List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
+    List<HoverInformation> hovers = <HoverInformation>[];
+    List<CompilationUnit> units =
+        server.getResolvedCompilationUnits(params.file);
     for (CompilationUnit unit in units) {
-      Hover hoverInformation =
-          new DartUnitHoverComputer(unit, offset).compute();
+      HoverInformation hoverInformation =
+          new DartUnitHoverComputer(unit, params.offset).compute();
       if (hoverInformation != null) {
         hovers.add(hoverInformation);
       }
     }
     // send response
-    Response response = new Response(request.id);
-    response.setResult(HOVERS, hovers);
-    return response;
+    return new AnalysisGetHoverResult(hovers).toResponse(request.id);
   }
 
   @override
@@ -111,82 +106,41 @@
    * Implement the 'analysis.setAnalysisRoots' request.
    */
   Response setAnalysisRoots(Request request) {
-    // included
-    RequestDatum includedDatum = request.getRequiredParameter(INCLUDED);
-    List<String> includedPaths = includedDatum.asStringList();
-    // excluded
-    RequestDatum excludedDatum = request.getRequiredParameter(EXCLUDED);
-    List<String> excludedPaths = excludedDatum.asStringList();
+    var params = new AnalysisSetAnalysisRootsParams.fromRequest(request);
     // continue in server
-    server.setAnalysisRoots(request.id, includedPaths, excludedPaths);
-    return new Response(request.id);
+    server.setAnalysisRoots(request.id, params.included, params.excluded);
+    return new AnalysisSetAnalysisRootsResult().toResponse(request.id);
   }
 
   /**
    * Implement the 'analysis.setPriorityFiles' request.
    */
   Response setPriorityFiles(Request request) {
-    // files
-    RequestDatum filesDatum = request.getRequiredParameter(FILES);
-    List<String> files = filesDatum.asStringList();
-    server.setPriorityFiles(request, files);
-    return new Response(request.id);
+    var params = new AnalysisSetPriorityFilesParams.fromRequest(request);
+    server.setPriorityFiles(request, params.files);
+    return new AnalysisSetPriorityFilesResult().toResponse(request.id);
   }
 
   /**
    * Implement the 'analysis.setSubscriptions' request.
    */
   Response setSubscriptions(Request request) {
+    var params = new AnalysisSetSubscriptionsParams.fromRequest(request);
     // parse subscriptions
-    Map<AnalysisService, Set<String>> subMap;
-    {
-      RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS);
-      Map<String, List<String>> subStringMap = subDatum.asStringListMap();
-      subMap = new HashMap<AnalysisService, Set<String>>();
-      subStringMap.forEach((String serviceName, List<String> paths) {
-        AnalysisService service =
-            Enum2.valueOf(AnalysisService.VALUES, serviceName);
-        if (service == null) {
-          throw new RequestFailure(
-              new Response.unknownAnalysisService(request, serviceName));
-        }
-        subMap[service] = new HashSet.from(paths);
-      });
-    }
+    Map<AnalysisService, Set<String>> subMap =
+        mapMap(params.subscriptions, valueCallback:
+          (List<String> subscriptions) => subscriptions.toSet());
     server.setAnalysisSubscriptions(subMap);
-    return new Response(request.id);
+    return new AnalysisSetSubscriptionsResult().toResponse(request.id);
   }
 
   /**
    * Implement the 'analysis.updateContent' request.
    */
   Response updateContent(Request request) {
-    var changes = new HashMap<String, ContentChange>();
-    RequestDatum filesDatum = request.getRequiredParameter(FILES);
-    for (String file in filesDatum.keys) {
-      RequestDatum changeDatum = filesDatum[file];
-      ContentChange change = new ContentChange();
-      switch (changeDatum[TYPE].asString()) {
-        case ADD:
-          change.contentOrReplacement = changeDatum[CONTENT].asString();
-          break;
-        case CHANGE:
-          change.offset = changeDatum[OFFSET].asInt();
-          change.length = changeDatum[LENGTH].asInt();
-          change.contentOrReplacement = changeDatum[REPLACEMENT].asString();
-          break;
-        case REMOVE:
-          break;
-        default:
-          return new Response.invalidParameter(
-              request,
-              changeDatum[TYPE].path,
-              'be one of "add", "change", or "remove"');
-      }
-      changes[file] = change;
-    }
-    server.updateContent(changes);
-    return new Response(request.id);
+    var params = new AnalysisUpdateContentParams.fromRequest(request);
+    server.updateContent(params.files);
+    return new AnalysisUpdateContentResult().toResponse(request.id);
   }
 
   /**
@@ -194,70 +148,46 @@
    */
   Response updateOptions(Request request) {
     // options
-    RequestDatum optionsDatum = request.getRequiredParameter(OPTIONS);
+    var params = new AnalysisUpdateOptionsParams.fromRequest(request);
+    AnalysisOptions newOptions = params.options;
     List<OptionUpdater> updaters = new List<OptionUpdater>();
-    optionsDatum.forEachMap((String optionName, RequestDatum optionDatum) {
-      if (optionName == ANALYZE_ANGULAR) {
-        bool optionValue = optionDatum.asBool();
-        updaters.add((AnalysisOptionsImpl options) {
-          options.analyzeAngular = optionValue;
-        });
-      } else if (optionName == ANALYZE_POLYMER) {
-        bool optionValue = optionDatum.asBool();
-        updaters.add((AnalysisOptionsImpl options) {
-          options.analyzePolymer = optionValue;
-        });
-      } else if (optionName == ENABLE_ASYNC) {
-        // TODO(brianwilkerson) Uncomment this when the option is supported.
-//        bool optionValue = optionDatum.asBool();
-//        updaters.add((AnalysisOptionsImpl options) {
-//          options.enableAsync = optionValue;
-//        });
-      } else if (optionName == ENABLE_DEFERRED_LOADING) {
-        bool optionValue = optionDatum.asBool();
-        updaters.add((AnalysisOptionsImpl options) {
-          options.enableDeferredLoading = optionValue;
-        });
-      } else if (optionName == ENABLE_ENUMS) {
-        // TODO(brianwilkerson) Uncomment this when the option is supported.
-//        bool optionValue = optionDatum.asBool();
-//        updaters.add((AnalysisOptionsImpl options) {
-//          options.enableEnums = optionValue;
-//        });
-      } else if (optionName == GENERATE_DART2JS_HINTS) {
-        bool optionValue = optionDatum.asBool();
-        updaters.add((AnalysisOptionsImpl options) {
-          options.dart2jsHint = optionValue;
-        });
-      } else if (optionName == GENERATE_HINTS) {
-        bool optionValue = optionDatum.asBool();
-        updaters.add((AnalysisOptionsImpl options) {
-          options.hint = optionValue;
-        });
-      } else {
-        throw new RequestFailure(
-            new Response.unknownOptionName(request, optionName));
-      }
-    });
+    // TODO(paulberry): analyzeAngular and analyzePolymer are not in the API.
+//    if (newOptions.analyzeAngular != null) {
+//      updaters.add((engine.AnalysisOptionsImpl options) {
+//        options.analyzeAngular = newOptions.analyzeAngular;
+//      });
+//    }
+//    if (newOptions.analyzePolymer != null) {
+//      updaters.add((engine.AnalysisOptionsImpl options) {
+//        options.analyzePolymer = newOptions.analyzePolymer;
+//      });
+//    }
+    if (newOptions.enableAsync != null) {
+      updaters.add((engine.AnalysisOptionsImpl options) {
+        options.enableAsync = newOptions.enableAsync;
+      });
+    }
+    if (newOptions.enableDeferredLoading != null) {
+      updaters.add((engine.AnalysisOptionsImpl options) {
+        options.enableDeferredLoading = newOptions.enableDeferredLoading;
+      });
+    }
+    if (newOptions.enableEnums != null) {
+      updaters.add((engine.AnalysisOptionsImpl options) {
+        options.enableEnum = newOptions.enableEnums;
+      });
+    }
+    if (newOptions.generateDart2jsHints != null) {
+      updaters.add((engine.AnalysisOptionsImpl options) {
+        options.dart2jsHint = newOptions.generateDart2jsHints;
+      });
+    }
+    if (newOptions.generateHints != null) {
+      updaters.add((engine.AnalysisOptionsImpl options) {
+        options.hint = newOptions.generateHints;
+      });
+    }
     server.updateOptions(updaters);
-    return new Response(request.id);
+    return new AnalysisUpdateOptionsResult().toResponse(request.id);
   }
 }
-
-
-/**
- * A description of the change to the content of a file.
- */
-class ContentChange {
-  /**
-   * If [offset] and [length] are null, the full content of the file (or null
-   * if the file should be read from the filesystem).
-   *
-   * If [offset] and [length] are non-null, the replacement text which should
-   * take the place of the [length] characters of the file starting at [offset].
-   */
-  String contentOrReplacement;
-
-  int offset;
-  int length;
-}
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index e6c9f41..f70a1e9 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -7,9 +7,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/constants.dart';
+import 'package:analysis_server/src/services/completion/completion_manager.dart';
 
 /**
  * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
@@ -48,15 +46,14 @@
    * Process a `completion.getSuggestions` request.
    */
   Response processRequest(Request request) {
-    // extract param
-    String file = request.getRequiredParameter(FILE).asString();
-    int offset = request.getRequiredParameter(OFFSET).asInt();
+    // extract params
+    var params = new CompletionGetSuggestionsParams.fromRequest(request);
     // schedule completion analysis
     String completionId = (_nextCompletionId++).toString();
     CompletionManager.create(
-        server.getAnalysisContext(file),
-        server.getSource(file),
-        offset,
+        server.getAnalysisContext(params.file),
+        server.getSource(params.file),
+        params.offset,
         server.searchEngine).results().listen((CompletionResult result) {
       sendCompletionNotification(
           completionId,
@@ -66,7 +63,8 @@
           result.last);
     });
     // initial response without results
-    return new Response(request.id)..setResult(ID, completionId);
+    return new CompletionGetSuggestionsResult(completionId).toResponse(
+        request.id);
   }
 
   /**
@@ -74,12 +72,7 @@
    */
   void sendCompletionNotification(String completionId, int replacementOffset,
       int replacementLength, Iterable<CompletionSuggestion> results, bool isLast) {
-    Notification notification = new Notification(COMPLETION_RESULTS);
-    notification.setParameter(ID, completionId);
-    notification.setParameter(REPLACEMENT_OFFSET, replacementOffset);
-    notification.setParameter(REPLACEMENT_LENGTH, replacementLength);
-    notification.setParameter(RESULTS, results);
-    notification.setParameter(LAST, isLast);
-    server.sendNotification(notification);
+    server.sendNotification(new CompletionResultsParams(completionId,
+        replacementOffset, replacementLength, results, isLast).toNotification());
   }
 }
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 446d053..07f87b0 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 
 /**
  * Instances of the class [ServerDomainHandler] implement a [RequestHandler]
@@ -28,9 +27,7 @@
    * Return the version number of the analysis server.
    */
   Response getVersion(Request request) {
-    Response response = new Response(request.id);
-    response.setResult(VERSION, '0.0.1');
-    return response;
+    return new ServerGetVersionResult('0.0.1').toResponse(request.id);
   }
 
   @override
@@ -56,9 +53,9 @@
    * All previous subscriptions are replaced by the given set of subscriptions.
    */
   Response setSubscriptions(Request request) {
-    RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS);
-    server.serverServices = subDatum.asEnumSet(ServerService.VALUES);
-    return new Response(request.id);
+    server.serverServices =
+        new ServerSetSubscriptionsParams.fromRequest(request).subscriptions.toSet();
+    return new ServerSetSubscriptionsResult().toResponse(request.id);
   }
 
   // TODO(scheglov) remove or move to the 'analysis' domain
@@ -119,7 +116,7 @@
    */
   Response shutdown(Request request) {
     server.shutdown();
-    Response response = new Response(request.id);
+    Response response = new ServerShutdownResult().toResponse(request.id);
     return response;
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 8bcc01c..6f2de75 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -4,17 +4,21 @@
 
 library edit.domain;
 
+import 'dart:async';
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/correction/fix.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analyzer/src/generated/error.dart' as engine;
-import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_server/src/edit/fix.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analyzer/src/generated/error.dart' as engine;
+import 'package:analyzer/src/generated/source.dart';
 
 
 /**
@@ -32,130 +36,264 @@
    */
   SearchEngine searchEngine;
 
+  _RefactoringManager refactoringManager;
+
   /**
    * Initialize a newly created handler to handle requests for the given [server].
    */
   EditDomainHandler(this.server) {
     searchEngine = server.searchEngine;
-  }
-
-  Response applyRefactoring(Request request) {
-    // id
-    RequestDatum idDatum = request.getRequiredParameter(ID);
-    String id = idDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-
-  Response createRefactoring(Request request) {
-    // kind
-    RequestDatum kindDatum = request.getRequiredParameter(KIND);
-    String kind = kindDatum.asString();
-    // file
-    RequestDatum fileDatum = request.getRequiredParameter(FILE);
-    String file = fileDatum.asString();
-    // offset
-    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
-    int offset = offsetDatum.asInt();
-    // length
-    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
-    int length = lengthDatum.asInt();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-
-  Response deleteRefactoring(Request request) {
-    // id
-    RequestDatum idDatum = request.getRequiredParameter(ID);
-    String id = idDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
+    refactoringManager = new _RefactoringManager(server, searchEngine);
   }
 
   Response getAssists(Request request) {
-    // file
-    RequestDatum fileDatum = request.getRequiredParameter(FILE);
-    String file = fileDatum.asString();
-    // offset
-    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
-    int offset = offsetDatum.asInt();
-    // length
-    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
-    int length = lengthDatum.asInt();
-    // TODO(brianwilkerson) implement
-    return null;
+    var params = new EditGetAssistsParams.fromRequest(request);
+    List<SourceChange> changes = <SourceChange>[];
+    List<CompilationUnit> units =
+        server.getResolvedCompilationUnits(params.file);
+    if (units.isNotEmpty) {
+      CompilationUnit unit = units[0];
+      List<Assist> assists =
+          computeAssists(searchEngine, unit, params.offset, params.length);
+      assists.forEach((Assist assist) {
+        changes.add(assist.change);
+      });
+    }
+    // respond
+    return new EditGetAssistsResult(changes).toResponse(request.id);
+  }
+
+  Response getAvailableRefactorings(Request request) {
+    var params = new EditGetAvailableRefactoringsParams.fromRequest(request);
+    String file = params.file;
+    int offset = params.offset;
+    int length = params.length;
+    // add refactoring kinds
+    List<RefactoringKind> kinds = <RefactoringKind>[];
+    // try EXTRACT_*
+    if (length != 0) {
+      kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
+      kinds.add(RefactoringKind.EXTRACT_METHOD);
+    }
+    // try RENAME
+    {
+      List<Element> elements = server.getElementsAtOffset(file, offset);
+      if (elements.isNotEmpty) {
+        Element element = elements[0];
+        RenameRefactoring renameRefactoring =
+            new RenameRefactoring(searchEngine, element);
+        if (renameRefactoring != null) {
+          kinds.add(RefactoringKind.RENAME);
+        }
+      }
+    }
+    // respond
+    return new EditGetAvailableRefactoringsResult(kinds).toResponse(request.id);
   }
 
   Response getFixes(Request request) {
-    String file = request.getRequiredParameter(FILE).asString();
-    int offset = request.getRequiredParameter(OFFSET).asInt();
+    var params = new EditGetFixesParams.fromRequest(request);
+    String file = params.file;
+    int offset = params.offset;
+    // add fixes
     List<ErrorFixes> errorFixesList = <ErrorFixes>[];
     List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
     for (CompilationUnit unit in units) {
       engine.AnalysisErrorInfo errorInfo = server.getErrors(file);
       if (errorInfo != null) {
+        LineInfo lineInfo = errorInfo.lineInfo;
+        int requestLine = lineInfo.getLocation(offset).lineNumber;
         for (engine.AnalysisError error in errorInfo.errors) {
-          List<Fix> fixes = computeFixes(searchEngine, unit, error);
-          if (fixes.isNotEmpty) {
-            AnalysisError serverError =
-                new AnalysisError.fromEngine(errorInfo.lineInfo, error);
-            ErrorFixes errorFixes = new ErrorFixes(serverError);
-            errorFixesList.add(errorFixes);
-            fixes.forEach((fix) {
-              return errorFixes.addFix(fix);
-            });
+          int errorLine = lineInfo.getLocation(error.offset).lineNumber;
+          if (errorLine == requestLine) {
+            List<Fix> fixes = computeFixes(searchEngine, unit, error);
+            if (fixes.isNotEmpty) {
+              AnalysisError serverError =
+                  new AnalysisError.fromEngine(lineInfo, error);
+              ErrorFixes errorFixes = new ErrorFixes(serverError);
+              errorFixesList.add(errorFixes);
+              fixes.forEach((fix) {
+                errorFixes.addFix(fix);
+              });
+            }
           }
         }
       }
     }
     // respond
-    return new Response(request.id)..setResult(FIXES, errorFixesList);
-  }
-
-  Response getRefactorings(Request request) {
-    // file
-    RequestDatum fileDatum = request.getRequiredParameter(FILE);
-    String file = fileDatum.asString();
-    // offset
-    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
-    int offset = offsetDatum.asInt();
-    // length
-    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
-    int length = lengthDatum.asInt();
-    // TODO(brianwilkerson) implement
-    return null;
+    return new EditGetFixesResult(errorFixesList).toResponse(request.id);
   }
 
   @override
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == EDIT_APPLY_REFACTORING) {
-        return applyRefactoring(request);
-      } else if (requestName == EDIT_CREATE_REFACTORING) {
-        return createRefactoring(request);
-      } else if (requestName == EDIT_DELETE_REFACTORING) {
-        return deleteRefactoring(request);
-      } else if (requestName == EDIT_GET_ASSISTS) {
+      if (requestName == EDIT_GET_ASSISTS) {
         return getAssists(request);
+      } else if (requestName == EDIT_GET_AVAILABLE_REFACTORINGS) {
+        return getAvailableRefactorings(request);
       } else if (requestName == EDIT_GET_FIXES) {
         return getFixes(request);
-      } else if (requestName == EDIT_GET_REFACTORINGS) {
-        return getRefactorings(request);
-      } else if (requestName == EDIT_SET_REFACTORING_OPTIONS) {
-        return setRefactoringOptions(request);
+      } else if (requestName == EDIT_GET_REFACTORING) {
+        refactoringManager.getRefactoring(request);
+        return Response.DELAYED_RESPONSE;
       }
     } on RequestFailure catch (exception) {
       return exception.response;
     }
     return null;
   }
+}
 
-  Response setRefactoringOptions(Request request) {
-    // id
-    RequestDatum idDatum = request.getRequiredParameter(ID);
-    String id = idDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
+
+/**
+ * An object managing a single [Refactoring] instance.
+ *
+ * The instance is identified by its kind, file, offset and length.
+ * It is initialized when the a set of parameters is given for the first time.
+ * All subsequent requests are performed on this [Refactoring] instance.
+ *
+ * Once new set of parameters is received, the previous [Refactoring] instance
+ * is invalidated and a new one is created and initialized.
+ */
+class _RefactoringManager {
+  final AnalysisServer server;
+  final SearchEngine searchEngine;
+
+  RefactoringKind kind;
+  String file;
+  int offset;
+  int length;
+  Refactoring refactoring;
+  Object feedback;
+  RefactoringStatus initStatus;
+  RefactoringStatus optionsStatus;
+  RefactoringStatus finalStatus;
+
+  String requestId;
+  EditGetRefactoringResult result;
+
+  _RefactoringManager(this.server, this.searchEngine) {
+    _reset();
+  }
+
+  bool get _hasFatalError {
+    return initStatus.hasFatalError ||
+        optionsStatus.hasFatalError ||
+        finalStatus.hasFatalError;
+  }
+
+  void getRefactoring(Request request) {
+    // prepare for processing the request
+    requestId = request.id;
+    result = new EditGetRefactoringResult(<RefactoringProblem>[]);
+    // process the request
+    var params = new EditGetRefactoringParams.fromRequest(request);
+    _init(params.kind, params.file, params.offset, params.length).then((_) {
+      if (_hasFatalError) {
+        return _sendResultResponse();
+      }
+      // set options
+      if (params.options == null) {
+        return _sendResultResponse();
+      }
+      optionsStatus = _setOptions(params.options);
+      if (_hasFatalError) {
+        return _sendResultResponse();
+      }
+      // done if just validation
+      if (params.validateOnly) {
+        return _sendResultResponse();
+      }
+      // validation and create change
+      refactoring.checkFinalConditions().then((_finalStatus) {
+        finalStatus = _finalStatus;
+        if (_hasFatalError) {
+          return _sendResultResponse();
+        }
+        return refactoring.createChange().then((change) {
+          result.change = new SourceChange(change.message, edits: change.edits);
+          return _sendResultResponse();
+        });
+      });
+    });
+  }
+
+  /**
+   * Initializes this context to perform a refactoring with the specified
+   * parameters. The existing [Refactoring] is reused or created as needed.
+   */
+  Future<RefactoringStatus> _init(RefactoringKind kind, String file, int offset,
+      int length) {
+    List<RefactoringProblem> problems = <RefactoringProblem>[];
+    // check if we can continue with the existing Refactoring instance
+    if (this.kind == kind &&
+        this.file == file &&
+        this.offset == offset &&
+        this.length == length) {
+      return new Future.value(initStatus);
+    }
+    _reset();
+    this.kind = kind;
+    this.file = file;
+    this.offset = offset;
+    this.length = length;
+    // create a new Refactoring instance
+    if (kind == RefactoringKind.RENAME) {
+      List<AstNode> nodes = server.getNodesAtOffset(file, offset);
+      List<Element> elements = server.getElementsAtOffset(file, offset);
+      if (nodes.isNotEmpty && elements.isNotEmpty) {
+        AstNode node = nodes[0];
+        Element element = elements[0];
+        refactoring = new RenameRefactoring(searchEngine, element);
+        feedback = new RenameFeedback(node.offset, node.length);
+      }
+    }
+    if (refactoring == null) {
+      initStatus =
+          new RefactoringStatus.fatal('Unable to create a refactoring');
+      return new Future.value(initStatus);
+    }
+    // check initial conditions
+    return refactoring.checkInitialConditions().then((status) {
+      initStatus = status;
+      return initStatus;
+    });
+  }
+
+  void _reset() {
+    refactoring = null;
+    feedback = null;
+    initStatus = new RefactoringStatus();
+    optionsStatus = new RefactoringStatus();
+    finalStatus = new RefactoringStatus();
+  }
+
+  void _sendResultResponse() {
+    result.feedback = feedback;
+    // set problems
+    {
+      RefactoringStatus status = new RefactoringStatus();
+      status.addStatus(initStatus);
+      status.addStatus(optionsStatus);
+      status.addStatus(finalStatus);
+      result.problems = status.problems;
+    }
+    // send the response
+    server.sendResponse(result.toResponse(requestId));
+    // done with this request
+    requestId = null;
+    result = null;
+  }
+
+  RefactoringStatus _setOptions(Object options) {
+    if (refactoring is RenameRefactoring) {
+      RenameRefactoring renameRefactoring = refactoring;
+      RenameOptions renameOptions = options;
+      String newName = renameOptions.newName;
+      renameRefactoring.newName = newName;
+      return renameRefactoring.checkNewName();
+    }
+    return new RefactoringStatus();
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix.dart b/pkg/analysis_server/lib/src/edit/fix.dart
deleted file mode 100644
index f34c110..0000000
--- a/pkg/analysis_server/lib/src/edit/fix.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library edit.fix;
-
-import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/fix.dart';
-import 'package:analysis_services/json.dart';
-
-
-class ErrorFixes implements HasToJson {
-  final AnalysisError error;
-  final List<Change> fixes = <Change>[];
-
-  ErrorFixes(this.error);
-
-  void addFix(Fix fix) {
-    Change change = fix.change;
-    fixes.add(change);
-  }
-
-  @override
-  Map<String, Object> toJson() {
-    return {
-      ERROR: error.toJson(),
-      FIXES: objectToJson(fixes)
-    };
-  }
-
-  @override
-  String toString() => 'ErrorFixes(error=$error, fixes=$fixes)';
-}
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
new file mode 100644
index 0000000..dd58498
--- /dev/null
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -0,0 +1,9689 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated.  Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/spec/generate_files".
+
+part of protocol;
+/**
+ * server.getVersion params
+ */
+class ServerGetVersionParams {
+  Request toRequest(String id) {
+    return new Request(id, "server.getVersion", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerGetVersionParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 55877452;
+  }
+}
+
+/**
+ * server.getVersion result
+ *
+ * {
+ *   "version": String
+ * }
+ */
+class ServerGetVersionResult {
+  /**
+   * The version number of the analysis server.
+   */
+  String version;
+
+  ServerGetVersionResult(this.version);
+
+  factory ServerGetVersionResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String version;
+      if (json.containsKey("version")) {
+        version = jsonDecoder._decodeString(jsonPath + ".version", json["version"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "version");
+      }
+      return new ServerGetVersionResult(version);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.getVersion result");
+    }
+  }
+
+  factory ServerGetVersionResult.fromResponse(Response response) {
+    return new ServerGetVersionResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["version"] = version;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerGetVersionResult) {
+      return version == other.version;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, version.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * server.shutdown params
+ */
+class ServerShutdownParams {
+  Request toRequest(String id) {
+    return new Request(id, "server.shutdown", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerShutdownParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 366630911;
+  }
+}
+/**
+ * server.shutdown result
+ */
+class ServerShutdownResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerShutdownResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 193626532;
+  }
+}
+
+/**
+ * server.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": List<ServerService>
+ * }
+ */
+class ServerSetSubscriptionsParams {
+  /**
+   * A list of the services being subscribed to.
+   */
+  List<ServerService> subscriptions;
+
+  ServerSetSubscriptionsParams(this.subscriptions);
+
+  factory ServerSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ServerService> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeList(jsonPath + ".subscriptions", json["subscriptions"], (String jsonPath, Object json) => new ServerService.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new ServerSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.setSubscriptions params");
+    }
+  }
+
+  factory ServerSetSubscriptionsParams.fromRequest(Request request) {
+    return new ServerSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = subscriptions.map((ServerService value) => value.toJson()).toList();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "server.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerSetSubscriptionsParams) {
+      return _listEqual(subscriptions, other.subscriptions, (ServerService a, ServerService b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * server.setSubscriptions result
+ */
+class ServerSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 748820900;
+  }
+}
+/**
+ * server.connected params
+ */
+class ServerConnectedParams {
+  Notification toNotification() {
+    return new Notification("server.connected", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerConnectedParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 509239412;
+  }
+}
+
+/**
+ * server.error params
+ *
+ * {
+ *   "isFatal": bool
+ *   "message": String
+ *   "stackTrace": String
+ * }
+ */
+class ServerErrorParams {
+  /**
+   * True if the error is a fatal error, meaning that the server will shutdown
+   * automatically after sending this notification.
+   */
+  bool isFatal;
+
+  /**
+   * The error message indicating what kind of error was encountered.
+   */
+  String message;
+
+  /**
+   * The stack trace associated with the generation of the error, used for
+   * debugging the server.
+   */
+  String stackTrace;
+
+  ServerErrorParams(this.isFatal, this.message, this.stackTrace);
+
+  factory ServerErrorParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool isFatal;
+      if (json.containsKey("isFatal")) {
+        isFatal = jsonDecoder._decodeBool(jsonPath + ".isFatal", json["isFatal"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isFatal");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      String stackTrace;
+      if (json.containsKey("stackTrace")) {
+        stackTrace = jsonDecoder._decodeString(jsonPath + ".stackTrace", json["stackTrace"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "stackTrace");
+      }
+      return new ServerErrorParams(isFatal, message, stackTrace);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.error params");
+    }
+  }
+
+  factory ServerErrorParams.fromNotification(Notification notification) {
+    return new ServerErrorParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["isFatal"] = isFatal;
+    result["message"] = message;
+    result["stackTrace"] = stackTrace;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("server.error", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerErrorParams) {
+      return isFatal == other.isFatal &&
+          message == other.message &&
+          stackTrace == other.stackTrace;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, isFatal.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, stackTrace.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * server.status params
+ *
+ * {
+ *   "analysis": optional AnalysisStatus
+ * }
+ */
+class ServerStatusParams {
+  /**
+   * The current status of analysis, including whether analysis is being
+   * performed and if so what is being analyzed.
+   */
+  AnalysisStatus analysis;
+
+  ServerStatusParams({this.analysis});
+
+  factory ServerStatusParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisStatus analysis;
+      if (json.containsKey("analysis")) {
+        analysis = new AnalysisStatus.fromJson(jsonDecoder, jsonPath + ".analysis", json["analysis"]);
+      }
+      return new ServerStatusParams(analysis: analysis);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.status params");
+    }
+  }
+
+  factory ServerStatusParams.fromNotification(Notification notification) {
+    return new ServerStatusParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (analysis != null) {
+      result["analysis"] = analysis.toJson();
+    }
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("server.status", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerStatusParams) {
+      return analysis == other.analysis;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, analysis.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getErrors params
+ *
+ * {
+ *   "file": FilePath
+ * }
+ */
+class AnalysisGetErrorsParams {
+  /**
+   * The file for which errors are being requested.
+   */
+  String file;
+
+  AnalysisGetErrorsParams(this.file);
+
+  factory AnalysisGetErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      return new AnalysisGetErrorsParams(file);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getErrors params");
+    }
+  }
+
+  factory AnalysisGetErrorsParams.fromRequest(Request request) {
+    return new AnalysisGetErrorsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.getErrors", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetErrorsParams) {
+      return file == other.file;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getErrors result
+ *
+ * {
+ *   "errors": List<AnalysisError>
+ * }
+ */
+class AnalysisGetErrorsResult {
+  /**
+   * The errors associated with the file.
+   */
+  List<AnalysisError> errors;
+
+  AnalysisGetErrorsResult(this.errors);
+
+  factory AnalysisGetErrorsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<AnalysisError> errors;
+      if (json.containsKey("errors")) {
+        errors = jsonDecoder._decodeList(jsonPath + ".errors", json["errors"], (String jsonPath, Object json) => new AnalysisError.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "errors");
+      }
+      return new AnalysisGetErrorsResult(errors);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getErrors result");
+    }
+  }
+
+  factory AnalysisGetErrorsResult.fromResponse(Response response) {
+    return new AnalysisGetErrorsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["errors"] = errors.map((AnalysisError value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetErrorsResult) {
+      return _listEqual(errors, other.errors, (AnalysisError a, AnalysisError b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, errors.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getHover params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class AnalysisGetHoverParams {
+  /**
+   * The file in which hover information is being requested.
+   */
+  String file;
+
+  /**
+   * The offset for which hover information is being requested.
+   */
+  int offset;
+
+  AnalysisGetHoverParams(this.file, this.offset);
+
+  factory AnalysisGetHoverParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new AnalysisGetHoverParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getHover params");
+    }
+  }
+
+  factory AnalysisGetHoverParams.fromRequest(Request request) {
+    return new AnalysisGetHoverParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.getHover", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetHoverParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getHover result
+ *
+ * {
+ *   "hovers": List<HoverInformation>
+ * }
+ */
+class AnalysisGetHoverResult {
+  /**
+   * The hover information associated with the location. The list will be empty
+   * if no information could be determined for the location. The list can
+   * contain multiple items if the file is being analyzed in multiple contexts
+   * in conflicting ways (such as a part that is included in multiple
+   * libraries).
+   */
+  List<HoverInformation> hovers;
+
+  AnalysisGetHoverResult(this.hovers);
+
+  factory AnalysisGetHoverResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<HoverInformation> hovers;
+      if (json.containsKey("hovers")) {
+        hovers = jsonDecoder._decodeList(jsonPath + ".hovers", json["hovers"], (String jsonPath, Object json) => new HoverInformation.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "hovers");
+      }
+      return new AnalysisGetHoverResult(hovers);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getHover result");
+    }
+  }
+
+  factory AnalysisGetHoverResult.fromResponse(Response response) {
+    return new AnalysisGetHoverResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["hovers"] = hovers.map((HoverInformation value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetHoverResult) {
+      return _listEqual(hovers, other.hovers, (HoverInformation a, HoverInformation b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, hovers.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.reanalyze params
+ */
+class AnalysisReanalyzeParams {
+  Request toRequest(String id) {
+    return new Request(id, "analysis.reanalyze", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisReanalyzeParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 613039876;
+  }
+}
+/**
+ * analysis.reanalyze result
+ */
+class AnalysisReanalyzeResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisReanalyzeResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 846803925;
+  }
+}
+
+/**
+ * analysis.setAnalysisRoots params
+ *
+ * {
+ *   "included": List<FilePath>
+ *   "excluded": List<FilePath>
+ * }
+ */
+class AnalysisSetAnalysisRootsParams {
+  /**
+   * A list of the files and directories that should be analyzed.
+   */
+  List<String> included;
+
+  /**
+   * A list of the files and directories within the included directories that
+   * should not be analyzed.
+   */
+  List<String> excluded;
+
+  AnalysisSetAnalysisRootsParams(this.included, this.excluded);
+
+  factory AnalysisSetAnalysisRootsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> included;
+      if (json.containsKey("included")) {
+        included = jsonDecoder._decodeList(jsonPath + ".included", json["included"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "included");
+      }
+      List<String> excluded;
+      if (json.containsKey("excluded")) {
+        excluded = jsonDecoder._decodeList(jsonPath + ".excluded", json["excluded"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "excluded");
+      }
+      return new AnalysisSetAnalysisRootsParams(included, excluded);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setAnalysisRoots params");
+    }
+  }
+
+  factory AnalysisSetAnalysisRootsParams.fromRequest(Request request) {
+    return new AnalysisSetAnalysisRootsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["included"] = included;
+    result["excluded"] = excluded;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setAnalysisRoots", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetAnalysisRootsParams) {
+      return _listEqual(included, other.included, (String a, String b) => a == b) &&
+          _listEqual(excluded, other.excluded, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, included.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, excluded.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setAnalysisRoots result
+ */
+class AnalysisSetAnalysisRootsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetAnalysisRootsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 866004753;
+  }
+}
+
+/**
+ * analysis.setPriorityFiles params
+ *
+ * {
+ *   "files": List<FilePath>
+ * }
+ */
+class AnalysisSetPriorityFilesParams {
+  /**
+   * The files that are to be a priority for analysis.
+   */
+  List<String> files;
+
+  AnalysisSetPriorityFilesParams(this.files);
+
+  factory AnalysisSetPriorityFilesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeList(jsonPath + ".files", json["files"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisSetPriorityFilesParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setPriorityFiles params");
+    }
+  }
+
+  factory AnalysisSetPriorityFilesParams.fromRequest(Request request) {
+    return new AnalysisSetPriorityFilesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = files;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setPriorityFiles", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetPriorityFilesParams) {
+      return _listEqual(files, other.files, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setPriorityFiles result
+ */
+class AnalysisSetPriorityFilesResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetPriorityFilesResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 330050055;
+  }
+}
+
+/**
+ * analysis.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": Map<AnalysisService, List<FilePath>>
+ * }
+ */
+class AnalysisSetSubscriptionsParams {
+  /**
+   * A table mapping services to a list of the files being subscribed to the
+   * service.
+   */
+  Map<AnalysisService, List<String>> subscriptions;
+
+  AnalysisSetSubscriptionsParams(this.subscriptions);
+
+  factory AnalysisSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Map<AnalysisService, List<String>> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeMap(jsonPath + ".subscriptions", json["subscriptions"], keyDecoder: (String jsonPath, Object json) => new AnalysisService.fromJson(jsonDecoder, jsonPath, json), valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new AnalysisSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setSubscriptions params");
+    }
+  }
+
+  factory AnalysisSetSubscriptionsParams.fromRequest(Request request) {
+    return new AnalysisSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = mapMap(subscriptions, keyCallback: (AnalysisService value) => value.toJson());
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetSubscriptionsParams) {
+      return _mapEqual(subscriptions, other.subscriptions, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b));
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setSubscriptions result
+ */
+class AnalysisSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 218088493;
+  }
+}
+
+/**
+ * analysis.updateContent params
+ *
+ * {
+ *   "files": Map<FilePath, AddContentOverlay | ChangeContentOverlay | RemoveContentOverlay>
+ * }
+ */
+class AnalysisUpdateContentParams {
+  /**
+   * A table mapping the files whose content has changed to a description of
+   * the content change.
+   */
+  Map<String, dynamic> files;
+
+  AnalysisUpdateContentParams(this.files);
+
+  factory AnalysisUpdateContentParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Map<String, dynamic> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeMap(jsonPath + ".files", json["files"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeUnion(jsonPath, json, "type", {"add": (String jsonPath, Object json) => new AddContentOverlay.fromJson(jsonDecoder, jsonPath, json), "change": (String jsonPath, Object json) => new ChangeContentOverlay.fromJson(jsonDecoder, jsonPath, json), "remove": (String jsonPath, Object json) => new RemoveContentOverlay.fromJson(jsonDecoder, jsonPath, json)}));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisUpdateContentParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.updateContent params");
+    }
+  }
+
+  factory AnalysisUpdateContentParams.fromRequest(Request request) {
+    return new AnalysisUpdateContentParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = mapMap(files, valueCallback: (dynamic value) => value.toJson());
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.updateContent", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateContentParams) {
+      return _mapEqual(files, other.files, (dynamic a, dynamic b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.updateContent result
+ */
+class AnalysisUpdateContentResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateContentResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 468798730;
+  }
+}
+
+/**
+ * analysis.updateOptions params
+ *
+ * {
+ *   "options": AnalysisOptions
+ * }
+ */
+class AnalysisUpdateOptionsParams {
+  /**
+   * The options that are to be used to control analysis.
+   */
+  AnalysisOptions options;
+
+  AnalysisUpdateOptionsParams(this.options);
+
+  factory AnalysisUpdateOptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisOptions options;
+      if (json.containsKey("options")) {
+        options = new AnalysisOptions.fromJson(jsonDecoder, jsonPath + ".options", json["options"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "options");
+      }
+      return new AnalysisUpdateOptionsParams(options);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.updateOptions params");
+    }
+  }
+
+  factory AnalysisUpdateOptionsParams.fromRequest(Request request) {
+    return new AnalysisUpdateOptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["options"] = options.toJson();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.updateOptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateOptionsParams) {
+      return options == other.options;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, options.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.updateOptions result
+ */
+class AnalysisUpdateOptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateOptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 179689467;
+  }
+}
+
+/**
+ * analysis.errors params
+ *
+ * {
+ *   "file": FilePath
+ *   "errors": List<AnalysisError>
+ * }
+ */
+class AnalysisErrorsParams {
+  /**
+   * The file containing the errors.
+   */
+  String file;
+
+  /**
+   * The errors contained in the file.
+   */
+  List<AnalysisError> errors;
+
+  AnalysisErrorsParams(this.file, this.errors);
+
+  factory AnalysisErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<AnalysisError> errors;
+      if (json.containsKey("errors")) {
+        errors = jsonDecoder._decodeList(jsonPath + ".errors", json["errors"], (String jsonPath, Object json) => new AnalysisError.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "errors");
+      }
+      return new AnalysisErrorsParams(file, errors);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.errors params");
+    }
+  }
+
+  factory AnalysisErrorsParams.fromNotification(Notification notification) {
+    return new AnalysisErrorsParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["errors"] = errors.map((AnalysisError value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.errors", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisErrorsParams) {
+      return file == other.file &&
+          _listEqual(errors, other.errors, (AnalysisError a, AnalysisError b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, errors.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.flushResults params
+ *
+ * {
+ *   "files": List<FilePath>
+ * }
+ */
+class AnalysisFlushResultsParams {
+  /**
+   * The files that are no longer being analyzed.
+   */
+  List<String> files;
+
+  AnalysisFlushResultsParams(this.files);
+
+  factory AnalysisFlushResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeList(jsonPath + ".files", json["files"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisFlushResultsParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.flushResults params");
+    }
+  }
+
+  factory AnalysisFlushResultsParams.fromNotification(Notification notification) {
+    return new AnalysisFlushResultsParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = files;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.flushResults", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisFlushResultsParams) {
+      return _listEqual(files, other.files, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.folding params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<FoldingRegion>
+ * }
+ */
+class AnalysisFoldingParams {
+  /**
+   * The file containing the folding regions.
+   */
+  String file;
+
+  /**
+   * The folding regions contained in the file.
+   */
+  List<FoldingRegion> regions;
+
+  AnalysisFoldingParams(this.file, this.regions);
+
+  factory AnalysisFoldingParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<FoldingRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new FoldingRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisFoldingParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.folding params");
+    }
+  }
+
+  factory AnalysisFoldingParams.fromNotification(Notification notification) {
+    return new AnalysisFoldingParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((FoldingRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.folding", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisFoldingParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (FoldingRegion a, FoldingRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.highlights params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<HighlightRegion>
+ * }
+ */
+class AnalysisHighlightsParams {
+  /**
+   * The file containing the highlight regions.
+   */
+  String file;
+
+  /**
+   * The highlight regions contained in the file. Each highlight region
+   * represents a particular syntactic or semantic meaning associated with some
+   * range. Note that the highlight regions that are returned can overlap other
+   * highlight regions if there is more than one meaning associated with a
+   * particular region.
+   */
+  List<HighlightRegion> regions;
+
+  AnalysisHighlightsParams(this.file, this.regions);
+
+  factory AnalysisHighlightsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<HighlightRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new HighlightRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisHighlightsParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.highlights params");
+    }
+  }
+
+  factory AnalysisHighlightsParams.fromNotification(Notification notification) {
+    return new AnalysisHighlightsParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((HighlightRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.highlights", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisHighlightsParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (HighlightRegion a, HighlightRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.navigation params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<NavigationRegion>
+ * }
+ */
+class AnalysisNavigationParams {
+  /**
+   * The file containing the navigation regions.
+   */
+  String file;
+
+  /**
+   * The navigation regions contained in the file. Each navigation region
+   * represents a list of targets associated with some range. The lists will
+   * usually contain a single target, but can contain more in the case of a
+   * part that is included in multiple libraries or in Dart code that is
+   * compiled against multiple versions of a package. Note that the navigation
+   * regions that are returned do not overlap other navigation regions.
+   */
+  List<NavigationRegion> regions;
+
+  AnalysisNavigationParams(this.file, this.regions);
+
+  factory AnalysisNavigationParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<NavigationRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new NavigationRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisNavigationParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.navigation params");
+    }
+  }
+
+  factory AnalysisNavigationParams.fromNotification(Notification notification) {
+    return new AnalysisNavigationParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((NavigationRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.navigation", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisNavigationParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (NavigationRegion a, NavigationRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.occurrences params
+ *
+ * {
+ *   "file": FilePath
+ *   "occurrences": List<Occurrences>
+ * }
+ */
+class AnalysisOccurrencesParams {
+  /**
+   * The file in which the references occur.
+   */
+  String file;
+
+  /**
+   * The occurrences of references to elements within the file.
+   */
+  List<Occurrences> occurrences;
+
+  AnalysisOccurrencesParams(this.file, this.occurrences);
+
+  factory AnalysisOccurrencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<Occurrences> occurrences;
+      if (json.containsKey("occurrences")) {
+        occurrences = jsonDecoder._decodeList(jsonPath + ".occurrences", json["occurrences"], (String jsonPath, Object json) => new Occurrences.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "occurrences");
+      }
+      return new AnalysisOccurrencesParams(file, occurrences);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.occurrences params");
+    }
+  }
+
+  factory AnalysisOccurrencesParams.fromNotification(Notification notification) {
+    return new AnalysisOccurrencesParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["occurrences"] = occurrences.map((Occurrences value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.occurrences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOccurrencesParams) {
+      return file == other.file &&
+          _listEqual(occurrences, other.occurrences, (Occurrences a, Occurrences b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, occurrences.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.outline params
+ *
+ * {
+ *   "file": FilePath
+ *   "outline": Outline
+ * }
+ */
+class AnalysisOutlineParams {
+  /**
+   * The file with which the outline is associated.
+   */
+  String file;
+
+  /**
+   * The outline associated with the file.
+   */
+  Outline outline;
+
+  AnalysisOutlineParams(this.file, this.outline);
+
+  factory AnalysisOutlineParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      Outline outline;
+      if (json.containsKey("outline")) {
+        outline = new Outline.fromJson(jsonDecoder, jsonPath + ".outline", json["outline"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "outline");
+      }
+      return new AnalysisOutlineParams(file, outline);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.outline params");
+    }
+  }
+
+  factory AnalysisOutlineParams.fromNotification(Notification notification) {
+    return new AnalysisOutlineParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["outline"] = outline.toJson();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.outline", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOutlineParams) {
+      return file == other.file &&
+          outline == other.outline;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, outline.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.overrides params
+ *
+ * {
+ *   "file": FilePath
+ *   "overrides": List<Override>
+ * }
+ */
+class AnalysisOverridesParams {
+  /**
+   * The file with which the overrides are associated.
+   */
+  String file;
+
+  /**
+   * The overrides associated with the file.
+   */
+  List<Override> overrides;
+
+  AnalysisOverridesParams(this.file, this.overrides);
+
+  factory AnalysisOverridesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<Override> overrides;
+      if (json.containsKey("overrides")) {
+        overrides = jsonDecoder._decodeList(jsonPath + ".overrides", json["overrides"], (String jsonPath, Object json) => new Override.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "overrides");
+      }
+      return new AnalysisOverridesParams(file, overrides);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.overrides params");
+    }
+  }
+
+  factory AnalysisOverridesParams.fromNotification(Notification notification) {
+    return new AnalysisOverridesParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["overrides"] = overrides.map((Override value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.overrides", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOverridesParams) {
+      return file == other.file &&
+          _listEqual(overrides, other.overrides, (Override a, Override b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, overrides.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.getSuggestions params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class CompletionGetSuggestionsParams {
+  /**
+   * The file containing the point at which suggestions are to be made.
+   */
+  String file;
+
+  /**
+   * The offset within the file at which suggestions are to be made.
+   */
+  int offset;
+
+  CompletionGetSuggestionsParams(this.file, this.offset);
+
+  factory CompletionGetSuggestionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new CompletionGetSuggestionsParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.getSuggestions params");
+    }
+  }
+
+  factory CompletionGetSuggestionsParams.fromRequest(Request request) {
+    return new CompletionGetSuggestionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "completion.getSuggestions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionGetSuggestionsParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.getSuggestions result
+ *
+ * {
+ *   "id": CompletionId
+ * }
+ */
+class CompletionGetSuggestionsResult {
+  /**
+   * The identifier used to associate results with this completion request.
+   */
+  String id;
+
+  CompletionGetSuggestionsResult(this.id);
+
+  factory CompletionGetSuggestionsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new CompletionGetSuggestionsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.getSuggestions result");
+    }
+  }
+
+  factory CompletionGetSuggestionsResult.fromResponse(Response response) {
+    return new CompletionGetSuggestionsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionGetSuggestionsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.results params
+ *
+ * {
+ *   "id": CompletionId
+ *   "replacementOffset": int
+ *   "replacementLength": int
+ *   "results": List<CompletionSuggestion>
+ *   "isLast": bool
+ * }
+ */
+class CompletionResultsParams {
+  /**
+   * The id associated with the completion.
+   */
+  String id;
+
+  /**
+   * The offset of the start of the text to be replaced. This will be different
+   * than the offset used to request the completion suggestions if there was a
+   * portion of an identifier before the original offset. In particular, the
+   * replacementOffset will be the offset of the beginning of said identifier.
+   */
+  int replacementOffset;
+
+  /**
+   * The length of the text to be replaced if the remainder of the identifier
+   * containing the cursor is to be replaced when the suggestion is applied
+   * (that is, the number of characters in the existing identifier).
+   */
+  int replacementLength;
+
+  /**
+   * The completion suggestions being reported. The notification contains all
+   * possible completions at the requested cursor position, even those that do
+   * not match the characters the user has already typed. This allows the
+   * client to respond to further keystrokes from the user without having to
+   * make additional requests.
+   */
+  List<CompletionSuggestion> results;
+
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated completion.
+   */
+  bool isLast;
+
+  CompletionResultsParams(this.id, this.replacementOffset, this.replacementLength, this.results, this.isLast);
+
+  factory CompletionResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      int replacementOffset;
+      if (json.containsKey("replacementOffset")) {
+        replacementOffset = jsonDecoder._decodeInt(jsonPath + ".replacementOffset", json["replacementOffset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacementOffset");
+      }
+      int replacementLength;
+      if (json.containsKey("replacementLength")) {
+        replacementLength = jsonDecoder._decodeInt(jsonPath + ".replacementLength", json["replacementLength"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacementLength");
+      }
+      List<CompletionSuggestion> results;
+      if (json.containsKey("results")) {
+        results = jsonDecoder._decodeList(jsonPath + ".results", json["results"], (String jsonPath, Object json) => new CompletionSuggestion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "results");
+      }
+      bool isLast;
+      if (json.containsKey("isLast")) {
+        isLast = jsonDecoder._decodeBool(jsonPath + ".isLast", json["isLast"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isLast");
+      }
+      return new CompletionResultsParams(id, replacementOffset, replacementLength, results, isLast);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.results params");
+    }
+  }
+
+  factory CompletionResultsParams.fromNotification(Notification notification) {
+    return new CompletionResultsParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    result["replacementOffset"] = replacementOffset;
+    result["replacementLength"] = replacementLength;
+    result["results"] = results.map((CompletionSuggestion value) => value.toJson()).toList();
+    result["isLast"] = isLast;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("completion.results", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionResultsParams) {
+      return id == other.id &&
+          replacementOffset == other.replacementOffset &&
+          replacementLength == other.replacementLength &&
+          _listEqual(results, other.results, (CompletionSuggestion a, CompletionSuggestion b) => a == b) &&
+          isLast == other.isLast;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacementOffset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacementLength.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, results.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isLast.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findElementReferences params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "includePotential": bool
+ * }
+ */
+class SearchFindElementReferencesParams {
+  /**
+   * The file containing the declaration of or reference to the element used to
+   * define the search.
+   */
+  String file;
+
+  /**
+   * The offset within the file of the declaration of or reference to the
+   * element.
+   */
+  int offset;
+
+  /**
+   * True if potential matches are to be included in the results.
+   */
+  bool includePotential;
+
+  SearchFindElementReferencesParams(this.file, this.offset, this.includePotential);
+
+  factory SearchFindElementReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      bool includePotential;
+      if (json.containsKey("includePotential")) {
+        includePotential = jsonDecoder._decodeBool(jsonPath + ".includePotential", json["includePotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "includePotential");
+      }
+      return new SearchFindElementReferencesParams(file, offset, includePotential);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findElementReferences params");
+    }
+  }
+
+  factory SearchFindElementReferencesParams.fromRequest(Request request) {
+    return new SearchFindElementReferencesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["includePotential"] = includePotential;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findElementReferences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindElementReferencesParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          includePotential == other.includePotential;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, includePotential.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findElementReferences result
+ *
+ * {
+ *   "id": SearchId
+ *   "element": optional Element
+ * }
+ */
+class SearchFindElementReferencesResult {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  /**
+   * The element referenced or defined at the given offset and whose references
+   * will be returned in the search results.
+   *
+   * If no element was found at the given location, this field will be absent.
+   */
+  Element element;
+
+  SearchFindElementReferencesResult(this.id, {this.element});
+
+  factory SearchFindElementReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      }
+      return new SearchFindElementReferencesResult(id, element: element);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findElementReferences result");
+    }
+  }
+
+  factory SearchFindElementReferencesResult.fromResponse(Response response) {
+    return new SearchFindElementReferencesResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    if (element != null) {
+      result["element"] = element.toJson();
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindElementReferencesResult) {
+      return id == other.id &&
+          element == other.element;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberDeclarations params
+ *
+ * {
+ *   "name": String
+ * }
+ */
+class SearchFindMemberDeclarationsParams {
+  /**
+   * The name of the declarations to be found.
+   */
+  String name;
+
+  SearchFindMemberDeclarationsParams(this.name);
+
+  factory SearchFindMemberDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      return new SearchFindMemberDeclarationsParams(name);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberDeclarations params");
+    }
+  }
+
+  factory SearchFindMemberDeclarationsParams.fromRequest(Request request) {
+    return new SearchFindMemberDeclarationsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findMemberDeclarations", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberDeclarationsParams) {
+      return name == other.name;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberDeclarations result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindMemberDeclarationsResult {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindMemberDeclarationsResult(this.id);
+
+  factory SearchFindMemberDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindMemberDeclarationsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberDeclarations result");
+    }
+  }
+
+  factory SearchFindMemberDeclarationsResult.fromResponse(Response response) {
+    return new SearchFindMemberDeclarationsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberDeclarationsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberReferences params
+ *
+ * {
+ *   "name": String
+ * }
+ */
+class SearchFindMemberReferencesParams {
+  /**
+   * The name of the references to be found.
+   */
+  String name;
+
+  SearchFindMemberReferencesParams(this.name);
+
+  factory SearchFindMemberReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      return new SearchFindMemberReferencesParams(name);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberReferences params");
+    }
+  }
+
+  factory SearchFindMemberReferencesParams.fromRequest(Request request) {
+    return new SearchFindMemberReferencesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findMemberReferences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberReferencesParams) {
+      return name == other.name;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberReferences result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindMemberReferencesResult {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindMemberReferencesResult(this.id);
+
+  factory SearchFindMemberReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindMemberReferencesResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberReferences result");
+    }
+  }
+
+  factory SearchFindMemberReferencesResult.fromResponse(Response response) {
+    return new SearchFindMemberReferencesResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberReferencesResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findTopLevelDeclarations params
+ *
+ * {
+ *   "pattern": String
+ * }
+ */
+class SearchFindTopLevelDeclarationsParams {
+  /**
+   * The regular expression used to match the names of the declarations to be
+   * found.
+   */
+  String pattern;
+
+  SearchFindTopLevelDeclarationsParams(this.pattern);
+
+  factory SearchFindTopLevelDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String pattern;
+      if (json.containsKey("pattern")) {
+        pattern = jsonDecoder._decodeString(jsonPath + ".pattern", json["pattern"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "pattern");
+      }
+      return new SearchFindTopLevelDeclarationsParams(pattern);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findTopLevelDeclarations params");
+    }
+  }
+
+  factory SearchFindTopLevelDeclarationsParams.fromRequest(Request request) {
+    return new SearchFindTopLevelDeclarationsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["pattern"] = pattern;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findTopLevelDeclarations", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindTopLevelDeclarationsParams) {
+      return pattern == other.pattern;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, pattern.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findTopLevelDeclarations result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindTopLevelDeclarationsResult {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindTopLevelDeclarationsResult(this.id);
+
+  factory SearchFindTopLevelDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindTopLevelDeclarationsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findTopLevelDeclarations result");
+    }
+  }
+
+  factory SearchFindTopLevelDeclarationsResult.fromResponse(Response response) {
+    return new SearchFindTopLevelDeclarationsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindTopLevelDeclarationsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.getTypeHierarchy params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class SearchGetTypeHierarchyParams {
+  /**
+   * The file containing the declaration or reference to the type for which a
+   * hierarchy is being requested.
+   */
+  String file;
+
+  /**
+   * The offset of the name of the type within the file.
+   */
+  int offset;
+
+  SearchGetTypeHierarchyParams(this.file, this.offset);
+
+  factory SearchGetTypeHierarchyParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new SearchGetTypeHierarchyParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.getTypeHierarchy params");
+    }
+  }
+
+  factory SearchGetTypeHierarchyParams.fromRequest(Request request) {
+    return new SearchGetTypeHierarchyParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.getTypeHierarchy", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchGetTypeHierarchyParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.getTypeHierarchy result
+ *
+ * {
+ *   "hierarchyItems": optional List<TypeHierarchyItem>
+ * }
+ */
+class SearchGetTypeHierarchyResult {
+  /**
+   * A list of the types in the requested hierarchy. The first element of the
+   * list is the item representing the type for which the hierarchy was
+   * requested. The index of other elements of the list is unspecified, but
+   * correspond to the integers used to reference supertype and subtype items
+   * within the items.
+   *
+   * This field will be absent if the code at the given file and offset does
+   * not represent a type, or if the file has not been sufficiently analyzed to
+   * allow a type hierarchy to be produced.
+   */
+  List<TypeHierarchyItem> hierarchyItems;
+
+  SearchGetTypeHierarchyResult({this.hierarchyItems}) {
+    if (hierarchyItems == null) {
+      hierarchyItems = <TypeHierarchyItem>[];
+    }
+  }
+
+  factory SearchGetTypeHierarchyResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<TypeHierarchyItem> hierarchyItems;
+      if (json.containsKey("hierarchyItems")) {
+        hierarchyItems = jsonDecoder._decodeList(jsonPath + ".hierarchyItems", json["hierarchyItems"], (String jsonPath, Object json) => new TypeHierarchyItem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        hierarchyItems = <TypeHierarchyItem>[];
+      }
+      return new SearchGetTypeHierarchyResult(hierarchyItems: hierarchyItems);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.getTypeHierarchy result");
+    }
+  }
+
+  factory SearchGetTypeHierarchyResult.fromResponse(Response response) {
+    return new SearchGetTypeHierarchyResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (hierarchyItems.isNotEmpty) {
+      result["hierarchyItems"] = hierarchyItems.map((TypeHierarchyItem value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchGetTypeHierarchyResult) {
+      return _listEqual(hierarchyItems, other.hierarchyItems, (TypeHierarchyItem a, TypeHierarchyItem b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, hierarchyItems.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.results params
+ *
+ * {
+ *   "id": SearchId
+ *   "results": List<SearchResult>
+ *   "isLast": bool
+ * }
+ */
+class SearchResultsParams {
+  /**
+   * The id associated with the search.
+   */
+  String id;
+
+  /**
+   * The search results being reported.
+   */
+  List<SearchResult> results;
+
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated search.
+   */
+  bool isLast;
+
+  SearchResultsParams(this.id, this.results, this.isLast);
+
+  factory SearchResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      List<SearchResult> results;
+      if (json.containsKey("results")) {
+        results = jsonDecoder._decodeList(jsonPath + ".results", json["results"], (String jsonPath, Object json) => new SearchResult.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "results");
+      }
+      bool isLast;
+      if (json.containsKey("isLast")) {
+        isLast = jsonDecoder._decodeBool(jsonPath + ".isLast", json["isLast"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isLast");
+      }
+      return new SearchResultsParams(id, results, isLast);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.results params");
+    }
+  }
+
+  factory SearchResultsParams.fromNotification(Notification notification) {
+    return new SearchResultsParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    result["results"] = results.map((SearchResult value) => value.toJson()).toList();
+    result["isLast"] = isLast;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("search.results", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchResultsParams) {
+      return id == other.id &&
+          _listEqual(results, other.results, (SearchResult a, SearchResult b) => a == b) &&
+          isLast == other.isLast;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, results.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isLast.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAssists params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class EditGetAssistsParams {
+  /**
+   * The file containing the code for which assists are being requested.
+   */
+  String file;
+
+  /**
+   * The offset of the code for which assists are being requested.
+   */
+  int offset;
+
+  /**
+   * The length of the code for which assists are being requested.
+   */
+  int length;
+
+  EditGetAssistsParams(this.file, this.offset, this.length);
+
+  factory EditGetAssistsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new EditGetAssistsParams(file, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAssists params");
+    }
+  }
+
+  factory EditGetAssistsParams.fromRequest(Request request) {
+    return new EditGetAssistsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getAssists", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAssistsParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAssists result
+ *
+ * {
+ *   "assists": List<SourceChange>
+ * }
+ */
+class EditGetAssistsResult {
+  /**
+   * The assists that are available at the given location.
+   */
+  List<SourceChange> assists;
+
+  EditGetAssistsResult(this.assists);
+
+  factory EditGetAssistsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<SourceChange> assists;
+      if (json.containsKey("assists")) {
+        assists = jsonDecoder._decodeList(jsonPath + ".assists", json["assists"], (String jsonPath, Object json) => new SourceChange.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "assists");
+      }
+      return new EditGetAssistsResult(assists);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAssists result");
+    }
+  }
+
+  factory EditGetAssistsResult.fromResponse(Response response) {
+    return new EditGetAssistsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["assists"] = assists.map((SourceChange value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAssistsResult) {
+      return _listEqual(assists, other.assists, (SourceChange a, SourceChange b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, assists.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAvailableRefactorings params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class EditGetAvailableRefactoringsParams {
+  /**
+   * The file containing the code on which the refactoring would be based.
+   */
+  String file;
+
+  /**
+   * The offset of the code on which the refactoring would be based.
+   */
+  int offset;
+
+  /**
+   * The length of the code on which the refactoring would be based.
+   */
+  int length;
+
+  EditGetAvailableRefactoringsParams(this.file, this.offset, this.length);
+
+  factory EditGetAvailableRefactoringsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new EditGetAvailableRefactoringsParams(file, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAvailableRefactorings params");
+    }
+  }
+
+  factory EditGetAvailableRefactoringsParams.fromRequest(Request request) {
+    return new EditGetAvailableRefactoringsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getAvailableRefactorings", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAvailableRefactoringsParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAvailableRefactorings result
+ *
+ * {
+ *   "kinds": List<RefactoringKind>
+ * }
+ */
+class EditGetAvailableRefactoringsResult {
+  /**
+   * The kinds of refactorings that are valid for the given selection.
+   */
+  List<RefactoringKind> kinds;
+
+  EditGetAvailableRefactoringsResult(this.kinds);
+
+  factory EditGetAvailableRefactoringsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<RefactoringKind> kinds;
+      if (json.containsKey("kinds")) {
+        kinds = jsonDecoder._decodeList(jsonPath + ".kinds", json["kinds"], (String jsonPath, Object json) => new RefactoringKind.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kinds");
+      }
+      return new EditGetAvailableRefactoringsResult(kinds);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAvailableRefactorings result");
+    }
+  }
+
+  factory EditGetAvailableRefactoringsResult.fromResponse(Response response) {
+    return new EditGetAvailableRefactoringsResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kinds"] = kinds.map((RefactoringKind value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAvailableRefactoringsResult) {
+      return _listEqual(kinds, other.kinds, (RefactoringKind a, RefactoringKind b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kinds.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getFixes params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class EditGetFixesParams {
+  /**
+   * The file containing the errors for which fixes are being requested.
+   */
+  String file;
+
+  /**
+   * The offset used to select the errors for which fixes will be returned.
+   */
+  int offset;
+
+  EditGetFixesParams(this.file, this.offset);
+
+  factory EditGetFixesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new EditGetFixesParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getFixes params");
+    }
+  }
+
+  factory EditGetFixesParams.fromRequest(Request request) {
+    return new EditGetFixesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getFixes", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetFixesParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getFixes result
+ *
+ * {
+ *   "fixes": List<ErrorFixes>
+ * }
+ */
+class EditGetFixesResult {
+  /**
+   * The fixes that are available for each of the analysis errors. There is a
+   * one-to-one correspondence between the analysis errors in the request and
+   * the lists of changes in the response. In particular, it is always the case
+   * that errors.length == fixes.length and that fixes[i] is the list of fixes
+   * for the error in errors[i]. The list of changes corresponding to an error
+   * can be empty if there are no fixes available for that error.
+   */
+  List<ErrorFixes> fixes;
+
+  EditGetFixesResult(this.fixes);
+
+  factory EditGetFixesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ErrorFixes> fixes;
+      if (json.containsKey("fixes")) {
+        fixes = jsonDecoder._decodeList(jsonPath + ".fixes", json["fixes"], (String jsonPath, Object json) => new ErrorFixes.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fixes");
+      }
+      return new EditGetFixesResult(fixes);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getFixes result");
+    }
+  }
+
+  factory EditGetFixesResult.fromResponse(Response response) {
+    return new EditGetFixesResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["fixes"] = fixes.map((ErrorFixes value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetFixesResult) {
+      return _listEqual(fixes, other.fixes, (ErrorFixes a, ErrorFixes b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, fixes.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getRefactoring params
+ *
+ * {
+ *   "kind": RefactoringKind
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "validateOnly": bool
+ *   "options": optional object
+ * }
+ */
+class EditGetRefactoringParams {
+  /**
+   * The kind of refactoring to be performed.
+   */
+  RefactoringKind kind;
+
+  /**
+   * The file containing the code involved in the refactoring.
+   */
+  String file;
+
+  /**
+   * The offset of the region involved in the refactoring.
+   */
+  int offset;
+
+  /**
+   * The length of the region involved in the refactoring.
+   */
+  int length;
+
+  /**
+   * True if the client is only requesting that the values of the options be
+   * validated and no change be generated.
+   */
+  bool validateOnly;
+
+  /**
+   * Data used to provide values provided by the user. The structure of the
+   * data is dependent on the kind of refactoring being performed. The data
+   * that is expected is documented in the section titled Refactorings, labeled
+   * as “Options”. This field can be omitted if the refactoring does not
+   * require any options or if the values of those options are not known.
+   */
+  Object options;
+
+  EditGetRefactoringParams(this.kind, this.file, this.offset, this.length, this.validateOnly, {this.options});
+
+  factory EditGetRefactoringParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      RefactoringKind kind;
+      if (json.containsKey("kind")) {
+        kind = new RefactoringKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      bool validateOnly;
+      if (json.containsKey("validateOnly")) {
+        validateOnly = jsonDecoder._decodeBool(jsonPath + ".validateOnly", json["validateOnly"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "validateOnly");
+      }
+      Object options;
+      if (json.containsKey("options")) {
+        options = json["options"];
+      }
+      return new EditGetRefactoringParams(kind, file, offset, length, validateOnly, options: options);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getRefactoring params");
+    }
+  }
+
+  factory EditGetRefactoringParams.fromRequest(Request request) {
+    return new EditGetRefactoringParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    result["validateOnly"] = validateOnly;
+    if (options != null) {
+      result["options"] = options;
+    }
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getRefactoring", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetRefactoringParams) {
+      return kind == other.kind &&
+          file == other.file &&
+          offset == other.offset &&
+          length == other.length &&
+          validateOnly == other.validateOnly &&
+          options == other.options;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, validateOnly.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, options.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getRefactoring result
+ *
+ * {
+ *   "problems": List<RefactoringProblem>
+ *   "feedback": optional object
+ *   "change": optional SourceChange
+ *   "potentialEdits": optional List<String>
+ * }
+ */
+class EditGetRefactoringResult {
+  /**
+   * The status of the refactoring. The array will be empty if there are no
+   * known problems.
+   */
+  List<RefactoringProblem> problems;
+
+  /**
+   * Data used to provide feedback to the user. The structure of the data is
+   * dependent on the kind of refactoring being created. The data that is
+   * returned is documented in the section titled Refactorings, labeled as
+   * “Feedback”.
+   */
+  Object feedback;
+
+  /**
+   * The changes that are to be applied to affect the refactoring. This field
+   * will be omitted if there are problems that prevent a set of changes from
+   * being computed, such as having no options specified for a refactoring that
+   * requires them, or if only validation was requested.
+   */
+  SourceChange change;
+
+  /**
+   * The ids of source edits that are not known to be valid. An edit is not
+   * known to be valid if there was insufficient type information for the
+   * server to be able to determine whether or not the code needs to be
+   * modified, such as when a member is being renamed and there is a reference
+   * to a member from an unknown type. This field will be omitted if the change
+   * field is omitted or if there are no potential edits for the refactoring.
+   */
+  List<String> potentialEdits;
+
+  EditGetRefactoringResult(this.problems, {this.feedback, this.change, this.potentialEdits}) {
+    if (potentialEdits == null) {
+      potentialEdits = <String>[];
+    }
+  }
+
+  factory EditGetRefactoringResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<RefactoringProblem> problems;
+      if (json.containsKey("problems")) {
+        problems = jsonDecoder._decodeList(jsonPath + ".problems", json["problems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "problems");
+      }
+      Object feedback;
+      if (json.containsKey("feedback")) {
+        feedback = json["feedback"];
+      }
+      SourceChange change;
+      if (json.containsKey("change")) {
+        change = new SourceChange.fromJson(jsonDecoder, jsonPath + ".change", json["change"]);
+      }
+      List<String> potentialEdits;
+      if (json.containsKey("potentialEdits")) {
+        potentialEdits = jsonDecoder._decodeList(jsonPath + ".potentialEdits", json["potentialEdits"], jsonDecoder._decodeString);
+      } else {
+        potentialEdits = <String>[];
+      }
+      return new EditGetRefactoringResult(problems, feedback: feedback, change: change, potentialEdits: potentialEdits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getRefactoring result");
+    }
+  }
+
+  factory EditGetRefactoringResult.fromResponse(Response response) {
+    return new EditGetRefactoringResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["problems"] = problems.map((RefactoringProblem value) => value.toJson()).toList();
+    if (feedback != null) {
+      result["feedback"] = feedback;
+    }
+    if (change != null) {
+      result["change"] = change.toJson();
+    }
+    if (potentialEdits.isNotEmpty) {
+      result["potentialEdits"] = potentialEdits;
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetRefactoringResult) {
+      return _listEqual(problems, other.problems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          feedback == other.feedback &&
+          change == other.change &&
+          _listEqual(potentialEdits, other.potentialEdits, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, problems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, feedback.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, change.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, potentialEdits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * debug.createContext params
+ *
+ * {
+ *   "contextRoot": FilePath
+ * }
+ */
+class DebugCreateContextParams {
+  /**
+   * The path of the Dart or HTML file that will be launched.
+   */
+  String contextRoot;
+
+  DebugCreateContextParams(this.contextRoot);
+
+  factory DebugCreateContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String contextRoot;
+      if (json.containsKey("contextRoot")) {
+        contextRoot = jsonDecoder._decodeString(jsonPath + ".contextRoot", json["contextRoot"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "contextRoot");
+      }
+      return new DebugCreateContextParams(contextRoot);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.createContext params");
+    }
+  }
+
+  factory DebugCreateContextParams.fromRequest(Request request) {
+    return new DebugCreateContextParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["contextRoot"] = contextRoot;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "debug.createContext", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugCreateContextParams) {
+      return contextRoot == other.contextRoot;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, contextRoot.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * debug.createContext result
+ *
+ * {
+ *   "id": DebugContextId
+ * }
+ */
+class DebugCreateContextResult {
+  /**
+   * The identifier used to refer to the debugging context that was created.
+   */
+  String id;
+
+  DebugCreateContextResult(this.id);
+
+  factory DebugCreateContextResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new DebugCreateContextResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.createContext result");
+    }
+  }
+
+  factory DebugCreateContextResult.fromResponse(Response response) {
+    return new DebugCreateContextResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugCreateContextResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * debug.deleteContext params
+ *
+ * {
+ *   "id": DebugContextId
+ * }
+ */
+class DebugDeleteContextParams {
+  /**
+   * The identifier of the debugging context that is to be deleted.
+   */
+  String id;
+
+  DebugDeleteContextParams(this.id);
+
+  factory DebugDeleteContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new DebugDeleteContextParams(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.deleteContext params");
+    }
+  }
+
+  factory DebugDeleteContextParams.fromRequest(Request request) {
+    return new DebugDeleteContextParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "debug.deleteContext", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugDeleteContextParams) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * debug.deleteContext result
+ */
+class DebugDeleteContextResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is DebugDeleteContextResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 923895626;
+  }
+}
+
+/**
+ * debug.mapUri params
+ *
+ * {
+ *   "id": DebugContextId
+ *   "file": optional FilePath
+ *   "uri": optional String
+ * }
+ */
+class DebugMapUriParams {
+  /**
+   * The identifier of the debugging context in which the URI is to be mapped.
+   */
+  String id;
+
+  /**
+   * The path of the file to be mapped into a URI.
+   */
+  String file;
+
+  /**
+   * The URI to be mapped into a file path.
+   */
+  String uri;
+
+  DebugMapUriParams(this.id, {this.file, this.uri});
+
+  factory DebugMapUriParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      }
+      String uri;
+      if (json.containsKey("uri")) {
+        uri = jsonDecoder._decodeString(jsonPath + ".uri", json["uri"]);
+      }
+      return new DebugMapUriParams(id, file: file, uri: uri);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.mapUri params");
+    }
+  }
+
+  factory DebugMapUriParams.fromRequest(Request request) {
+    return new DebugMapUriParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    if (file != null) {
+      result["file"] = file;
+    }
+    if (uri != null) {
+      result["uri"] = uri;
+    }
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "debug.mapUri", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugMapUriParams) {
+      return id == other.id &&
+          file == other.file &&
+          uri == other.uri;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, uri.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * debug.mapUri result
+ *
+ * {
+ *   "file": optional FilePath
+ *   "uri": optional String
+ * }
+ */
+class DebugMapUriResult {
+  /**
+   * The file to which the URI was mapped. This field is omitted if the uri
+   * field was not given in the request.
+   */
+  String file;
+
+  /**
+   * The URI to which the file path was mapped. This field is omitted if the
+   * file field was not given in the request.
+   */
+  String uri;
+
+  DebugMapUriResult({this.file, this.uri});
+
+  factory DebugMapUriResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      }
+      String uri;
+      if (json.containsKey("uri")) {
+        uri = jsonDecoder._decodeString(jsonPath + ".uri", json["uri"]);
+      }
+      return new DebugMapUriResult(file: file, uri: uri);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.mapUri result");
+    }
+  }
+
+  factory DebugMapUriResult.fromResponse(Response response) {
+    return new DebugMapUriResult.fromJson(
+        new ResponseDecoder(), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (file != null) {
+      result["file"] = file;
+    }
+    if (uri != null) {
+      result["uri"] = uri;
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugMapUriResult) {
+      return file == other.file &&
+          uri == other.uri;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, uri.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * debug.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": List<DebugService>
+ * }
+ */
+class DebugSetSubscriptionsParams {
+  /**
+   * A list of the services being subscribed to.
+   */
+  List<DebugService> subscriptions;
+
+  DebugSetSubscriptionsParams(this.subscriptions);
+
+  factory DebugSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<DebugService> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeList(jsonPath + ".subscriptions", json["subscriptions"], (String jsonPath, Object json) => new DebugService.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new DebugSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.setSubscriptions params");
+    }
+  }
+
+  factory DebugSetSubscriptionsParams.fromRequest(Request request) {
+    return new DebugSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = subscriptions.map((DebugService value) => value.toJson()).toList();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "debug.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugSetSubscriptionsParams) {
+      return _listEqual(subscriptions, other.subscriptions, (DebugService a, DebugService b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * debug.setSubscriptions result
+ */
+class DebugSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is DebugSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 36732888;
+  }
+}
+
+/**
+ * debug.launchData params
+ *
+ * {
+ *   "executables": List<ExecutableFile>
+ *   "dartToHtml": Map<FilePath, List<FilePath>>
+ *   "htmlToDart": Map<FilePath, List<FilePath>>
+ * }
+ */
+class DebugLaunchDataParams {
+  /**
+   * A list of the files that are executable in the given context. This list
+   * replaces any previous list provided for the given context.
+   */
+  List<ExecutableFile> executables;
+
+  /**
+   * A mapping from the paths of Dart files that are referenced by HTML files
+   * to a list of the HTML files that reference the Dart files.
+   */
+  Map<String, List<String>> dartToHtml;
+
+  /**
+   * A mapping from the paths of HTML files that reference Dart files to a list
+   * of the Dart files they reference.
+   */
+  Map<String, List<String>> htmlToDart;
+
+  DebugLaunchDataParams(this.executables, this.dartToHtml, this.htmlToDart);
+
+  factory DebugLaunchDataParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ExecutableFile> executables;
+      if (json.containsKey("executables")) {
+        executables = jsonDecoder._decodeList(jsonPath + ".executables", json["executables"], (String jsonPath, Object json) => new ExecutableFile.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "executables");
+      }
+      Map<String, List<String>> dartToHtml;
+      if (json.containsKey("dartToHtml")) {
+        dartToHtml = jsonDecoder._decodeMap(jsonPath + ".dartToHtml", json["dartToHtml"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "dartToHtml");
+      }
+      Map<String, List<String>> htmlToDart;
+      if (json.containsKey("htmlToDart")) {
+        htmlToDart = jsonDecoder._decodeMap(jsonPath + ".htmlToDart", json["htmlToDart"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "htmlToDart");
+      }
+      return new DebugLaunchDataParams(executables, dartToHtml, htmlToDart);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "debug.launchData params");
+    }
+  }
+
+  factory DebugLaunchDataParams.fromNotification(Notification notification) {
+    return new DebugLaunchDataParams.fromJson(
+        new ResponseDecoder(), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["executables"] = executables.map((ExecutableFile value) => value.toJson()).toList();
+    result["dartToHtml"] = dartToHtml;
+    result["htmlToDart"] = htmlToDart;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("debug.launchData", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DebugLaunchDataParams) {
+      return _listEqual(executables, other.executables, (ExecutableFile a, ExecutableFile b) => a == b) &&
+          _mapEqual(dartToHtml, other.dartToHtml, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b)) &&
+          _mapEqual(htmlToDart, other.htmlToDart, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b));
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, executables.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, dartToHtml.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, htmlToDart.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AddContentOverlay
+ *
+ * {
+ *   "type": "add"
+ *   "content": String
+ * }
+ */
+class AddContentOverlay {
+  /**
+   * The new content of the file.
+   */
+  String content;
+
+  AddContentOverlay(this.content);
+
+  factory AddContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "add") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "add");
+      }
+      String content;
+      if (json.containsKey("content")) {
+        content = jsonDecoder._decodeString(jsonPath + ".content", json["content"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "content");
+      }
+      return new AddContentOverlay(content);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AddContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "add";
+    result["content"] = content;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AddContentOverlay) {
+      return content == other.content;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 704418402);
+    hash = _JenkinsSmiHash.combine(hash, content.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisError
+ *
+ * {
+ *   "severity": ErrorSeverity
+ *   "type": ErrorType
+ *   "location": Location
+ *   "message": String
+ *   "correction": optional String
+ * }
+ */
+class AnalysisError {
+  /**
+   * Returns a list of AnalysisErrors correponding to the given list of Engine
+   * errors.
+   */
+  static List<AnalysisError> listFromEngine(engine.LineInfo lineInfo, List<engine.AnalysisError> errors) =>
+      _analysisErrorListFromEngine(lineInfo, errors);
+
+  /**
+   * The severity of the error.
+   */
+  ErrorSeverity severity;
+
+  /**
+   * The type of the error.
+   */
+  ErrorType type;
+
+  /**
+   * The location associated with the error.
+   */
+  Location location;
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong with the code and why it is wrong.
+   */
+  String message;
+
+  /**
+   * The correction message to be displayed for this error. The correction
+   * message should indicate how the user can fix the error. The field is
+   * omitted if there is no correction message associated with the error code.
+   */
+  String correction;
+
+  AnalysisError(this.severity, this.type, this.location, this.message, {this.correction});
+
+  factory AnalysisError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      ErrorSeverity severity;
+      if (json.containsKey("severity")) {
+        severity = new ErrorSeverity.fromJson(jsonDecoder, jsonPath + ".severity", json["severity"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "severity");
+      }
+      ErrorType type;
+      if (json.containsKey("type")) {
+        type = new ErrorType.fromJson(jsonDecoder, jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "location");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      String correction;
+      if (json.containsKey("correction")) {
+        correction = jsonDecoder._decodeString(jsonPath + ".correction", json["correction"]);
+      }
+      return new AnalysisError(severity, type, location, message, correction: correction);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisError");
+    }
+  }
+
+  /**
+   * Construct based on error information from the analyzer engine.
+   */
+  factory AnalysisError.fromEngine(engine.LineInfo lineInfo, engine.AnalysisError error) =>
+      _analysisErrorFromEngine(lineInfo, error);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["severity"] = severity.toJson();
+    result["type"] = type.toJson();
+    result["location"] = location.toJson();
+    result["message"] = message;
+    if (correction != null) {
+      result["correction"] = correction;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisError) {
+      return severity == other.severity &&
+          type == other.type &&
+          location == other.location &&
+          message == other.message &&
+          correction == other.correction;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, severity.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, correction.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisOptions
+ *
+ * {
+ *   "enableAsync": optional bool
+ *   "enableDeferredLoading": optional bool
+ *   "enableEnums": optional bool
+ *   "generateDart2jsHints": optional bool
+ *   "generateHints": optional bool
+ * }
+ */
+class AnalysisOptions {
+  /**
+   * True if the client wants to enable support for the proposed async feature.
+   */
+  bool enableAsync;
+
+  /**
+   * True if the client wants to enable support for the proposed deferred
+   * loading feature.
+   */
+  bool enableDeferredLoading;
+
+  /**
+   * True if the client wants to enable support for the proposed enum feature.
+   */
+  bool enableEnums;
+
+  /**
+   * True if hints that are specific to dart2js should be generated. This
+   * option is ignored if generateHints is false.
+   */
+  bool generateDart2jsHints;
+
+  /**
+   * True is hints should be generated as part of generating errors and
+   * warnings.
+   */
+  bool generateHints;
+
+  AnalysisOptions({this.enableAsync, this.enableDeferredLoading, this.enableEnums, this.generateDart2jsHints, this.generateHints});
+
+  factory AnalysisOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool enableAsync;
+      if (json.containsKey("enableAsync")) {
+        enableAsync = jsonDecoder._decodeBool(jsonPath + ".enableAsync", json["enableAsync"]);
+      }
+      bool enableDeferredLoading;
+      if (json.containsKey("enableDeferredLoading")) {
+        enableDeferredLoading = jsonDecoder._decodeBool(jsonPath + ".enableDeferredLoading", json["enableDeferredLoading"]);
+      }
+      bool enableEnums;
+      if (json.containsKey("enableEnums")) {
+        enableEnums = jsonDecoder._decodeBool(jsonPath + ".enableEnums", json["enableEnums"]);
+      }
+      bool generateDart2jsHints;
+      if (json.containsKey("generateDart2jsHints")) {
+        generateDart2jsHints = jsonDecoder._decodeBool(jsonPath + ".generateDart2jsHints", json["generateDart2jsHints"]);
+      }
+      bool generateHints;
+      if (json.containsKey("generateHints")) {
+        generateHints = jsonDecoder._decodeBool(jsonPath + ".generateHints", json["generateHints"]);
+      }
+      return new AnalysisOptions(enableAsync: enableAsync, enableDeferredLoading: enableDeferredLoading, enableEnums: enableEnums, generateDart2jsHints: generateDart2jsHints, generateHints: generateHints);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisOptions");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (enableAsync != null) {
+      result["enableAsync"] = enableAsync;
+    }
+    if (enableDeferredLoading != null) {
+      result["enableDeferredLoading"] = enableDeferredLoading;
+    }
+    if (enableEnums != null) {
+      result["enableEnums"] = enableEnums;
+    }
+    if (generateDart2jsHints != null) {
+      result["generateDart2jsHints"] = generateDart2jsHints;
+    }
+    if (generateHints != null) {
+      result["generateHints"] = generateHints;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOptions) {
+      return enableAsync == other.enableAsync &&
+          enableDeferredLoading == other.enableDeferredLoading &&
+          enableEnums == other.enableEnums &&
+          generateDart2jsHints == other.generateDart2jsHints &&
+          generateHints == other.generateHints;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, enableAsync.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, enableDeferredLoading.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, enableEnums.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, generateDart2jsHints.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, generateHints.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisService
+ *
+ * enum {
+ *   FOLDING
+ *   HIGHLIGHTS
+ *   NAVIGATION
+ *   OCCURRENCES
+ *   OUTLINE
+ *   OVERRIDES
+ * }
+ */
+class AnalysisService {
+  static const FOLDING = const AnalysisService._("FOLDING");
+
+  static const HIGHLIGHTS = const AnalysisService._("HIGHLIGHTS");
+
+  static const NAVIGATION = const AnalysisService._("NAVIGATION");
+
+  static const OCCURRENCES = const AnalysisService._("OCCURRENCES");
+
+  static const OUTLINE = const AnalysisService._("OUTLINE");
+
+  static const OVERRIDES = const AnalysisService._("OVERRIDES");
+
+  final String name;
+
+  const AnalysisService._(this.name);
+
+  factory AnalysisService(String name) {
+    switch (name) {
+      case "FOLDING":
+        return FOLDING;
+      case "HIGHLIGHTS":
+        return HIGHLIGHTS;
+      case "NAVIGATION":
+        return NAVIGATION;
+      case "OCCURRENCES":
+        return OCCURRENCES;
+      case "OUTLINE":
+        return OUTLINE;
+      case "OVERRIDES":
+        return OVERRIDES;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory AnalysisService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new AnalysisService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "AnalysisService");
+  }
+
+  @override
+  String toString() => "AnalysisService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * AnalysisStatus
+ *
+ * {
+ *   "isAnalyzing": bool
+ *   "analysisTarget": optional String
+ * }
+ */
+class AnalysisStatus {
+  /**
+   * True if analysis is currently being performed.
+   */
+  bool isAnalyzing;
+
+  /**
+   * The name of the current target of analysis. This field is omitted if
+   * analyzing is false.
+   */
+  String analysisTarget;
+
+  AnalysisStatus(this.isAnalyzing, {this.analysisTarget});
+
+  factory AnalysisStatus.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool isAnalyzing;
+      if (json.containsKey("isAnalyzing")) {
+        isAnalyzing = jsonDecoder._decodeBool(jsonPath + ".isAnalyzing", json["isAnalyzing"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isAnalyzing");
+      }
+      String analysisTarget;
+      if (json.containsKey("analysisTarget")) {
+        analysisTarget = jsonDecoder._decodeString(jsonPath + ".analysisTarget", json["analysisTarget"]);
+      }
+      return new AnalysisStatus(isAnalyzing, analysisTarget: analysisTarget);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisStatus");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["isAnalyzing"] = isAnalyzing;
+    if (analysisTarget != null) {
+      result["analysisTarget"] = analysisTarget;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisStatus) {
+      return isAnalyzing == other.isAnalyzing &&
+          analysisTarget == other.analysisTarget;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, isAnalyzing.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, analysisTarget.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ChangeContentOverlay
+ *
+ * {
+ *   "type": "change"
+ *   "edits": List<SourceEdit>
+ * }
+ */
+class ChangeContentOverlay {
+  /**
+   * The edits to be applied to the file.
+   */
+  List<SourceEdit> edits;
+
+  ChangeContentOverlay(this.edits);
+
+  factory ChangeContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "change") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "change");
+      }
+      List<SourceEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      return new ChangeContentOverlay(edits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "ChangeContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "change";
+    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ChangeContentOverlay) {
+      return _listEqual(edits, other.edits, (SourceEdit a, SourceEdit b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 873118866);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * CompletionRelevance
+ *
+ * enum {
+ *   LOW
+ *   DEFAULT
+ *   HIGH
+ * }
+ */
+class CompletionRelevance {
+  static const LOW = const CompletionRelevance._("LOW");
+
+  static const DEFAULT = const CompletionRelevance._("DEFAULT");
+
+  static const HIGH = const CompletionRelevance._("HIGH");
+
+  final String name;
+
+  const CompletionRelevance._(this.name);
+
+  factory CompletionRelevance(String name) {
+    switch (name) {
+      case "LOW":
+        return LOW;
+      case "DEFAULT":
+        return DEFAULT;
+      case "HIGH":
+        return HIGH;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionRelevance.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new CompletionRelevance(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "CompletionRelevance");
+  }
+
+  @override
+  String toString() => "CompletionRelevance.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * CompletionSuggestion
+ *
+ * {
+ *   "kind": CompletionSuggestionKind
+ *   "relevance": CompletionRelevance
+ *   "completion": String
+ *   "selectionOffset": int
+ *   "selectionLength": int
+ *   "isDeprecated": bool
+ *   "isPotential": bool
+ *   "docSummary": optional String
+ *   "docComplete": optional String
+ *   "declaringType": optional String
+ *   "returnType": optional String
+ *   "parameterNames": optional List<String>
+ *   "parameterTypes": optional List<String>
+ *   "requiredParameterCount": optional int
+ *   "positionalParameterCount": optional int
+ *   "parameterName": optional String
+ *   "parameterType": optional String
+ * }
+ */
+class CompletionSuggestion {
+  /**
+   * The kind of element being suggested.
+   */
+  CompletionSuggestionKind kind;
+
+  /**
+   * The relevance of this completion suggestion.
+   */
+  CompletionRelevance relevance;
+
+  /**
+   * The identifier to be inserted if the suggestion is selected. If the
+   * suggestion is for a method or function, the client might want to
+   * additionally insert a template for the parameters. The information
+   * required in order to do so is contained in other fields.
+   */
+  String completion;
+
+  /**
+   * The offset, relative to the beginning of the completion, of where the
+   * selection should be placed after insertion.
+   */
+  int selectionOffset;
+
+  /**
+   * The number of characters that should be selected after insertion.
+   */
+  int selectionLength;
+
+  /**
+   * True if the suggested element is deprecated.
+   */
+  bool isDeprecated;
+
+  /**
+   * True if the element is not known to be valid for the target. This happens
+   * if the type of the target is dynamic.
+   */
+  bool isPotential;
+
+  /**
+   * An abbreviated version of the Dartdoc associated with the element being
+   * suggested, This field is omitted if there is no Dartdoc associated with
+   * the element.
+   */
+  String docSummary;
+
+  /**
+   * The Dartdoc associated with the element being suggested, This field is
+   * omitted if there is no Dartdoc associated with the element.
+   */
+  String docComplete;
+
+  /**
+   * The class that declares the element being suggested. This field is omitted
+   * if the suggested element is not a member of a class.
+   */
+  String declaringType;
+
+  /**
+   * The return type of the getter, function or method being suggested. This
+   * field is omitted if the suggested element is not a getter, function or
+   * method.
+   */
+  String returnType;
+
+  /**
+   * The names of the parameters of the function or method being suggested.
+   * This field is omitted if the suggested element is not a setter, function
+   * or method.
+   */
+  List<String> parameterNames;
+
+  /**
+   * The types of the parameters of the function or method being suggested.
+   * This field is omitted if the parameterNames field is omitted.
+   */
+  List<String> parameterTypes;
+
+  /**
+   * The number of required parameters for the function or method being
+   * suggested. This field is omitted if the parameterNames field is omitted.
+   */
+  int requiredParameterCount;
+
+  /**
+   * The number of positional parameters for the function or method being
+   * suggested. This field is omitted if the parameterNames field is omitted.
+   */
+  int positionalParameterCount;
+
+  /**
+   * The name of the optional parameter being suggested. This field is omitted
+   * if the suggestion is not the addition of an optional argument within an
+   * argument list.
+   */
+  String parameterName;
+
+  /**
+   * The type of the options parameter being suggested. This field is omitted
+   * if the parameterName field is omitted.
+   */
+  String parameterType;
+
+  CompletionSuggestion(this.kind, this.relevance, this.completion, this.selectionOffset, this.selectionLength, this.isDeprecated, this.isPotential, {this.docSummary, this.docComplete, this.declaringType, this.returnType, this.parameterNames, this.parameterTypes, this.requiredParameterCount, this.positionalParameterCount, this.parameterName, this.parameterType}) {
+    if (parameterNames == null) {
+      parameterNames = <String>[];
+    }
+    if (parameterTypes == null) {
+      parameterTypes = <String>[];
+    }
+  }
+
+  factory CompletionSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      CompletionSuggestionKind kind;
+      if (json.containsKey("kind")) {
+        kind = new CompletionSuggestionKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      CompletionRelevance relevance;
+      if (json.containsKey("relevance")) {
+        relevance = new CompletionRelevance.fromJson(jsonDecoder, jsonPath + ".relevance", json["relevance"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "relevance");
+      }
+      String completion;
+      if (json.containsKey("completion")) {
+        completion = jsonDecoder._decodeString(jsonPath + ".completion", json["completion"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "completion");
+      }
+      int selectionOffset;
+      if (json.containsKey("selectionOffset")) {
+        selectionOffset = jsonDecoder._decodeInt(jsonPath + ".selectionOffset", json["selectionOffset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "selectionOffset");
+      }
+      int selectionLength;
+      if (json.containsKey("selectionLength")) {
+        selectionLength = jsonDecoder._decodeInt(jsonPath + ".selectionLength", json["selectionLength"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "selectionLength");
+      }
+      bool isDeprecated;
+      if (json.containsKey("isDeprecated")) {
+        isDeprecated = jsonDecoder._decodeBool(jsonPath + ".isDeprecated", json["isDeprecated"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isDeprecated");
+      }
+      bool isPotential;
+      if (json.containsKey("isPotential")) {
+        isPotential = jsonDecoder._decodeBool(jsonPath + ".isPotential", json["isPotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isPotential");
+      }
+      String docSummary;
+      if (json.containsKey("docSummary")) {
+        docSummary = jsonDecoder._decodeString(jsonPath + ".docSummary", json["docSummary"]);
+      }
+      String docComplete;
+      if (json.containsKey("docComplete")) {
+        docComplete = jsonDecoder._decodeString(jsonPath + ".docComplete", json["docComplete"]);
+      }
+      String declaringType;
+      if (json.containsKey("declaringType")) {
+        declaringType = jsonDecoder._decodeString(jsonPath + ".declaringType", json["declaringType"]);
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      }
+      List<String> parameterNames;
+      if (json.containsKey("parameterNames")) {
+        parameterNames = jsonDecoder._decodeList(jsonPath + ".parameterNames", json["parameterNames"], jsonDecoder._decodeString);
+      } else {
+        parameterNames = <String>[];
+      }
+      List<String> parameterTypes;
+      if (json.containsKey("parameterTypes")) {
+        parameterTypes = jsonDecoder._decodeList(jsonPath + ".parameterTypes", json["parameterTypes"], jsonDecoder._decodeString);
+      } else {
+        parameterTypes = <String>[];
+      }
+      int requiredParameterCount;
+      if (json.containsKey("requiredParameterCount")) {
+        requiredParameterCount = jsonDecoder._decodeInt(jsonPath + ".requiredParameterCount", json["requiredParameterCount"]);
+      }
+      int positionalParameterCount;
+      if (json.containsKey("positionalParameterCount")) {
+        positionalParameterCount = jsonDecoder._decodeInt(jsonPath + ".positionalParameterCount", json["positionalParameterCount"]);
+      }
+      String parameterName;
+      if (json.containsKey("parameterName")) {
+        parameterName = jsonDecoder._decodeString(jsonPath + ".parameterName", json["parameterName"]);
+      }
+      String parameterType;
+      if (json.containsKey("parameterType")) {
+        parameterType = jsonDecoder._decodeString(jsonPath + ".parameterType", json["parameterType"]);
+      }
+      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, positionalParameterCount: positionalParameterCount, parameterName: parameterName, parameterType: parameterType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["relevance"] = relevance.toJson();
+    result["completion"] = completion;
+    result["selectionOffset"] = selectionOffset;
+    result["selectionLength"] = selectionLength;
+    result["isDeprecated"] = isDeprecated;
+    result["isPotential"] = isPotential;
+    if (docSummary != null) {
+      result["docSummary"] = docSummary;
+    }
+    if (docComplete != null) {
+      result["docComplete"] = docComplete;
+    }
+    if (declaringType != null) {
+      result["declaringType"] = declaringType;
+    }
+    if (returnType != null) {
+      result["returnType"] = returnType;
+    }
+    if (parameterNames.isNotEmpty) {
+      result["parameterNames"] = parameterNames;
+    }
+    if (parameterTypes.isNotEmpty) {
+      result["parameterTypes"] = parameterTypes;
+    }
+    if (requiredParameterCount != null) {
+      result["requiredParameterCount"] = requiredParameterCount;
+    }
+    if (positionalParameterCount != null) {
+      result["positionalParameterCount"] = positionalParameterCount;
+    }
+    if (parameterName != null) {
+      result["parameterName"] = parameterName;
+    }
+    if (parameterType != null) {
+      result["parameterType"] = parameterType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionSuggestion) {
+      return kind == other.kind &&
+          relevance == other.relevance &&
+          completion == other.completion &&
+          selectionOffset == other.selectionOffset &&
+          selectionLength == other.selectionLength &&
+          isDeprecated == other.isDeprecated &&
+          isPotential == other.isPotential &&
+          docSummary == other.docSummary &&
+          docComplete == other.docComplete &&
+          declaringType == other.declaringType &&
+          returnType == other.returnType &&
+          _listEqual(parameterNames, other.parameterNames, (String a, String b) => a == b) &&
+          _listEqual(parameterTypes, other.parameterTypes, (String a, String b) => a == b) &&
+          requiredParameterCount == other.requiredParameterCount &&
+          positionalParameterCount == other.positionalParameterCount &&
+          parameterName == other.parameterName &&
+          parameterType == other.parameterType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, relevance.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, completion.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selectionOffset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selectionLength.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isDeprecated.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isPotential.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, docSummary.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, docComplete.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, declaringType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterNames.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterTypes.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, requiredParameterCount.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, positionalParameterCount.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * CompletionSuggestionKind
+ *
+ * enum {
+ *   ARGUMENT_LIST
+ *   CLASS
+ *   CLASS_ALIAS
+ *   CONSTRUCTOR
+ *   FIELD
+ *   FUNCTION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER
+ *   IMPORT
+ *   KEYWORD
+ *   LIBRARY_PREFIX
+ *   LOCAL_VARIABLE
+ *   METHOD
+ *   METHOD_NAME
+ *   NAMED_ARGUMENT
+ *   OPTIONAL_ARGUMENT
+ *   PARAMETER
+ *   SETTER
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_PARAMETER
+ * }
+ */
+class CompletionSuggestionKind {
+  static const ARGUMENT_LIST = const CompletionSuggestionKind._("ARGUMENT_LIST");
+
+  static const CLASS = const CompletionSuggestionKind._("CLASS");
+
+  static const CLASS_ALIAS = const CompletionSuggestionKind._("CLASS_ALIAS");
+
+  static const CONSTRUCTOR = const CompletionSuggestionKind._("CONSTRUCTOR");
+
+  static const FIELD = const CompletionSuggestionKind._("FIELD");
+
+  static const FUNCTION = const CompletionSuggestionKind._("FUNCTION");
+
+  static const FUNCTION_TYPE_ALIAS = const CompletionSuggestionKind._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER = const CompletionSuggestionKind._("GETTER");
+
+  static const IMPORT = const CompletionSuggestionKind._("IMPORT");
+
+  static const KEYWORD = const CompletionSuggestionKind._("KEYWORD");
+
+  static const LIBRARY_PREFIX = const CompletionSuggestionKind._("LIBRARY_PREFIX");
+
+  static const LOCAL_VARIABLE = const CompletionSuggestionKind._("LOCAL_VARIABLE");
+
+  static const METHOD = const CompletionSuggestionKind._("METHOD");
+
+  static const METHOD_NAME = const CompletionSuggestionKind._("METHOD_NAME");
+
+  static const NAMED_ARGUMENT = const CompletionSuggestionKind._("NAMED_ARGUMENT");
+
+  static const OPTIONAL_ARGUMENT = const CompletionSuggestionKind._("OPTIONAL_ARGUMENT");
+
+  static const PARAMETER = const CompletionSuggestionKind._("PARAMETER");
+
+  static const SETTER = const CompletionSuggestionKind._("SETTER");
+
+  static const TOP_LEVEL_VARIABLE = const CompletionSuggestionKind._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_PARAMETER = const CompletionSuggestionKind._("TYPE_PARAMETER");
+
+  final String name;
+
+  const CompletionSuggestionKind._(this.name);
+
+  factory CompletionSuggestionKind(String name) {
+    switch (name) {
+      case "ARGUMENT_LIST":
+        return ARGUMENT_LIST;
+      case "CLASS":
+        return CLASS;
+      case "CLASS_ALIAS":
+        return CLASS_ALIAS;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "FIELD":
+        return FIELD;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER":
+        return GETTER;
+      case "IMPORT":
+        return IMPORT;
+      case "KEYWORD":
+        return KEYWORD;
+      case "LIBRARY_PREFIX":
+        return LIBRARY_PREFIX;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "METHOD":
+        return METHOD;
+      case "METHOD_NAME":
+        return METHOD_NAME;
+      case "NAMED_ARGUMENT":
+        return NAMED_ARGUMENT;
+      case "OPTIONAL_ARGUMENT":
+        return OPTIONAL_ARGUMENT;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER":
+        return SETTER;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionSuggestionKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new CompletionSuggestionKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestionKind");
+  }
+
+  /**
+   * Construct from an analyzer engine element kind.
+   */
+  factory CompletionSuggestionKind.fromElementKind(engine.ElementKind kind) =>
+      _completionSuggestionKindFromElementKind(kind);
+
+  @override
+  String toString() => "CompletionSuggestionKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * DebugService
+ *
+ * enum {
+ *   LAUNCH_DATA
+ * }
+ */
+class DebugService {
+  static const LAUNCH_DATA = const DebugService._("LAUNCH_DATA");
+
+  final String name;
+
+  const DebugService._(this.name);
+
+  factory DebugService(String name) {
+    switch (name) {
+      case "LAUNCH_DATA":
+        return LAUNCH_DATA;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory DebugService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new DebugService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "DebugService");
+  }
+
+  @override
+  String toString() => "DebugService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * Element
+ *
+ * {
+ *   "kind": ElementKind
+ *   "name": String
+ *   "location": optional Location
+ *   "flags": int
+ *   "parameters": optional String
+ *   "returnType": optional String
+ * }
+ */
+class Element {
+  static const int FLAG_ABSTRACT = 0x01;
+  static const int FLAG_CONST = 0x02;
+  static const int FLAG_FINAL = 0x04;
+  static const int FLAG_STATIC = 0x08;
+  static const int FLAG_PRIVATE = 0x10;
+  static const int FLAG_DEPRECATED = 0x20;
+
+  static int makeFlags({isAbstract: false, isConst: false, isFinal: false, isStatic: false, isPrivate: false, isDeprecated: false}) {
+    int flags = 0;
+    if (isAbstract) flags |= FLAG_ABSTRACT;
+    if (isConst) flags |= FLAG_CONST;
+    if (isFinal) flags |= FLAG_FINAL;
+    if (isStatic) flags |= FLAG_STATIC;
+    if (isPrivate) flags |= FLAG_PRIVATE;
+    if (isDeprecated) flags |= FLAG_DEPRECATED;
+    return flags;
+  }
+
+  /**
+   * The kind of the element.
+   */
+  ElementKind kind;
+
+  /**
+   * The name of the element. This is typically used as the label in the
+   * outline.
+   */
+  String name;
+
+  /**
+   * The location of the name in the declaration of the element.
+   */
+  Location location;
+
+  /**
+   * A bit-map containing the following flags:
+   *
+   * - 0x01 - set if the element is explicitly or implicitly abstract
+   * - 0x02 - set if the element was declared to be ‘const’
+   * - 0x04 - set if the element was declared to be ‘final’
+   * - 0x08 - set if the element is a static member of a class or is a
+   *   top-level function or field
+   * - 0x10 - set if the element is private
+   * - 0x20 - set if the element is deprecated
+   */
+  int flags;
+
+  /**
+   * The parameter list for the element. If the element is not a method or
+   * function this field will not be defined. If the element has zero
+   * parameters, this field will have a value of "()".
+   */
+  String parameters;
+
+  /**
+   * The return type of the element. If the element is not a method or function
+   * this field will not be defined. If the element does not have a declared
+   * return type, this field will contain an empty string.
+   */
+  String returnType;
+
+  Element(this.kind, this.name, this.flags, {this.location, this.parameters, this.returnType});
+
+  factory Element.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      ElementKind kind;
+      if (json.containsKey("kind")) {
+        kind = new ElementKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      }
+      int flags;
+      if (json.containsKey("flags")) {
+        flags = jsonDecoder._decodeInt(jsonPath + ".flags", json["flags"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "flags");
+      }
+      String parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeString(jsonPath + ".parameters", json["parameters"]);
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      }
+      return new Element(kind, name, flags, location: location, parameters: parameters, returnType: returnType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Element");
+    }
+  }
+
+  /**
+   * Construct based on a value from the analyzer engine.
+   */
+  factory Element.fromEngine(engine.Element element) =>
+      elementFromEngine(element);
+
+  bool get isAbstract => (flags & FLAG_ABSTRACT) != 0;
+  bool get isConst => (flags & FLAG_CONST) != 0;
+  bool get isFinal => (flags & FLAG_FINAL) != 0;
+  bool get isStatic => (flags & FLAG_STATIC) != 0;
+  bool get isPrivate => (flags & FLAG_PRIVATE) != 0;
+  bool get isDeprecated => (flags & FLAG_DEPRECATED) != 0;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["name"] = name;
+    if (location != null) {
+      result["location"] = location.toJson();
+    }
+    result["flags"] = flags;
+    if (parameters != null) {
+      result["parameters"] = parameters;
+    }
+    if (returnType != null) {
+      result["returnType"] = returnType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Element) {
+      return kind == other.kind &&
+          name == other.name &&
+          location == other.location &&
+          flags == other.flags &&
+          parameters == other.parameters &&
+          returnType == other.returnType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, flags.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ElementKind
+ *
+ * enum {
+ *   CLASS
+ *   CLASS_TYPE_ALIAS
+ *   COMPILATION_UNIT
+ *   CONSTRUCTOR
+ *   FIELD
+ *   FUNCTION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER
+ *   LIBRARY
+ *   LOCAL_VARIABLE
+ *   METHOD
+ *   PARAMETER
+ *   SETTER
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_PARAMETER
+ *   UNIT_TEST_GROUP
+ *   UNIT_TEST_TEST
+ *   UNKNOWN
+ * }
+ */
+class ElementKind {
+  static const CLASS = const ElementKind._("CLASS");
+
+  static const CLASS_TYPE_ALIAS = const ElementKind._("CLASS_TYPE_ALIAS");
+
+  static const COMPILATION_UNIT = const ElementKind._("COMPILATION_UNIT");
+
+  static const CONSTRUCTOR = const ElementKind._("CONSTRUCTOR");
+
+  static const FIELD = const ElementKind._("FIELD");
+
+  static const FUNCTION = const ElementKind._("FUNCTION");
+
+  static const FUNCTION_TYPE_ALIAS = const ElementKind._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER = const ElementKind._("GETTER");
+
+  static const LIBRARY = const ElementKind._("LIBRARY");
+
+  static const LOCAL_VARIABLE = const ElementKind._("LOCAL_VARIABLE");
+
+  static const METHOD = const ElementKind._("METHOD");
+
+  static const PARAMETER = const ElementKind._("PARAMETER");
+
+  static const SETTER = const ElementKind._("SETTER");
+
+  static const TOP_LEVEL_VARIABLE = const ElementKind._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_PARAMETER = const ElementKind._("TYPE_PARAMETER");
+
+  static const UNIT_TEST_GROUP = const ElementKind._("UNIT_TEST_GROUP");
+
+  static const UNIT_TEST_TEST = const ElementKind._("UNIT_TEST_TEST");
+
+  static const UNKNOWN = const ElementKind._("UNKNOWN");
+
+  final String name;
+
+  const ElementKind._(this.name);
+
+  factory ElementKind(String name) {
+    switch (name) {
+      case "CLASS":
+        return CLASS;
+      case "CLASS_TYPE_ALIAS":
+        return CLASS_TYPE_ALIAS;
+      case "COMPILATION_UNIT":
+        return COMPILATION_UNIT;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "FIELD":
+        return FIELD;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER":
+        return GETTER;
+      case "LIBRARY":
+        return LIBRARY;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "METHOD":
+        return METHOD;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER":
+        return SETTER;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+      case "UNIT_TEST_GROUP":
+        return UNIT_TEST_GROUP;
+      case "UNIT_TEST_TEST":
+        return UNIT_TEST_TEST;
+      case "UNKNOWN":
+        return UNKNOWN;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ElementKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ElementKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ElementKind");
+  }
+
+  /**
+   * Construct based on a value from the analyzer engine.
+   */
+  factory ElementKind.fromEngine(engine.ElementKind kind) =>
+      _elementKindFromEngine(kind);
+
+  @override
+  String toString() => "ElementKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * Error
+ *
+ * {
+ *   "code": String
+ *   "message": String
+ *   "data": optional object
+ * }
+ */
+class Error {
+  /**
+   * A code that uniquely identifies the error that occurred.
+   */
+  String code;
+
+  /**
+   * A short description of the error.
+   */
+  String message;
+
+  /**
+   * Additional data related to the error. This field is omitted if there is no
+   * additional data available.
+   */
+  Object data;
+
+  Error(this.code, this.message, {this.data});
+
+  factory Error.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String code;
+      if (json.containsKey("code")) {
+        code = jsonDecoder._decodeString(jsonPath + ".code", json["code"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "code");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      Object data;
+      if (json.containsKey("data")) {
+        data = json["data"];
+      }
+      return new Error(code, message, data: data);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Error");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["code"] = code;
+    result["message"] = message;
+    if (data != null) {
+      result["data"] = data;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Error) {
+      return code == other.code &&
+          message == other.message &&
+          data == other.data;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, code.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, data.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ErrorFixes
+ *
+ * {
+ *   "error": AnalysisError
+ *   "fixes": List<SourceChange>
+ * }
+ */
+class ErrorFixes {
+  /**
+   * The error with which the fixes are associated.
+   */
+  AnalysisError error;
+
+  /**
+   * The fixes associated with the error.
+   */
+  List<SourceChange> fixes;
+
+  ErrorFixes(this.error, {this.fixes}) {
+    if (fixes == null) {
+      fixes = <SourceChange>[];
+    }
+  }
+
+  factory ErrorFixes.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisError error;
+      if (json.containsKey("error")) {
+        error = new AnalysisError.fromJson(jsonDecoder, jsonPath + ".error", json["error"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "error");
+      }
+      List<SourceChange> fixes;
+      if (json.containsKey("fixes")) {
+        fixes = jsonDecoder._decodeList(jsonPath + ".fixes", json["fixes"], (String jsonPath, Object json) => new SourceChange.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fixes");
+      }
+      return new ErrorFixes(error, fixes: fixes);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "ErrorFixes");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["error"] = error.toJson();
+    result["fixes"] = fixes.map((SourceChange value) => value.toJson()).toList();
+    return result;
+  }
+
+  /**
+   * Add a [Fix]
+   */
+  void addFix(Fix fix) {
+    fixes.add(fix.change);
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ErrorFixes) {
+      return error == other.error &&
+          _listEqual(fixes, other.fixes, (SourceChange a, SourceChange b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, error.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, fixes.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ErrorSeverity
+ *
+ * enum {
+ *   INFO
+ *   WARNING
+ *   ERROR
+ * }
+ */
+class ErrorSeverity {
+  static const INFO = const ErrorSeverity._("INFO");
+
+  static const WARNING = const ErrorSeverity._("WARNING");
+
+  static const ERROR = const ErrorSeverity._("ERROR");
+
+  final String name;
+
+  const ErrorSeverity._(this.name);
+
+  factory ErrorSeverity(String name) {
+    switch (name) {
+      case "INFO":
+        return INFO;
+      case "WARNING":
+        return WARNING;
+      case "ERROR":
+        return ERROR;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ErrorSeverity.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ErrorSeverity(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ErrorSeverity");
+  }
+
+  @override
+  String toString() => "ErrorSeverity.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ErrorType
+ *
+ * enum {
+ *   COMPILE_TIME_ERROR
+ *   HINT
+ *   STATIC_TYPE_WARNING
+ *   STATIC_WARNING
+ *   SYNTACTIC_ERROR
+ *   TODO
+ * }
+ */
+class ErrorType {
+  static const COMPILE_TIME_ERROR = const ErrorType._("COMPILE_TIME_ERROR");
+
+  static const HINT = const ErrorType._("HINT");
+
+  static const STATIC_TYPE_WARNING = const ErrorType._("STATIC_TYPE_WARNING");
+
+  static const STATIC_WARNING = const ErrorType._("STATIC_WARNING");
+
+  static const SYNTACTIC_ERROR = const ErrorType._("SYNTACTIC_ERROR");
+
+  static const TODO = const ErrorType._("TODO");
+
+  final String name;
+
+  const ErrorType._(this.name);
+
+  factory ErrorType(String name) {
+    switch (name) {
+      case "COMPILE_TIME_ERROR":
+        return COMPILE_TIME_ERROR;
+      case "HINT":
+        return HINT;
+      case "STATIC_TYPE_WARNING":
+        return STATIC_TYPE_WARNING;
+      case "STATIC_WARNING":
+        return STATIC_WARNING;
+      case "SYNTACTIC_ERROR":
+        return SYNTACTIC_ERROR;
+      case "TODO":
+        return TODO;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ErrorType.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ErrorType(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ErrorType");
+  }
+
+  @override
+  String toString() => "ErrorType.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ExecutableFile
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": ExecutableKind
+ * }
+ */
+class ExecutableFile {
+  /**
+   * The path of the executable file.
+   */
+  String file;
+
+  /**
+   * The offset of the region to be highlighted.
+   */
+  ExecutableKind offset;
+
+  ExecutableFile(this.file, this.offset);
+
+  factory ExecutableFile.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      ExecutableKind offset;
+      if (json.containsKey("offset")) {
+        offset = new ExecutableKind.fromJson(jsonDecoder, jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new ExecutableFile(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "ExecutableFile");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset.toJson();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutableFile) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ExecutableKind
+ *
+ * enum {
+ *   CLIENT
+ *   EITHER
+ *   SERVER
+ * }
+ */
+class ExecutableKind {
+  static const CLIENT = const ExecutableKind._("CLIENT");
+
+  static const EITHER = const ExecutableKind._("EITHER");
+
+  static const SERVER = const ExecutableKind._("SERVER");
+
+  final String name;
+
+  const ExecutableKind._(this.name);
+
+  factory ExecutableKind(String name) {
+    switch (name) {
+      case "CLIENT":
+        return CLIENT;
+      case "EITHER":
+        return EITHER;
+      case "SERVER":
+        return SERVER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ExecutableKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ExecutableKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ExecutableKind");
+  }
+
+  @override
+  String toString() => "ExecutableKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FoldingKind
+ *
+ * enum {
+ *   COMMENT
+ *   CLASS_MEMBER
+ *   DIRECTIVES
+ *   DOCUMENTATION_COMMENT
+ *   TOP_LEVEL_DECLARATION
+ * }
+ */
+class FoldingKind {
+  static const COMMENT = const FoldingKind._("COMMENT");
+
+  static const CLASS_MEMBER = const FoldingKind._("CLASS_MEMBER");
+
+  static const DIRECTIVES = const FoldingKind._("DIRECTIVES");
+
+  static const DOCUMENTATION_COMMENT = const FoldingKind._("DOCUMENTATION_COMMENT");
+
+  static const TOP_LEVEL_DECLARATION = const FoldingKind._("TOP_LEVEL_DECLARATION");
+
+  final String name;
+
+  const FoldingKind._(this.name);
+
+  factory FoldingKind(String name) {
+    switch (name) {
+      case "COMMENT":
+        return COMMENT;
+      case "CLASS_MEMBER":
+        return CLASS_MEMBER;
+      case "DIRECTIVES":
+        return DIRECTIVES;
+      case "DOCUMENTATION_COMMENT":
+        return DOCUMENTATION_COMMENT;
+      case "TOP_LEVEL_DECLARATION":
+        return TOP_LEVEL_DECLARATION;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory FoldingKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new FoldingKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "FoldingKind");
+  }
+
+  @override
+  String toString() => "FoldingKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FoldingRegion
+ *
+ * {
+ *   "kind": FoldingKind
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class FoldingRegion {
+  /**
+   * The kind of the region.
+   */
+  FoldingKind kind;
+
+  /**
+   * The offset of the region to be folded.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be folded.
+   */
+  int length;
+
+  FoldingRegion(this.kind, this.offset, this.length);
+
+  factory FoldingRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      FoldingKind kind;
+      if (json.containsKey("kind")) {
+        kind = new FoldingKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new FoldingRegion(kind, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FoldingRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is FoldingRegion) {
+      return kind == other.kind &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * HighlightRegion
+ *
+ * {
+ *   "type": HighlightRegionType
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class HighlightRegion {
+  /**
+   * The type of highlight associated with the region.
+   */
+  HighlightRegionType type;
+
+  /**
+   * The offset of the region to be highlighted.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be highlighted.
+   */
+  int length;
+
+  HighlightRegion(this.type, this.offset, this.length);
+
+  factory HighlightRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      HighlightRegionType type;
+      if (json.containsKey("type")) {
+        type = new HighlightRegionType.fromJson(jsonDecoder, jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new HighlightRegion(type, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "HighlightRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = type.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is HighlightRegion) {
+      return type == other.type &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * HighlightRegionType
+ *
+ * enum {
+ *   ANNOTATION
+ *   BUILT_IN
+ *   CLASS
+ *   COMMENT_BLOCK
+ *   COMMENT_DOCUMENTATION
+ *   COMMENT_END_OF_LINE
+ *   CONSTRUCTOR
+ *   DIRECTIVE
+ *   DYNAMIC_TYPE
+ *   FIELD
+ *   FIELD_STATIC
+ *   FUNCTION
+ *   FUNCTION_DECLARATION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER_DECLARATION
+ *   IDENTIFIER_DEFAULT
+ *   IMPORT_PREFIX
+ *   KEYWORD
+ *   LITERAL_BOOLEAN
+ *   LITERAL_DOUBLE
+ *   LITERAL_INTEGER
+ *   LITERAL_LIST
+ *   LITERAL_MAP
+ *   LITERAL_STRING
+ *   LOCAL_VARIABLE
+ *   LOCAL_VARIABLE_DECLARATION
+ *   METHOD
+ *   METHOD_DECLARATION
+ *   METHOD_DECLARATION_STATIC
+ *   METHOD_STATIC
+ *   PARAMETER
+ *   SETTER_DECLARATION
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_NAME_DYNAMIC
+ *   TYPE_PARAMETER
+ * }
+ */
+class HighlightRegionType {
+  static const ANNOTATION = const HighlightRegionType._("ANNOTATION");
+
+  static const BUILT_IN = const HighlightRegionType._("BUILT_IN");
+
+  static const CLASS = const HighlightRegionType._("CLASS");
+
+  static const COMMENT_BLOCK = const HighlightRegionType._("COMMENT_BLOCK");
+
+  static const COMMENT_DOCUMENTATION = const HighlightRegionType._("COMMENT_DOCUMENTATION");
+
+  static const COMMENT_END_OF_LINE = const HighlightRegionType._("COMMENT_END_OF_LINE");
+
+  static const CONSTRUCTOR = const HighlightRegionType._("CONSTRUCTOR");
+
+  static const DIRECTIVE = const HighlightRegionType._("DIRECTIVE");
+
+  static const DYNAMIC_TYPE = const HighlightRegionType._("DYNAMIC_TYPE");
+
+  static const FIELD = const HighlightRegionType._("FIELD");
+
+  static const FIELD_STATIC = const HighlightRegionType._("FIELD_STATIC");
+
+  static const FUNCTION = const HighlightRegionType._("FUNCTION");
+
+  static const FUNCTION_DECLARATION = const HighlightRegionType._("FUNCTION_DECLARATION");
+
+  static const FUNCTION_TYPE_ALIAS = const HighlightRegionType._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER_DECLARATION = const HighlightRegionType._("GETTER_DECLARATION");
+
+  static const IDENTIFIER_DEFAULT = const HighlightRegionType._("IDENTIFIER_DEFAULT");
+
+  static const IMPORT_PREFIX = const HighlightRegionType._("IMPORT_PREFIX");
+
+  static const KEYWORD = const HighlightRegionType._("KEYWORD");
+
+  static const LITERAL_BOOLEAN = const HighlightRegionType._("LITERAL_BOOLEAN");
+
+  static const LITERAL_DOUBLE = const HighlightRegionType._("LITERAL_DOUBLE");
+
+  static const LITERAL_INTEGER = const HighlightRegionType._("LITERAL_INTEGER");
+
+  static const LITERAL_LIST = const HighlightRegionType._("LITERAL_LIST");
+
+  static const LITERAL_MAP = const HighlightRegionType._("LITERAL_MAP");
+
+  static const LITERAL_STRING = const HighlightRegionType._("LITERAL_STRING");
+
+  static const LOCAL_VARIABLE = const HighlightRegionType._("LOCAL_VARIABLE");
+
+  static const LOCAL_VARIABLE_DECLARATION = const HighlightRegionType._("LOCAL_VARIABLE_DECLARATION");
+
+  static const METHOD = const HighlightRegionType._("METHOD");
+
+  static const METHOD_DECLARATION = const HighlightRegionType._("METHOD_DECLARATION");
+
+  static const METHOD_DECLARATION_STATIC = const HighlightRegionType._("METHOD_DECLARATION_STATIC");
+
+  static const METHOD_STATIC = const HighlightRegionType._("METHOD_STATIC");
+
+  static const PARAMETER = const HighlightRegionType._("PARAMETER");
+
+  static const SETTER_DECLARATION = const HighlightRegionType._("SETTER_DECLARATION");
+
+  static const TOP_LEVEL_VARIABLE = const HighlightRegionType._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_NAME_DYNAMIC = const HighlightRegionType._("TYPE_NAME_DYNAMIC");
+
+  static const TYPE_PARAMETER = const HighlightRegionType._("TYPE_PARAMETER");
+
+  final String name;
+
+  const HighlightRegionType._(this.name);
+
+  factory HighlightRegionType(String name) {
+    switch (name) {
+      case "ANNOTATION":
+        return ANNOTATION;
+      case "BUILT_IN":
+        return BUILT_IN;
+      case "CLASS":
+        return CLASS;
+      case "COMMENT_BLOCK":
+        return COMMENT_BLOCK;
+      case "COMMENT_DOCUMENTATION":
+        return COMMENT_DOCUMENTATION;
+      case "COMMENT_END_OF_LINE":
+        return COMMENT_END_OF_LINE;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "DIRECTIVE":
+        return DIRECTIVE;
+      case "DYNAMIC_TYPE":
+        return DYNAMIC_TYPE;
+      case "FIELD":
+        return FIELD;
+      case "FIELD_STATIC":
+        return FIELD_STATIC;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_DECLARATION":
+        return FUNCTION_DECLARATION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER_DECLARATION":
+        return GETTER_DECLARATION;
+      case "IDENTIFIER_DEFAULT":
+        return IDENTIFIER_DEFAULT;
+      case "IMPORT_PREFIX":
+        return IMPORT_PREFIX;
+      case "KEYWORD":
+        return KEYWORD;
+      case "LITERAL_BOOLEAN":
+        return LITERAL_BOOLEAN;
+      case "LITERAL_DOUBLE":
+        return LITERAL_DOUBLE;
+      case "LITERAL_INTEGER":
+        return LITERAL_INTEGER;
+      case "LITERAL_LIST":
+        return LITERAL_LIST;
+      case "LITERAL_MAP":
+        return LITERAL_MAP;
+      case "LITERAL_STRING":
+        return LITERAL_STRING;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "LOCAL_VARIABLE_DECLARATION":
+        return LOCAL_VARIABLE_DECLARATION;
+      case "METHOD":
+        return METHOD;
+      case "METHOD_DECLARATION":
+        return METHOD_DECLARATION;
+      case "METHOD_DECLARATION_STATIC":
+        return METHOD_DECLARATION_STATIC;
+      case "METHOD_STATIC":
+        return METHOD_STATIC;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER_DECLARATION":
+        return SETTER_DECLARATION;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_NAME_DYNAMIC":
+        return TYPE_NAME_DYNAMIC;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory HighlightRegionType.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new HighlightRegionType(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "HighlightRegionType");
+  }
+
+  @override
+  String toString() => "HighlightRegionType.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * HoverInformation
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "containingLibraryPath": optional String
+ *   "containingLibraryName": optional String
+ *   "dartdoc": optional String
+ *   "elementDescription": optional String
+ *   "elementKind": optional String
+ *   "parameter": optional String
+ *   "propagatedType": optional String
+ *   "staticType": optional String
+ * }
+ */
+class HoverInformation {
+  /**
+   * The offset of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  int offset;
+
+  /**
+   * The length of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  int length;
+
+  /**
+   * The path to the defining compilation unit of the library in which the
+   * referenced element is declared. This data is omitted if there is no
+   * referenced element.
+   */
+  String containingLibraryPath;
+
+  /**
+   * The name of the library in which the referenced element is declared. This
+   * data is omitted if there is no referenced element.
+   */
+  String containingLibraryName;
+
+  /**
+   * The dartdoc associated with the referenced element. Other than the removal
+   * of the comment delimiters, including leading asterisks in the case of a
+   * block comment, the dartdoc is unprocessed markdown. This data is omitted
+   * if there is no referenced element.
+   */
+  String dartdoc;
+
+  /**
+   * A human-readable description of the element being referenced. This data is
+   * omitted if there is no referenced element.
+   */
+  String elementDescription;
+
+  /**
+   * A human-readable description of the kind of element being referenced (such
+   * as “class” or “function type alias”). This data is omitted if there is no
+   * referenced element.
+   */
+  String elementKind;
+
+  /**
+   * A human-readable description of the parameter corresponding to the
+   * expression being hovered over. This data is omitted if the location is not
+   * in an argument to a function.
+   */
+  String parameter;
+
+  /**
+   * The name of the propagated type of the expression. This data is omitted if
+   * the location does not correspond to an expression or if there is no
+   * propagated type information.
+   */
+  String propagatedType;
+
+  /**
+   * The name of the static type of the expression. This data is omitted if the
+   * location does not correspond to an expression.
+   */
+  String staticType;
+
+  HoverInformation(this.offset, this.length, {this.containingLibraryPath, this.containingLibraryName, this.dartdoc, this.elementDescription, this.elementKind, this.parameter, this.propagatedType, this.staticType});
+
+  factory HoverInformation.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String containingLibraryPath;
+      if (json.containsKey("containingLibraryPath")) {
+        containingLibraryPath = jsonDecoder._decodeString(jsonPath + ".containingLibraryPath", json["containingLibraryPath"]);
+      }
+      String containingLibraryName;
+      if (json.containsKey("containingLibraryName")) {
+        containingLibraryName = jsonDecoder._decodeString(jsonPath + ".containingLibraryName", json["containingLibraryName"]);
+      }
+      String dartdoc;
+      if (json.containsKey("dartdoc")) {
+        dartdoc = jsonDecoder._decodeString(jsonPath + ".dartdoc", json["dartdoc"]);
+      }
+      String elementDescription;
+      if (json.containsKey("elementDescription")) {
+        elementDescription = jsonDecoder._decodeString(jsonPath + ".elementDescription", json["elementDescription"]);
+      }
+      String elementKind;
+      if (json.containsKey("elementKind")) {
+        elementKind = jsonDecoder._decodeString(jsonPath + ".elementKind", json["elementKind"]);
+      }
+      String parameter;
+      if (json.containsKey("parameter")) {
+        parameter = jsonDecoder._decodeString(jsonPath + ".parameter", json["parameter"]);
+      }
+      String propagatedType;
+      if (json.containsKey("propagatedType")) {
+        propagatedType = jsonDecoder._decodeString(jsonPath + ".propagatedType", json["propagatedType"]);
+      }
+      String staticType;
+      if (json.containsKey("staticType")) {
+        staticType = jsonDecoder._decodeString(jsonPath + ".staticType", json["staticType"]);
+      }
+      return new HoverInformation(offset, length, containingLibraryPath: containingLibraryPath, containingLibraryName: containingLibraryName, dartdoc: dartdoc, elementDescription: elementDescription, elementKind: elementKind, parameter: parameter, propagatedType: propagatedType, staticType: staticType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "HoverInformation");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    if (containingLibraryPath != null) {
+      result["containingLibraryPath"] = containingLibraryPath;
+    }
+    if (containingLibraryName != null) {
+      result["containingLibraryName"] = containingLibraryName;
+    }
+    if (dartdoc != null) {
+      result["dartdoc"] = dartdoc;
+    }
+    if (elementDescription != null) {
+      result["elementDescription"] = elementDescription;
+    }
+    if (elementKind != null) {
+      result["elementKind"] = elementKind;
+    }
+    if (parameter != null) {
+      result["parameter"] = parameter;
+    }
+    if (propagatedType != null) {
+      result["propagatedType"] = propagatedType;
+    }
+    if (staticType != null) {
+      result["staticType"] = staticType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is HoverInformation) {
+      return offset == other.offset &&
+          length == other.length &&
+          containingLibraryPath == other.containingLibraryPath &&
+          containingLibraryName == other.containingLibraryName &&
+          dartdoc == other.dartdoc &&
+          elementDescription == other.elementDescription &&
+          elementKind == other.elementKind &&
+          parameter == other.parameter &&
+          propagatedType == other.propagatedType &&
+          staticType == other.staticType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, containingLibraryPath.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, containingLibraryName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, dartdoc.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, elementDescription.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, elementKind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, propagatedType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, staticType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditGroup
+ *
+ * {
+ *   "positions": List<Position>
+ *   "length": int
+ *   "suggestions": List<LinkedEditSuggestion>
+ * }
+ */
+class LinkedEditGroup {
+  /**
+   * The positions of the regions that should be edited simultaneously.
+   */
+  List<Position> positions;
+
+  /**
+   * The length of the regions that should be edited simultaneously.
+   */
+  int length;
+
+  /**
+   * Pre-computed suggestions for what every region might want to be changed
+   * to.
+   */
+  List<LinkedEditSuggestion> suggestions;
+
+  LinkedEditGroup(this.positions, this.length, this.suggestions);
+
+  factory LinkedEditGroup.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<Position> positions;
+      if (json.containsKey("positions")) {
+        positions = jsonDecoder._decodeList(jsonPath + ".positions", json["positions"], (String jsonPath, Object json) => new Position.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "positions");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<LinkedEditSuggestion> suggestions;
+      if (json.containsKey("suggestions")) {
+        suggestions = jsonDecoder._decodeList(jsonPath + ".suggestions", json["suggestions"], (String jsonPath, Object json) => new LinkedEditSuggestion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "suggestions");
+      }
+      return new LinkedEditGroup(positions, length, suggestions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "LinkedEditGroup");
+    }
+  }
+
+  /**
+   * Construct an empty LinkedEditGroup.
+   */
+  LinkedEditGroup.empty() : this(<Position>[], 0, <LinkedEditSuggestion>[]);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["positions"] = positions.map((Position value) => value.toJson()).toList();
+    result["length"] = length;
+    result["suggestions"] = suggestions.map((LinkedEditSuggestion value) => value.toJson()).toList();
+    return result;
+  }
+
+  /**
+   * Add a new position and change the length.
+   */
+  void addPosition(Position position, int length) {
+    positions.add(position);
+    this.length = length;
+  }
+
+  /**
+   * Add a new suggestion.
+   */
+  void addSuggestion(LinkedEditSuggestion suggestion) {
+    suggestions.add(suggestion);
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is LinkedEditGroup) {
+      return _listEqual(positions, other.positions, (Position a, Position b) => a == b) &&
+          length == other.length &&
+          _listEqual(suggestions, other.suggestions, (LinkedEditSuggestion a, LinkedEditSuggestion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, positions.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, suggestions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditSuggestion
+ *
+ * {
+ *   "value": String
+ *   "kind": LinkedEditSuggestionKind
+ * }
+ */
+class LinkedEditSuggestion {
+  /**
+   * The value that could be used to replace all of the linked edit regions.
+   */
+  String value;
+
+  /**
+   * The kind of value being proposed.
+   */
+  LinkedEditSuggestionKind kind;
+
+  LinkedEditSuggestion(this.value, this.kind);
+
+  factory LinkedEditSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String value;
+      if (json.containsKey("value")) {
+        value = jsonDecoder._decodeString(jsonPath + ".value", json["value"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "value");
+      }
+      LinkedEditSuggestionKind kind;
+      if (json.containsKey("kind")) {
+        kind = new LinkedEditSuggestionKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      return new LinkedEditSuggestion(value, kind);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["value"] = value;
+    result["kind"] = kind.toJson();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is LinkedEditSuggestion) {
+      return value == other.value &&
+          kind == other.kind;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, value.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditSuggestionKind
+ *
+ * enum {
+ *   METHOD
+ *   PARAMETER
+ *   TYPE
+ *   VARIABLE
+ * }
+ */
+class LinkedEditSuggestionKind {
+  static const METHOD = const LinkedEditSuggestionKind._("METHOD");
+
+  static const PARAMETER = const LinkedEditSuggestionKind._("PARAMETER");
+
+  static const TYPE = const LinkedEditSuggestionKind._("TYPE");
+
+  static const VARIABLE = const LinkedEditSuggestionKind._("VARIABLE");
+
+  final String name;
+
+  const LinkedEditSuggestionKind._(this.name);
+
+  factory LinkedEditSuggestionKind(String name) {
+    switch (name) {
+      case "METHOD":
+        return METHOD;
+      case "PARAMETER":
+        return PARAMETER;
+      case "TYPE":
+        return TYPE;
+      case "VARIABLE":
+        return VARIABLE;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory LinkedEditSuggestionKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new LinkedEditSuggestionKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestionKind");
+  }
+
+  @override
+  String toString() => "LinkedEditSuggestionKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * Location
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "startLine": int
+ *   "startColumn": int
+ * }
+ */
+class Location {
+  /**
+   * The file containing the range.
+   */
+  String file;
+
+  /**
+   * The offset of the range.
+   */
+  int offset;
+
+  /**
+   * The length of the range.
+   */
+  int length;
+
+  /**
+   * The one-based index of the line containing the first character of the
+   * range.
+   */
+  int startLine;
+
+  /**
+   * The one-based index of the column containing the first character of the
+   * range.
+   */
+  int startColumn;
+
+  Location(this.file, this.offset, this.length, this.startLine, this.startColumn);
+
+  factory Location.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      int startLine;
+      if (json.containsKey("startLine")) {
+        startLine = jsonDecoder._decodeInt(jsonPath + ".startLine", json["startLine"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "startLine");
+      }
+      int startColumn;
+      if (json.containsKey("startColumn")) {
+        startColumn = jsonDecoder._decodeInt(jsonPath + ".startColumn", json["startColumn"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "startColumn");
+      }
+      return new Location(file, offset, length, startLine, startColumn);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Location");
+    }
+  }
+
+  /**
+   * Create a Location based on an [engine.Element].
+   */
+  factory Location.fromElement(engine.Element element) =>
+      _locationFromElement(element);
+
+  /**
+   * Create a Location based on an [engine.SearchMatch].
+   */
+  factory Location.fromMatch(engine.SearchMatch match) =>
+      _locationFromMatch(match);
+
+  /**
+   * Create a Location based on an [engine.AstNode].
+   */
+  factory Location.fromNode(engine.AstNode node) =>
+      _locationFromNode(node);
+
+  /**
+   * Create a Location based on an [engine.CompilationUnit].
+   */
+  factory Location.fromUnit(engine.CompilationUnit unit, engine.SourceRange range) =>
+      _locationFromUnit(unit, range);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    result["startLine"] = startLine;
+    result["startColumn"] = startColumn;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Location) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length &&
+          startLine == other.startLine &&
+          startColumn == other.startColumn;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, startLine.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, startColumn.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * NavigationRegion
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "targets": List<Element>
+ * }
+ */
+class NavigationRegion {
+  /**
+   * The offset of the region from which the user can navigate.
+   */
+  int offset;
+
+  /**
+   * The length of the region from which the user can navigate.
+   */
+  int length;
+
+  /**
+   * The elements to which the given region is bound. By opening the
+   * declaration of the elements, clients can implement one form of navigation.
+   */
+  List<Element> targets;
+
+  NavigationRegion(this.offset, this.length, this.targets);
+
+  factory NavigationRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<Element> targets;
+      if (json.containsKey("targets")) {
+        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], (String jsonPath, Object json) => new Element.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "targets");
+      }
+      return new NavigationRegion(offset, length, targets);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "NavigationRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["targets"] = targets.map((Element value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is NavigationRegion) {
+      return offset == other.offset &&
+          length == other.length &&
+          _listEqual(targets, other.targets, (Element a, Element b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, targets.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Occurrences
+ *
+ * {
+ *   "element": Element
+ *   "offsets": List<int>
+ *   "length": int
+ * }
+ */
+class Occurrences {
+  /**
+   * The element that was referenced.
+   */
+  Element element;
+
+  /**
+   * The offsets of the name of the referenced element within the file.
+   */
+  List<int> offsets;
+
+  /**
+   * The length of the name of the referenced element.
+   */
+  int length;
+
+  Occurrences(this.element, this.offsets, this.length);
+
+  factory Occurrences.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new Occurrences(element, offsets, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Occurrences");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["offsets"] = offsets;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Occurrences) {
+      return element == other.element &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Outline
+ *
+ * {
+ *   "element": Element
+ *   "offset": int
+ *   "length": int
+ *   "children": optional List<Outline>
+ * }
+ */
+class Outline {
+  /**
+   * A description of the element represented by this node.
+   */
+  Element element;
+
+  /**
+   * The offset of the first character of the element. This is different than
+   * the offset in the Element, which if the offset of the name of the element.
+   * It can be used, for example, to map locations in the file back to an
+   * outline.
+   */
+  int offset;
+
+  /**
+   * The length of the element.
+   */
+  int length;
+
+  /**
+   * The children of the node. The field will be omitted if the node has no
+   * children.
+   */
+  List<Outline> children;
+
+  Outline(this.element, this.offset, this.length, {this.children}) {
+    if (children == null) {
+      children = <Outline>[];
+    }
+  }
+
+  factory Outline.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<Outline> children;
+      if (json.containsKey("children")) {
+        children = jsonDecoder._decodeList(jsonPath + ".children", json["children"], (String jsonPath, Object json) => new Outline.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        children = <Outline>[];
+      }
+      return new Outline(element, offset, length, children: children);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Outline");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    if (children.isNotEmpty) {
+      result["children"] = children.map((Outline value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Outline) {
+      return element == other.element &&
+          offset == other.offset &&
+          length == other.length &&
+          _listEqual(children, other.children, (Outline a, Outline b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, children.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Override
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "superclassMember": optional OverriddenMember
+ *   "interfaceMembers": optional List<OverriddenMember>
+ * }
+ */
+class Override {
+  /**
+   * The offset of the name of the overriding member.
+   */
+  int offset;
+
+  /**
+   * The length of the name of the overriding member.
+   */
+  int length;
+
+  /**
+   * The member inherited from a superclass that is overridden by the
+   * overriding member. The field is omitted if there is no superclass member,
+   * in which case there must be at least one interface member.
+   */
+  OverriddenMember superclassMember;
+
+  /**
+   * The members inherited from interfaces that are overridden by the
+   * overriding member. The field is omitted if there are no interface members,
+   * in which case there must be a superclass member.
+   */
+  List<OverriddenMember> interfaceMembers;
+
+  Override(this.offset, this.length, {this.superclassMember, this.interfaceMembers}) {
+    if (interfaceMembers == null) {
+      interfaceMembers = <OverriddenMember>[];
+    }
+  }
+
+  factory Override.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      OverriddenMember superclassMember;
+      if (json.containsKey("superclassMember")) {
+        superclassMember = new OverriddenMember.fromJson(jsonDecoder, jsonPath + ".superclassMember", json["superclassMember"]);
+      }
+      List<OverriddenMember> interfaceMembers;
+      if (json.containsKey("interfaceMembers")) {
+        interfaceMembers = jsonDecoder._decodeList(jsonPath + ".interfaceMembers", json["interfaceMembers"], (String jsonPath, Object json) => new OverriddenMember.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        interfaceMembers = <OverriddenMember>[];
+      }
+      return new Override(offset, length, superclassMember: superclassMember, interfaceMembers: interfaceMembers);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Override");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    if (superclassMember != null) {
+      result["superclassMember"] = superclassMember.toJson();
+    }
+    if (interfaceMembers.isNotEmpty) {
+      result["interfaceMembers"] = interfaceMembers.map((OverriddenMember value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Override) {
+      return offset == other.offset &&
+          length == other.length &&
+          superclassMember == other.superclassMember &&
+          _listEqual(interfaceMembers, other.interfaceMembers, (OverriddenMember a, OverriddenMember b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, superclassMember.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, interfaceMembers.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * OverriddenMember
+ *
+ * {
+ *   "element": Element
+ *   "className": String
+ * }
+ */
+class OverriddenMember {
+  /**
+   * The element that is being overridden.
+   */
+  Element element;
+
+  /**
+   * The name of the class in which the member is defined.
+   */
+  String className;
+
+  OverriddenMember(this.element, this.className);
+
+  factory OverriddenMember.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      String className;
+      if (json.containsKey("className")) {
+        className = jsonDecoder._decodeString(jsonPath + ".className", json["className"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "className");
+      }
+      return new OverriddenMember(element, className);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "OverriddenMember");
+    }
+  }
+
+  /**
+   * Construct based on an element from the analyzer engine.
+   */
+  factory OverriddenMember.fromEngine(engine.Element member) =>
+      _overriddenMemberFromEngine(member);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["className"] = className;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is OverriddenMember) {
+      return element == other.element &&
+          className == other.className;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, className.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Position
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class Position {
+  /**
+   * The file containing the position.
+   */
+  String file;
+
+  /**
+   * The offset of the position.
+   */
+  int offset;
+
+  Position(this.file, this.offset);
+
+  factory Position.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new Position(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Position");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Position) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringKind
+ *
+ * enum {
+ *   CONVERT_GETTER_TO_METHOD
+ *   CONVERT_METHOD_TO_GETTER
+ *   EXTRACT_LOCAL_VARIABLE
+ *   EXTRACT_METHOD
+ *   INLINE_LOCAL_VARIABLE
+ *   INLINE_METHOD
+ *   RENAME
+ * }
+ */
+class RefactoringKind {
+  static const CONVERT_GETTER_TO_METHOD = const RefactoringKind._("CONVERT_GETTER_TO_METHOD");
+
+  static const CONVERT_METHOD_TO_GETTER = const RefactoringKind._("CONVERT_METHOD_TO_GETTER");
+
+  static const EXTRACT_LOCAL_VARIABLE = const RefactoringKind._("EXTRACT_LOCAL_VARIABLE");
+
+  static const EXTRACT_METHOD = const RefactoringKind._("EXTRACT_METHOD");
+
+  static const INLINE_LOCAL_VARIABLE = const RefactoringKind._("INLINE_LOCAL_VARIABLE");
+
+  static const INLINE_METHOD = const RefactoringKind._("INLINE_METHOD");
+
+  static const RENAME = const RefactoringKind._("RENAME");
+
+  final String name;
+
+  const RefactoringKind._(this.name);
+
+  factory RefactoringKind(String name) {
+    switch (name) {
+      case "CONVERT_GETTER_TO_METHOD":
+        return CONVERT_GETTER_TO_METHOD;
+      case "CONVERT_METHOD_TO_GETTER":
+        return CONVERT_METHOD_TO_GETTER;
+      case "EXTRACT_LOCAL_VARIABLE":
+        return EXTRACT_LOCAL_VARIABLE;
+      case "EXTRACT_METHOD":
+        return EXTRACT_METHOD;
+      case "INLINE_LOCAL_VARIABLE":
+        return INLINE_LOCAL_VARIABLE;
+      case "INLINE_METHOD":
+        return INLINE_METHOD;
+      case "RENAME":
+        return RENAME;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringKind");
+  }
+
+  @override
+  String toString() => "RefactoringKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RefactoringMethodParameter
+ *
+ * {
+ *   "id": optional String
+ *   "kind": RefactoringMethodParameterKind
+ *   "type": String
+ *   "name": String
+ *   "parameters": optional String
+ * }
+ */
+class RefactoringMethodParameter {
+  /**
+   * The unique identifier of the parameter. Clients may omit this field for
+   * the parameters they want to add.
+   */
+  String id;
+
+  /**
+   * The kind of the parameter.
+   */
+  RefactoringMethodParameterKind kind;
+
+  /**
+   * The type that should be given to the parameter, or the return type of the
+   * parameter's function type.
+   */
+  String type;
+
+  /**
+   * The name that should be given to the parameter.
+   */
+  String name;
+
+  /**
+   * The parameter list of the parameter's function type. If the parameter is
+   * not of a function type, this field will not be defined. If the function
+   * type has zero parameters, this field will have a value of "()".
+   */
+  String parameters;
+
+  RefactoringMethodParameter(this.kind, this.type, this.name, {this.id, this.parameters});
+
+  factory RefactoringMethodParameter.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      }
+      RefactoringMethodParameterKind kind;
+      if (json.containsKey("kind")) {
+        kind = new RefactoringMethodParameterKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String type;
+      if (json.containsKey("type")) {
+        type = jsonDecoder._decodeString(jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      String parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeString(jsonPath + ".parameters", json["parameters"]);
+      }
+      return new RefactoringMethodParameter(kind, type, name, id: id, parameters: parameters);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RefactoringMethodParameter");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (id != null) {
+      result["id"] = id;
+    }
+    result["kind"] = kind.toJson();
+    result["type"] = type;
+    result["name"] = name;
+    if (parameters != null) {
+      result["parameters"] = parameters;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringMethodParameter) {
+      return id == other.id &&
+          kind == other.kind &&
+          type == other.type &&
+          name == other.name &&
+          parameters == other.parameters;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringMethodParameterKind
+ *
+ * enum {
+ *   REQUIRED
+ *   POSITIONAL
+ *   NAMED
+ * }
+ */
+class RefactoringMethodParameterKind {
+  static const REQUIRED = const RefactoringMethodParameterKind._("REQUIRED");
+
+  static const POSITIONAL = const RefactoringMethodParameterKind._("POSITIONAL");
+
+  static const NAMED = const RefactoringMethodParameterKind._("NAMED");
+
+  final String name;
+
+  const RefactoringMethodParameterKind._(this.name);
+
+  factory RefactoringMethodParameterKind(String name) {
+    switch (name) {
+      case "REQUIRED":
+        return REQUIRED;
+      case "POSITIONAL":
+        return POSITIONAL;
+      case "NAMED":
+        return NAMED;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringMethodParameterKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringMethodParameterKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringMethodParameterKind");
+  }
+
+  @override
+  String toString() => "RefactoringMethodParameterKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RefactoringProblem
+ *
+ * {
+ *   "severity": RefactoringProblemSeverity
+ *   "message": String
+ *   "location": optional Location
+ * }
+ */
+class RefactoringProblem {
+  /**
+   * The severity of the problem being represented.
+   */
+  RefactoringProblemSeverity severity;
+
+  /**
+   * A human-readable description of the problem being represented.
+   */
+  String message;
+
+  /**
+   * The location of the problem being represented. This field is omitted
+   * unless there is a specific location associated with the problem (such as a
+   * location where an element being renamed will be shadowed).
+   */
+  Location location;
+
+  RefactoringProblem(this.severity, this.message, {this.location});
+
+  factory RefactoringProblem.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      RefactoringProblemSeverity severity;
+      if (json.containsKey("severity")) {
+        severity = new RefactoringProblemSeverity.fromJson(jsonDecoder, jsonPath + ".severity", json["severity"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "severity");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      }
+      return new RefactoringProblem(severity, message, location: location);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RefactoringProblem");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["severity"] = severity.toJson();
+    result["message"] = message;
+    if (location != null) {
+      result["location"] = location.toJson();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringProblem) {
+      return severity == other.severity &&
+          message == other.message &&
+          location == other.location;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, severity.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringProblemSeverity
+ *
+ * enum {
+ *   INFO
+ *   WARNING
+ *   ERROR
+ *   FATAL
+ * }
+ */
+class RefactoringProblemSeverity {
+  static const INFO = const RefactoringProblemSeverity._("INFO");
+
+  static const WARNING = const RefactoringProblemSeverity._("WARNING");
+
+  static const ERROR = const RefactoringProblemSeverity._("ERROR");
+
+  static const FATAL = const RefactoringProblemSeverity._("FATAL");
+
+  final String name;
+
+  const RefactoringProblemSeverity._(this.name);
+
+  factory RefactoringProblemSeverity(String name) {
+    switch (name) {
+      case "INFO":
+        return INFO;
+      case "WARNING":
+        return WARNING;
+      case "ERROR":
+        return ERROR;
+      case "FATAL":
+        return FATAL;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringProblemSeverity.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringProblemSeverity(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringProblemSeverity");
+  }
+
+  /**
+   * Returns the [RefactoringProblemSeverity] with the maximal severity.
+   */
+  static RefactoringProblemSeverity max(RefactoringProblemSeverity a, RefactoringProblemSeverity b) =>
+      _maxRefactoringProblemSeverity(a, b);
+
+  @override
+  String toString() => "RefactoringProblemSeverity.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RemoveContentOverlay
+ *
+ * {
+ *   "type": "remove"
+ * }
+ */
+class RemoveContentOverlay {
+  RemoveContentOverlay();
+
+  factory RemoveContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "remove") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "remove");
+      }
+      return new RemoveContentOverlay();
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RemoveContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "remove";
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RemoveContentOverlay) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 114870849);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SearchResult
+ *
+ * {
+ *   "location": Location
+ *   "kind": SearchResultKind
+ *   "isPotential": bool
+ *   "path": List<Element>
+ * }
+ */
+class SearchResult {
+  /**
+   * The location of the code that matched the search criteria.
+   */
+  Location location;
+
+  /**
+   * The kind of element that was found or the kind of reference that was
+   * found.
+   */
+  SearchResultKind kind;
+
+  /**
+   * True if the result is a potential match but cannot be confirmed to be a
+   * match. For example, if all references to a method m defined in some class
+   * were requested, and a reference to a method m from an unknown class were
+   * found, it would be marked as being a potential match.
+   */
+  bool isPotential;
+
+  /**
+   * The elements that contain the result, starting with the most immediately
+   * enclosing ancestor and ending with the library.
+   */
+  List<Element> path;
+
+  SearchResult(this.location, this.kind, this.isPotential, this.path);
+
+  factory SearchResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "location");
+      }
+      SearchResultKind kind;
+      if (json.containsKey("kind")) {
+        kind = new SearchResultKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      bool isPotential;
+      if (json.containsKey("isPotential")) {
+        isPotential = jsonDecoder._decodeBool(jsonPath + ".isPotential", json["isPotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isPotential");
+      }
+      List<Element> path;
+      if (json.containsKey("path")) {
+        path = jsonDecoder._decodeList(jsonPath + ".path", json["path"], (String jsonPath, Object json) => new Element.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "path");
+      }
+      return new SearchResult(location, kind, isPotential, path);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SearchResult");
+    }
+  }
+
+  /**
+   * Construct based on a value from the search engine.
+   */
+  factory SearchResult.fromMatch(engine.SearchMatch match) =>
+      searchResultFromMatch(match);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["location"] = location.toJson();
+    result["kind"] = kind.toJson();
+    result["isPotential"] = isPotential;
+    result["path"] = path.map((Element value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchResult) {
+      return location == other.location &&
+          kind == other.kind &&
+          isPotential == other.isPotential &&
+          _listEqual(path, other.path, (Element a, Element b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isPotential.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, path.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SearchResultKind
+ *
+ * enum {
+ *   DECLARATION
+ *   INVOCATION
+ *   READ
+ *   READ_WRITE
+ *   REFERENCE
+ *   UNKNOWN
+ *   WRITE
+ * }
+ */
+class SearchResultKind {
+  /**
+   * The declaration of an element.
+   */
+  static const DECLARATION = const SearchResultKind._("DECLARATION");
+
+  /**
+   * The invocation of a function or method.
+   */
+  static const INVOCATION = const SearchResultKind._("INVOCATION");
+
+  /**
+   * A reference to a field, parameter or variable where it is being read.
+   */
+  static const READ = const SearchResultKind._("READ");
+
+  /**
+   * A reference to a field, parameter or variable where it is being read and
+   * written.
+   */
+  static const READ_WRITE = const SearchResultKind._("READ_WRITE");
+
+  /**
+   * A reference to an element.
+   */
+  static const REFERENCE = const SearchResultKind._("REFERENCE");
+
+  /**
+   * Some other kind of search result.
+   */
+  static const UNKNOWN = const SearchResultKind._("UNKNOWN");
+
+  /**
+   * A reference to a field, parameter or variable where it is being written.
+   */
+  static const WRITE = const SearchResultKind._("WRITE");
+
+  final String name;
+
+  const SearchResultKind._(this.name);
+
+  factory SearchResultKind(String name) {
+    switch (name) {
+      case "DECLARATION":
+        return DECLARATION;
+      case "INVOCATION":
+        return INVOCATION;
+      case "READ":
+        return READ;
+      case "READ_WRITE":
+        return READ_WRITE;
+      case "REFERENCE":
+        return REFERENCE;
+      case "UNKNOWN":
+        return UNKNOWN;
+      case "WRITE":
+        return WRITE;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory SearchResultKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new SearchResultKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "SearchResultKind");
+  }
+
+  /**
+   * Construct based on a value from the search engine.
+   */
+  factory SearchResultKind.fromEngine(engine.MatchKind kind) =>
+      _searchResultKindFromEngine(kind);
+
+  @override
+  String toString() => "SearchResultKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ServerService
+ *
+ * enum {
+ *   STATUS
+ * }
+ */
+class ServerService {
+  static const STATUS = const ServerService._("STATUS");
+
+  final String name;
+
+  const ServerService._(this.name);
+
+  factory ServerService(String name) {
+    switch (name) {
+      case "STATUS":
+        return STATUS;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ServerService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ServerService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ServerService");
+  }
+
+  @override
+  String toString() => "ServerService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * SourceChange
+ *
+ * {
+ *   "message": String
+ *   "edits": List<SourceFileEdit>
+ *   "linkedEditGroups": List<LinkedEditGroup>
+ *   "selection": optional Position
+ * }
+ */
+class SourceChange {
+  /**
+   * A human-readable description of the change to be applied.
+   */
+  String message;
+
+  /**
+   * A list of the edits used to effect the change, grouped by file.
+   */
+  List<SourceFileEdit> edits;
+
+  /**
+   * A list of the linked editing groups used to customize the changes that
+   * were made.
+   */
+  List<LinkedEditGroup> linkedEditGroups;
+
+  /**
+   * The position that should be selected after the edits have been applied.
+   */
+  Position selection;
+
+  SourceChange(this.message, {this.edits, this.linkedEditGroups, this.selection}) {
+    if (edits == null) {
+      edits = <SourceFileEdit>[];
+    }
+    if (linkedEditGroups == null) {
+      linkedEditGroups = <LinkedEditGroup>[];
+    }
+  }
+
+  factory SourceChange.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      List<SourceFileEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      List<LinkedEditGroup> linkedEditGroups;
+      if (json.containsKey("linkedEditGroups")) {
+        linkedEditGroups = jsonDecoder._decodeList(jsonPath + ".linkedEditGroups", json["linkedEditGroups"], (String jsonPath, Object json) => new LinkedEditGroup.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "linkedEditGroups");
+      }
+      Position selection;
+      if (json.containsKey("selection")) {
+        selection = new Position.fromJson(jsonDecoder, jsonPath + ".selection", json["selection"]);
+      }
+      return new SourceChange(message, edits: edits, linkedEditGroups: linkedEditGroups, selection: selection);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceChange");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["message"] = message;
+    result["edits"] = edits.map((SourceFileEdit value) => value.toJson()).toList();
+    result["linkedEditGroups"] = linkedEditGroups.map((LinkedEditGroup value) => value.toJson()).toList();
+    if (selection != null) {
+      result["selection"] = selection.toJson();
+    }
+    return result;
+  }
+
+  /**
+   * Adds [edit] to the [FileEdit] for the given [file].
+   */
+  void addEdit(String file, SourceEdit edit) =>
+      _addEditToSourceChange(this, file, edit);
+
+  /**
+   * Adds the given [FileEdit].
+   */
+  void addFileEdit(SourceFileEdit edit) {
+    edits.add(edit);
+  }
+
+  /**
+   * Adds the given [LinkedEditGroup].
+   */
+  void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) {
+    linkedEditGroups.add(linkedEditGroup);
+  }
+
+  /**
+   * Returns the [FileEdit] for the given [file], maybe `null`.
+   */
+  SourceFileEdit getFileEdit(String file) =>
+      _getChangeFileEdit(this, file);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceChange) {
+      return message == other.message &&
+          _listEqual(edits, other.edits, (SourceFileEdit a, SourceFileEdit b) => a == b) &&
+          _listEqual(linkedEditGroups, other.linkedEditGroups, (LinkedEditGroup a, LinkedEditGroup b) => a == b) &&
+          selection == other.selection;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, linkedEditGroups.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selection.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SourceEdit
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "replacement": String
+ *   "id": optional String
+ * }
+ */
+class SourceEdit {
+  /**
+   * Get the result of applying a set of [edits] to the given [code]. Edits are
+   * applied in the order they appear in [edits].
+   */
+  static String applySequence(String code, Iterable<SourceEdit> edits) =>
+      _applySequence(code, edits);
+
+  /**
+   * The offset of the region to be modified.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be modified.
+   */
+  int length;
+
+  /**
+   * The code that is to replace the specified region in the original code.
+   */
+  String replacement;
+
+  /**
+   * An identifier that uniquely identifies this source edit from other edits
+   * in the same response. This field is omitted unless a containing structure
+   * needs to be able to identify the edit for some reason.
+   *
+   * For example, some refactoring operations can produce edits that might not
+   * be appropriate (referred to as potential edits). Such edits will have an
+   * id so that they can be referenced. Edits in the same response that do not
+   * need to be referenced will not have an id.
+   */
+  String id;
+
+  SourceEdit(this.offset, this.length, this.replacement, {this.id});
+
+  factory SourceEdit.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String replacement;
+      if (json.containsKey("replacement")) {
+        replacement = jsonDecoder._decodeString(jsonPath + ".replacement", json["replacement"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacement");
+      }
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      }
+      return new SourceEdit(offset, length, replacement, id: id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceEdit");
+    }
+  }
+
+  /**
+   * Construct based on a SourceRange.
+   */
+  SourceEdit.range(engine.SourceRange range, String replacement, {String id})
+      : this(range.offset, range.length, replacement, id: id);
+
+  /**
+   * The end of the region to be modified.
+   */
+  int get end => offset + length;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["replacement"] = replacement;
+    if (id != null) {
+      result["id"] = id;
+    }
+    return result;
+  }
+
+  /**
+   * Get the result of applying the edit to the given [code].
+   */
+  String apply(String code) => _applyEdit(code, this);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceEdit) {
+      return offset == other.offset &&
+          length == other.length &&
+          replacement == other.replacement &&
+          id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SourceFileEdit
+ *
+ * {
+ *   "file": FilePath
+ *   "edits": List<SourceEdit>
+ * }
+ */
+class SourceFileEdit {
+  /**
+   * The file containing the code to be modified.
+   */
+  String file;
+
+  /**
+   * A list of the edits used to effect the change.
+   */
+  List<SourceEdit> edits;
+
+  SourceFileEdit(this.file, {this.edits}) {
+    if (edits == null) {
+      edits = <SourceEdit>[];
+    }
+  }
+
+  factory SourceFileEdit.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<SourceEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      return new SourceFileEdit(file, edits: edits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceFileEdit");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    return result;
+  }
+
+  /**
+   * Adds the given [Edit] to the list.
+   */
+  void add(SourceEdit edit) => _addEditForSource(this, edit);
+
+  /**
+   * Adds the given [Edit]s.
+   */
+  void addAll(Iterable<SourceEdit> edits) =>
+      _addAllEditsForSource(this, edits);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceFileEdit) {
+      return file == other.file &&
+          _listEqual(edits, other.edits, (SourceEdit a, SourceEdit b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * TypeHierarchyItem
+ *
+ * {
+ *   "classElement": Element
+ *   "displayName": optional String
+ *   "memberElement": optional Element
+ *   "superclass": optional int
+ *   "interfaces": List<int>
+ *   "mixins": List<int>
+ *   "subclasses": List<int>
+ * }
+ */
+class TypeHierarchyItem {
+  /**
+   * The class element represented by this item.
+   */
+  Element classElement;
+
+  /**
+   * The name to be displayed for the class. This field will be omitted if the
+   * display name is the same as the name of the element. The display name is
+   * different if there is additional type information to be displayed, such as
+   * type arguments.
+   */
+  String displayName;
+
+  /**
+   * The member in the class corresponding to the member on which the hierarchy
+   * was requested. This field will be omitted if the hierarchy was not
+   * requested for a member or if the class does not have a corresponding
+   * member.
+   */
+  Element memberElement;
+
+  /**
+   * The index of the item representing the superclass of this class. This
+   * field will be omitted if this item represents the class Object.
+   */
+  int superclass;
+
+  /**
+   * The indexes of the items representing the interfaces implemented by this
+   * class. The list will be empty if there are no implemented interfaces.
+   */
+  List<int> interfaces;
+
+  /**
+   * The indexes of the items representing the mixins referenced by this class.
+   * The list will be empty if there are no classes mixed in to this class.
+   */
+  List<int> mixins;
+
+  /**
+   * The indexes of the items representing the subtypes of this class. The list
+   * will be empty if there are no subtypes or if this item represents a
+   * supertype of the pivot type.
+   */
+  List<int> subclasses;
+
+  TypeHierarchyItem(this.classElement, {this.displayName, this.memberElement, this.superclass, this.interfaces, this.mixins, this.subclasses}) {
+    if (interfaces == null) {
+      interfaces = <int>[];
+    }
+    if (mixins == null) {
+      mixins = <int>[];
+    }
+    if (subclasses == null) {
+      subclasses = <int>[];
+    }
+  }
+
+  factory TypeHierarchyItem.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element classElement;
+      if (json.containsKey("classElement")) {
+        classElement = new Element.fromJson(jsonDecoder, jsonPath + ".classElement", json["classElement"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "classElement");
+      }
+      String displayName;
+      if (json.containsKey("displayName")) {
+        displayName = jsonDecoder._decodeString(jsonPath + ".displayName", json["displayName"]);
+      }
+      Element memberElement;
+      if (json.containsKey("memberElement")) {
+        memberElement = new Element.fromJson(jsonDecoder, jsonPath + ".memberElement", json["memberElement"]);
+      }
+      int superclass;
+      if (json.containsKey("superclass")) {
+        superclass = jsonDecoder._decodeInt(jsonPath + ".superclass", json["superclass"]);
+      }
+      List<int> interfaces;
+      if (json.containsKey("interfaces")) {
+        interfaces = jsonDecoder._decodeList(jsonPath + ".interfaces", json["interfaces"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "interfaces");
+      }
+      List<int> mixins;
+      if (json.containsKey("mixins")) {
+        mixins = jsonDecoder._decodeList(jsonPath + ".mixins", json["mixins"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "mixins");
+      }
+      List<int> subclasses;
+      if (json.containsKey("subclasses")) {
+        subclasses = jsonDecoder._decodeList(jsonPath + ".subclasses", json["subclasses"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subclasses");
+      }
+      return new TypeHierarchyItem(classElement, displayName: displayName, memberElement: memberElement, superclass: superclass, interfaces: interfaces, mixins: mixins, subclasses: subclasses);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "TypeHierarchyItem");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["classElement"] = classElement.toJson();
+    if (displayName != null) {
+      result["displayName"] = displayName;
+    }
+    if (memberElement != null) {
+      result["memberElement"] = memberElement.toJson();
+    }
+    if (superclass != null) {
+      result["superclass"] = superclass;
+    }
+    result["interfaces"] = interfaces;
+    result["mixins"] = mixins;
+    result["subclasses"] = subclasses;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is TypeHierarchyItem) {
+      return classElement == other.classElement &&
+          displayName == other.displayName &&
+          memberElement == other.memberElement &&
+          superclass == other.superclass &&
+          _listEqual(interfaces, other.interfaces, (int a, int b) => a == b) &&
+          _listEqual(mixins, other.mixins, (int a, int b) => a == b) &&
+          _listEqual(subclasses, other.subclasses, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, classElement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, displayName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, memberElement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, superclass.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, interfaces.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, mixins.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, subclasses.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * convertGetterToMethod feedback
+ */
+class ConvertGetterToMethodFeedback {
+  @override
+  bool operator==(other) {
+    if (other is ConvertGetterToMethodFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 616032599;
+  }
+}
+/**
+ * convertGetterToMethod options
+ */
+class ConvertGetterToMethodOptions {
+  @override
+  bool operator==(other) {
+    if (other is ConvertGetterToMethodOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 488848400;
+  }
+}
+/**
+ * convertMethodToGetter feedback
+ */
+class ConvertMethodToGetterFeedback {
+  @override
+  bool operator==(other) {
+    if (other is ConvertMethodToGetterFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 165291526;
+  }
+}
+/**
+ * convertMethodToGetter options
+ */
+class ConvertMethodToGetterOptions {
+  @override
+  bool operator==(other) {
+    if (other is ConvertMethodToGetterOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 27952290;
+  }
+}
+
+/**
+ * extractLocalVariable feedback
+ *
+ * {
+ *   "names": List<String>
+ *   "offsets": List<int>
+ *   "lengths": List<int>
+ * }
+ */
+class ExtractLocalVariableFeedback {
+  /**
+   * The proposed names for the local variable.
+   */
+  List<String> names;
+
+  /**
+   * The offsets of the expressions that would be replaced by a reference to
+   * the variable.
+   */
+  List<int> offsets;
+
+  /**
+   * The lengths of the expressions that would be replaced by a reference to
+   * the variable. The lengths correspond to the offsets. In other words, for a
+   * given expression, if the offset of that expression is offsets[i], then the
+   * length of that expression is lengths[i].
+   */
+  List<int> lengths;
+
+  ExtractLocalVariableFeedback(this.names, this.offsets, this.lengths);
+
+  factory ExtractLocalVariableFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> names;
+      if (json.containsKey("names")) {
+        names = jsonDecoder._decodeList(jsonPath + ".names", json["names"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "names");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      List<int> lengths;
+      if (json.containsKey("lengths")) {
+        lengths = jsonDecoder._decodeList(jsonPath + ".lengths", json["lengths"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "lengths");
+      }
+      return new ExtractLocalVariableFeedback(names, offsets, lengths);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractLocalVariable feedback");
+    }
+  }
+
+  factory ExtractLocalVariableFeedback.fromRefactoringResult(EditGetRefactoringResult refactoringResult) {
+    return new ExtractLocalVariableFeedback.fromJson(
+        new ResponseDecoder(), "feedback", refactoringResult.feedback);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["names"] = names;
+    result["offsets"] = offsets;
+    result["lengths"] = lengths;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractLocalVariableFeedback) {
+      return _listEqual(names, other.names, (String a, String b) => a == b) &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          _listEqual(lengths, other.lengths, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, names.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, lengths.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractLocalVariable options
+ *
+ * {
+ *   "name": String
+ *   "extractAll": bool
+ * }
+ */
+class ExtractLocalVariableOptions {
+  /**
+   * The name that the local variable should be given.
+   */
+  String name;
+
+  /**
+   * True if all occurrences of the expression within the scope in which the
+   * variable will be defined should be replaced by a reference to the local
+   * variable. The expression used to initiate the refactoring will always be
+   * replaced.
+   */
+  bool extractAll;
+
+  ExtractLocalVariableOptions(this.name, this.extractAll);
+
+  factory ExtractLocalVariableOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      bool extractAll;
+      if (json.containsKey("extractAll")) {
+        extractAll = jsonDecoder._decodeBool(jsonPath + ".extractAll", json["extractAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "extractAll");
+      }
+      return new ExtractLocalVariableOptions(name, extractAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractLocalVariable options");
+    }
+  }
+
+  factory ExtractLocalVariableOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new ExtractLocalVariableOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    result["extractAll"] = extractAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractLocalVariableOptions) {
+      return name == other.name &&
+          extractAll == other.extractAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, extractAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractMethod feedback
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "returnType": String
+ *   "names": List<String>
+ *   "canCreateGetter": bool
+ *   "parameters": List<RefactoringMethodParameter>
+ *   "occurrences": int
+ *   "offsets": List<int>
+ *   "lengths": List<int>
+ * }
+ */
+class ExtractMethodFeedback {
+  /**
+   * The offset to the beginning of the expression or statements that will be
+   * extracted.
+   */
+  int offset;
+
+  /**
+   * The length of the expression or statements that will be extracted.
+   */
+  int length;
+
+  /**
+   * The proposed return type for the method.
+   */
+  String returnType;
+
+  /**
+   * The proposed names for the method.
+   */
+  List<String> names;
+
+  /**
+   * True if a getter could be created rather than a method.
+   */
+  bool canCreateGetter;
+
+  /**
+   * The proposed parameters for the method.
+   */
+  List<RefactoringMethodParameter> parameters;
+
+  /**
+   * The number of times the expression or statements occurs.
+   */
+  int occurrences;
+
+  /**
+   * The offsets of the expressions or statements that would be replaced by an
+   * invocation of the method.
+   */
+  List<int> offsets;
+
+  /**
+   * The lengths of the expressions or statements that would be replaced by an
+   * invocation of the method. The lengths correspond to the offsets. In other
+   * words, for a given expression (or block of statements), if the offset of
+   * that expression is offsets[i], then the length of that expression is
+   * lengths[i].
+   */
+  List<int> lengths;
+
+  ExtractMethodFeedback(this.offset, this.length, this.returnType, this.names, this.canCreateGetter, this.parameters, this.occurrences, this.offsets, this.lengths);
+
+  factory ExtractMethodFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "returnType");
+      }
+      List<String> names;
+      if (json.containsKey("names")) {
+        names = jsonDecoder._decodeList(jsonPath + ".names", json["names"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "names");
+      }
+      bool canCreateGetter;
+      if (json.containsKey("canCreateGetter")) {
+        canCreateGetter = jsonDecoder._decodeBool(jsonPath + ".canCreateGetter", json["canCreateGetter"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "canCreateGetter");
+      }
+      List<RefactoringMethodParameter> parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeList(jsonPath + ".parameters", json["parameters"], (String jsonPath, Object json) => new RefactoringMethodParameter.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "parameters");
+      }
+      int occurrences;
+      if (json.containsKey("occurrences")) {
+        occurrences = jsonDecoder._decodeInt(jsonPath + ".occurrences", json["occurrences"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "occurrences");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      List<int> lengths;
+      if (json.containsKey("lengths")) {
+        lengths = jsonDecoder._decodeList(jsonPath + ".lengths", json["lengths"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "lengths");
+      }
+      return new ExtractMethodFeedback(offset, length, returnType, names, canCreateGetter, parameters, occurrences, offsets, lengths);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractMethod feedback");
+    }
+  }
+
+  factory ExtractMethodFeedback.fromRefactoringResult(EditGetRefactoringResult refactoringResult) {
+    return new ExtractMethodFeedback.fromJson(
+        new ResponseDecoder(), "feedback", refactoringResult.feedback);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["returnType"] = returnType;
+    result["names"] = names;
+    result["canCreateGetter"] = canCreateGetter;
+    result["parameters"] = parameters.map((RefactoringMethodParameter value) => value.toJson()).toList();
+    result["occurrences"] = occurrences;
+    result["offsets"] = offsets;
+    result["lengths"] = lengths;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractMethodFeedback) {
+      return offset == other.offset &&
+          length == other.length &&
+          returnType == other.returnType &&
+          _listEqual(names, other.names, (String a, String b) => a == b) &&
+          canCreateGetter == other.canCreateGetter &&
+          _listEqual(parameters, other.parameters, (RefactoringMethodParameter a, RefactoringMethodParameter b) => a == b) &&
+          occurrences == other.occurrences &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          _listEqual(lengths, other.lengths, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, names.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, canCreateGetter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, occurrences.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, lengths.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractMethod options
+ *
+ * {
+ *   "returnType": String
+ *   "createGetter": bool
+ *   "name": String
+ *   "parameters": List<RefactoringMethodParameter>
+ *   "extractAll": bool
+ * }
+ */
+class ExtractMethodOptions {
+  /**
+   * The return type that should be defined for the method.
+   */
+  String returnType;
+
+  /**
+   * True if a getter should be created rather than a method. It is an error if
+   * this field is true and the list of parameters is non-empty.
+   */
+  bool createGetter;
+
+  /**
+   * The name that the method should be given.
+   */
+  String name;
+
+  /**
+   * The parameters that should be defined for the method.
+   *
+   * It is an error if a REQUIRED or NAMED parameter follows a POSITIONAL
+   * parameter. It is an error if a REQUIRED or POSITIONAL parameter follows a
+   * NAMED parameter.
+   *
+   * - To change the order and/or update proposed paramerers, add parameters
+   *   with the same identifiers as proposed.
+   * - To add new parameters, omit their identifier.
+   * - To remove some parameters, omit them in this list.
+   */
+  List<RefactoringMethodParameter> parameters;
+
+  /**
+   * True if all occurrences of the expression or statements should be replaced
+   * by an invocation of the method. The expression or statements used to
+   * initiate the refactoring will always be replaced.
+   */
+  bool extractAll;
+
+  ExtractMethodOptions(this.returnType, this.createGetter, this.name, this.parameters, this.extractAll);
+
+  factory ExtractMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "returnType");
+      }
+      bool createGetter;
+      if (json.containsKey("createGetter")) {
+        createGetter = jsonDecoder._decodeBool(jsonPath + ".createGetter", json["createGetter"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "createGetter");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      List<RefactoringMethodParameter> parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeList(jsonPath + ".parameters", json["parameters"], (String jsonPath, Object json) => new RefactoringMethodParameter.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "parameters");
+      }
+      bool extractAll;
+      if (json.containsKey("extractAll")) {
+        extractAll = jsonDecoder._decodeBool(jsonPath + ".extractAll", json["extractAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "extractAll");
+      }
+      return new ExtractMethodOptions(returnType, createGetter, name, parameters, extractAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractMethod options");
+    }
+  }
+
+  factory ExtractMethodOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new ExtractMethodOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["returnType"] = returnType;
+    result["createGetter"] = createGetter;
+    result["name"] = name;
+    result["parameters"] = parameters.map((RefactoringMethodParameter value) => value.toJson()).toList();
+    result["extractAll"] = extractAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractMethodOptions) {
+      return returnType == other.returnType &&
+          createGetter == other.createGetter &&
+          name == other.name &&
+          _listEqual(parameters, other.parameters, (RefactoringMethodParameter a, RefactoringMethodParameter b) => a == b) &&
+          extractAll == other.extractAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, createGetter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, extractAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * inlineLocalVariable feedback
+ */
+class InlineLocalVariableFeedback {
+  @override
+  bool operator==(other) {
+    if (other is InlineLocalVariableFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 247971243;
+  }
+}
+/**
+ * inlineLocalVariable options
+ */
+class InlineLocalVariableOptions {
+  @override
+  bool operator==(other) {
+    if (other is InlineLocalVariableOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 540364977;
+  }
+}
+/**
+ * inlineMethod feedback
+ */
+class InlineMethodFeedback {
+  @override
+  bool operator==(other) {
+    if (other is InlineMethodFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 882400079;
+  }
+}
+
+/**
+ * inlineMethod options
+ *
+ * {
+ *   "deleteSource": bool
+ *   "inlineAll": bool
+ * }
+ */
+class InlineMethodOptions {
+  /**
+   * True if the method being inlined should be removed. It is an error if this
+   * field is true and inlineAll is false.
+   */
+  bool deleteSource;
+
+  /**
+   * True if all invocations of the method should be inlined, or false if only
+   * the invocation site used to create this refactoring should be inlined.
+   */
+  bool inlineAll;
+
+  InlineMethodOptions(this.deleteSource, this.inlineAll);
+
+  factory InlineMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool deleteSource;
+      if (json.containsKey("deleteSource")) {
+        deleteSource = jsonDecoder._decodeBool(jsonPath + ".deleteSource", json["deleteSource"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "deleteSource");
+      }
+      bool inlineAll;
+      if (json.containsKey("inlineAll")) {
+        inlineAll = jsonDecoder._decodeBool(jsonPath + ".inlineAll", json["inlineAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "inlineAll");
+      }
+      return new InlineMethodOptions(deleteSource, inlineAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "inlineMethod options");
+    }
+  }
+
+  factory InlineMethodOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new InlineMethodOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["deleteSource"] = deleteSource;
+    result["inlineAll"] = inlineAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is InlineMethodOptions) {
+      return deleteSource == other.deleteSource &&
+          inlineAll == other.inlineAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, deleteSource.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, inlineAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * rename feedback
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class RenameFeedback {
+  /**
+   * The offset to the beginning of the name selected to be renamed.
+   */
+  int offset;
+
+  /**
+   * The length of the name selected to be renamed.
+   */
+  int length;
+
+  RenameFeedback(this.offset, this.length);
+
+  factory RenameFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new RenameFeedback(offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "rename feedback");
+    }
+  }
+
+  factory RenameFeedback.fromRefactoringResult(EditGetRefactoringResult refactoringResult) {
+    return new RenameFeedback.fromJson(
+        new ResponseDecoder(), "feedback", refactoringResult.feedback);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RenameFeedback) {
+      return offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * rename options
+ *
+ * {
+ *   "newName": String
+ * }
+ */
+class RenameOptions {
+  /**
+   * The name that the element should have after the refactoring.
+   */
+  String newName;
+
+  RenameOptions(this.newName);
+
+  factory RenameOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String newName;
+      if (json.containsKey("newName")) {
+        newName = jsonDecoder._decodeString(jsonPath + ".newName", json["newName"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "newName");
+      }
+      return new RenameOptions(newName);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "rename options");
+    }
+  }
+
+  factory RenameOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new RenameOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["newName"] = newName;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RenameOptions) {
+      return newName == other.newName;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, newName.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index d8b10ec..8dea71d 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -10,82 +10,56 @@
 import 'package:analysis_server/src/computer/computer_occurrences.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/computer/computer_overrides.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/operation/operation.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol;
+import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/html.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analysis_server/src/computer/error.dart' as server_prefix;
 
 
 void sendAnalysisNotificationErrors(AnalysisServer server, String file,
     LineInfo lineInfo, List<AnalysisError> errors) {
-  Notification notification = new Notification(ANALYSIS_ERRORS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      ERRORS,
-      server_prefix.engineErrorsToJson(lineInfo, errors));
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisErrorsParams(file,
+      protocol.AnalysisError.listFromEngine(lineInfo, errors)).toNotification());
 }
 
 
 void sendAnalysisNotificationHighlights(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  Notification notification = new Notification(ANALYSIS_HIGHLIGHTS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitHighlightsComputer(dartUnit).compute());
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisHighlightsParams(file,
+      new DartUnitHighlightsComputer(dartUnit).compute()).toNotification());
 }
 
 
 void sendAnalysisNotificationNavigation(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  Notification notification = new Notification(ANALYSIS_NAVIGATION);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitNavigationComputer(dartUnit).compute());
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisNavigationParams(file,
+      new DartUnitNavigationComputer(dartUnit).compute()).toNotification());
 }
 
 
 void sendAnalysisNotificationOccurrences(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  Notification notification = new Notification(ANALYSIS_OCCURRENCES);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      OCCURRENCES,
-      new DartUnitOccurrencesComputer(dartUnit).compute());
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisOccurrencesParams(file,
+      new DartUnitOccurrencesComputer(dartUnit).compute()).toNotification());
 }
 
 
 void sendAnalysisNotificationOutline(AnalysisServer server,
     AnalysisContext context, Source source, CompilationUnit dartUnit) {
-  Notification notification = new Notification(ANALYSIS_OUTLINE);
-  notification.setParameter(FILE, source.fullName);
-  notification.setParameter(
-      OUTLINE,
-      new DartUnitOutlineComputer(context, source, dartUnit).compute());
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisOutlineParams(source.fullName,
+      new DartUnitOutlineComputer(context, source,
+          dartUnit).compute()).toNotification());
 }
 
 
 void sendAnalysisNotificationOverrides(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  Notification notification = new Notification(ANALYSIS_OVERRIDES);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      OVERRIDES,
-      new DartUnitOverridesComputer(dartUnit).compute());
-  server.sendNotification(notification);
+  server.sendNotification(new protocol.AnalysisOverridesParams(file,
+      new DartUnitOverridesComputer(dartUnit).compute()).toNotification());
 }
 
 
@@ -142,19 +116,19 @@
       // Dart
       CompilationUnit dartUnit = notice.compilationUnit;
       if (dartUnit != null) {
-        if (server.hasAnalysisSubscription(AnalysisService.HIGHLIGHTS, file)) {
+        if (server.hasAnalysisSubscription(protocol.AnalysisService.HIGHLIGHTS, file)) {
           sendAnalysisNotificationHighlights(server, file, dartUnit);
         }
-        if (server.hasAnalysisSubscription(AnalysisService.NAVIGATION, file)) {
+        if (server.hasAnalysisSubscription(protocol.AnalysisService.NAVIGATION, file)) {
           sendAnalysisNotificationNavigation(server, file, dartUnit);
         }
-        if (server.hasAnalysisSubscription(AnalysisService.OCCURRENCES, file)) {
+        if (server.hasAnalysisSubscription(protocol.AnalysisService.OCCURRENCES, file)) {
           sendAnalysisNotificationOccurrences(server, file, dartUnit);
         }
-        if (server.hasAnalysisSubscription(AnalysisService.OUTLINE, file)) {
+        if (server.hasAnalysisSubscription(protocol.AnalysisService.OUTLINE, file)) {
           sendAnalysisNotificationOutline(server, context, source, dartUnit);
         }
-        if (server.hasAnalysisSubscription(AnalysisService.OVERRIDES, file)) {
+        if (server.hasAnalysisSubscription(protocol.AnalysisService.OVERRIDES, file)) {
           sendAnalysisNotificationOverrides(server, file, dartUnit);
         }
       }
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 894dbc6..d4d3536 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -5,45 +5,608 @@
 library protocol;
 
 import 'dart:collection';
-import 'dart:convert' show JsonDecoder;
+import 'dart:convert';
 
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/computer/element.dart' show
+    elementFromEngine;
+import 'package:analysis_server/src/search/search_result.dart' show
+    searchResultFromMatch;
+import 'package:analysis_server/src/services/correction/fix.dart' show Fix;
+import 'package:analysis_server/src/services/search/search_engine.dart' as
+    engine;
+import 'package:analyzer/src/generated/ast.dart' as engine;
+import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analyzer/src/generated/error.dart' as engine;
+import 'package:analyzer/src/generated/source.dart' as engine;
+
+part 'generated_protocol.dart';
 
 /**
- * An abstract enumeration.
+ * Translate the input [map], applying [keyCallback] to all its keys, and
+ * [valueCallback] to all its values.
  */
-abstract class Enum2<E extends Enum2> implements Comparable<E> {
-  /**
-   * The name of this enum constant, as declared in the enum declaration.
-   */
-  final String name;
+mapMap(Map map, {dynamic keyCallback(key), dynamic valueCallback(value)}) {
+  Map result = {};
+  map.forEach((key, value) {
+    if (keyCallback != null) {
+      key = keyCallback(key);
+    }
+    if (valueCallback != null) {
+      value = valueCallback(value);
+    }
+    result[key] = value;
+  });
+  return result;
+}
 
-  /**
-   * The position in the enum declaration.
-   */
-  final int ordinal;
+/**
+ * Adds the given [sourceEdits] to the list in [sourceFileEdit].
+ */
+void _addAllEditsForSource(SourceFileEdit sourceFileEdit,
+    Iterable<SourceEdit> edits) {
+  edits.forEach(sourceFileEdit.add);
+}
 
-  const Enum2(this.name, this.ordinal);
+/**
+ * Adds the given [sourceEdit] to the list in [sourceFileEdit].
+ */
+void _addEditForSource(SourceFileEdit sourceFileEdit, SourceEdit sourceEdit) {
+  List<SourceEdit> edits = sourceFileEdit.edits;
+  int index = 0;
+  while (index < edits.length && edits[index].offset > sourceEdit.offset) {
+    index++;
+  }
+  edits.insert(index, sourceEdit);
+}
 
-  @override
-  int get hashCode => ordinal;
+/**
+ * Adds [edit] to the [FileEdit] for the given [file].
+ */
+void _addEditToSourceChange(SourceChange change, String file, SourceEdit edit) {
+  SourceFileEdit fileEdit = change.getFileEdit(file);
+  if (fileEdit == null) {
+    fileEdit = new SourceFileEdit(file);
+    change.addFileEdit(fileEdit);
+  }
+  fileEdit.add(edit);
+}
 
-  @override
-  String toString() => name;
-
-  int compareTo(E other) => ordinal - other.ordinal;
-
-  /**
-   * Returns the enum constant with the given [name], `null` if not found.
-   */
-  static Enum2 valueOf(List<Enum2> values, String name) {
-    for (int i = 0; i < values.length; i++) {
-      Enum2 value = values[i];
-      if (value.name == name) {
-        return value;
+/**
+ * Create an AnalysisError based on error information from the analyzer
+ * engine.  Access via AnalysisError.fromEngine().
+ */
+AnalysisError _analysisErrorFromEngine(engine.LineInfo lineInfo,
+    engine.AnalysisError error) {
+  engine.ErrorCode errorCode = error.errorCode;
+  // prepare location
+  Location location;
+  {
+    String file = error.source.fullName;
+    int offset = error.offset;
+    int length = error.length;
+    int startLine = -1;
+    int startColumn = -1;
+    if (lineInfo != null) {
+      engine.LineInfo_Location lineLocation = lineInfo.getLocation(offset);
+      if (lineLocation != null) {
+        startLine = lineLocation.lineNumber;
+        startColumn = lineLocation.columnNumber;
       }
     }
-    return null;
+    location = new Location(file, offset, length, startLine, startColumn);
+  }
+  // done
+  var severity = new ErrorSeverity(errorCode.errorSeverity.name);
+  var type = new ErrorType(errorCode.type.name);
+  String message = error.message;
+  String correction = error.correction;
+  return new AnalysisError(
+      severity,
+      type,
+      location,
+      message,
+      correction: correction);
+}
+
+/**
+ * Returns a list of AnalysisErrors correponding to the given list of Engine
+ * errors.  Access via AnalysisError.listFromEngine().
+ */
+List<AnalysisError> _analysisErrorListFromEngine(engine.LineInfo lineInfo,
+    List<engine.AnalysisError> errors) {
+  return errors.map((engine.AnalysisError error) {
+    return new AnalysisError.fromEngine(lineInfo, error);
+  }).toList();
+}
+
+/**
+ * Get the result of applying the edit to the given [code].  Access via
+ * SourceEdit.apply().
+ */
+String _applyEdit(String code, SourceEdit edit) {
+  return code.substring(0, edit.offset) +
+      edit.replacement +
+      code.substring(edit.end);
+}
+
+/**
+ * Get the result of applying a set of [edits] to the given [code].  Edits
+ * are applied in the order they appear in [edits].  Access via
+ * SourceEdit.applySequence().
+ */
+String _applySequence(String code, Iterable<SourceEdit> edits) {
+  edits.forEach((SourceEdit edit) {
+    code = edit.apply(code);
+  });
+  return code;
+}
+
+/**
+ * Map an element kind from the analyzer engine to a [CompletionSuggestionKind].
+ */
+CompletionSuggestionKind _completionSuggestionKindFromElementKind(engine.ElementKind kind) {
+  //    ElementKind.ANGULAR_FORMATTER,
+  //    ElementKind.ANGULAR_COMPONENT,
+  //    ElementKind.ANGULAR_CONTROLLER,
+  //    ElementKind.ANGULAR_DIRECTIVE,
+  //    ElementKind.ANGULAR_PROPERTY,
+  //    ElementKind.ANGULAR_SCOPE_PROPERTY,
+  //    ElementKind.ANGULAR_SELECTOR,
+  //    ElementKind.ANGULAR_VIEW,
+  if (kind == engine.ElementKind.CLASS) return CompletionSuggestionKind.CLASS;
+  //    ElementKind.COMPILATION_UNIT,
+  if (kind == engine.ElementKind.CONSTRUCTOR) return CompletionSuggestionKind.CONSTRUCTOR;
+  //    ElementKind.DYNAMIC,
+  //    ElementKind.EMBEDDED_HTML_SCRIPT,
+  //    ElementKind.ERROR,
+  //    ElementKind.EXPORT,
+  //    ElementKind.EXTERNAL_HTML_SCRIPT,
+  if (kind == engine.ElementKind.FIELD) return CompletionSuggestionKind.FIELD;
+  if (kind == engine.ElementKind.FUNCTION) return CompletionSuggestionKind.FUNCTION;
+  if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) return CompletionSuggestionKind.FUNCTION_TYPE_ALIAS;
+  if (kind == engine.ElementKind.GETTER) return CompletionSuggestionKind.GETTER;
+  //    ElementKind.HTML,
+  if (kind == engine.ElementKind.IMPORT) return CompletionSuggestionKind.IMPORT;
+  //    ElementKind.LABEL,
+  //    ElementKind.LIBRARY,
+  if (kind == engine.ElementKind.LOCAL_VARIABLE) return CompletionSuggestionKind.LOCAL_VARIABLE;
+  if (kind == engine.ElementKind.METHOD) return CompletionSuggestionKind.METHOD;
+  //    ElementKind.NAME,
+  if (kind == engine.ElementKind.PARAMETER) return CompletionSuggestionKind.PARAMETER;
+  //    ElementKind.POLYMER_ATTRIBUTE,
+  //    ElementKind.POLYMER_TAG_DART,
+  //    ElementKind.POLYMER_TAG_HTML,
+  //    ElementKind.PREFIX,
+  if (kind == engine.ElementKind.SETTER) return CompletionSuggestionKind.SETTER;
+  if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) return CompletionSuggestionKind.TOP_LEVEL_VARIABLE;
+  //    ElementKind.TYPE_PARAMETER,
+  //    ElementKind.UNIVERSE
+  throw new ArgumentError('Unknown CompletionSuggestionKind for: $kind');
+}
+
+/**
+ * Create an ElementKind based on a value from the analyzer engine.  Access
+ * this function via new ElementKind.fromEngine().
+ */
+ElementKind _elementKindFromEngine(engine.ElementKind kind) {
+  if (kind == engine.ElementKind.CLASS) {
+    return ElementKind.CLASS;
+  }
+  if (kind == engine.ElementKind.COMPILATION_UNIT) {
+    return ElementKind.COMPILATION_UNIT;
+  }
+  if (kind == engine.ElementKind.CONSTRUCTOR) {
+    return ElementKind.CONSTRUCTOR;
+  }
+  if (kind == engine.ElementKind.FIELD) {
+    return ElementKind.FIELD;
+  }
+  if (kind == engine.ElementKind.FUNCTION) {
+    return ElementKind.FUNCTION;
+  }
+  if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) {
+    return ElementKind.FUNCTION_TYPE_ALIAS;
+  }
+  if (kind == engine.ElementKind.GETTER) {
+    return ElementKind.GETTER;
+  }
+  if (kind == engine.ElementKind.LIBRARY) {
+    return ElementKind.LIBRARY;
+  }
+  if (kind == engine.ElementKind.LOCAL_VARIABLE) {
+    return ElementKind.LOCAL_VARIABLE;
+  }
+  if (kind == engine.ElementKind.METHOD) {
+    return ElementKind.METHOD;
+  }
+  if (kind == engine.ElementKind.PARAMETER) {
+    return ElementKind.PARAMETER;
+  }
+  if (kind == engine.ElementKind.SETTER) {
+    return ElementKind.SETTER;
+  }
+  if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) {
+    return ElementKind.TOP_LEVEL_VARIABLE;
+  }
+  if (kind == engine.ElementKind.TYPE_PARAMETER) {
+    return ElementKind.TYPE_PARAMETER;
+  }
+  return ElementKind.UNKNOWN;
+}
+
+/**
+ * Returns the [FileEdit] for the given [file], maybe `null`.
+ */
+SourceFileEdit _getChangeFileEdit(SourceChange change, String file) {
+  for (SourceFileEdit fileEdit in change.edits) {
+    if (fileEdit.file == file) {
+      return fileEdit;
+    }
+  }
+  return null;
+}
+
+/**
+ * Compare the lists [listA] and [listB], using [itemEqual] to compare
+ * list elements.
+ */
+bool _listEqual(List listA, List listB, bool itemEqual(a, b)) {
+  if (listA.length != listB.length) {
+    return false;
+  }
+  for (int i = 0; i < listA.length; i++) {
+    if (!itemEqual(listA[i], listB[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
+ * Creates a new [Location].
+ */
+Location _locationForArgs(engine.AnalysisContext context, engine.Source source,
+    engine.SourceRange range) {
+  int startLine = 0;
+  int startColumn = 0;
+  {
+    engine.LineInfo lineInfo = context.getLineInfo(source);
+    if (lineInfo != null) {
+      engine.LineInfo_Location offsetLocation =
+          lineInfo.getLocation(range.offset);
+      startLine = offsetLocation.lineNumber;
+      startColumn = offsetLocation.columnNumber;
+    }
+  }
+  return new Location(
+      source.fullName,
+      range.offset,
+      range.length,
+      startLine,
+      startColumn);
+}
+
+/**
+ * Creates a new [Location] for the given [engine.Element].
+ */
+Location _locationFromElement(engine.Element element) {
+  engine.AnalysisContext context = element.context;
+  engine.Source source = element.source;
+  String name = element.displayName;
+  int offset = element.nameOffset;
+  int length = name != null ? name.length : 0;
+  if (element is engine.CompilationUnitElement) {
+    offset = 0;
+    length = 0;
+  }
+  engine.SourceRange range = new engine.SourceRange(offset, length);
+  return _locationForArgs(context, source, range);
+}
+
+/**
+ * Creates a new [Location] for the given [engine.SearchMatch].
+ */
+Location _locationFromMatch(engine.SearchMatch match) {
+  engine.Element enclosingElement = match.element;
+  return _locationForArgs(
+      enclosingElement.context,
+      enclosingElement.source,
+      match.sourceRange);
+}
+
+/**
+ * Creates a new [Location] for the given [engine.AstNode].
+ */
+Location _locationFromNode(engine.AstNode node) {
+  engine.CompilationUnit unit =
+      node.getAncestor((node) => node is engine.CompilationUnit);
+  engine.CompilationUnitElement unitElement = unit.element;
+  engine.AnalysisContext context = unitElement.context;
+  engine.Source source = unitElement.source;
+  engine.SourceRange range = new engine.SourceRange(node.offset, node.length);
+  return _locationForArgs(context, source, range);
+}
+
+/**
+ * Creates a new [Location] for the given [engine.CompilationUnit].
+ */
+Location _locationFromUnit(engine.CompilationUnit unit,
+    engine.SourceRange range) {
+  engine.CompilationUnitElement unitElement = unit.element;
+  engine.AnalysisContext context = unitElement.context;
+  engine.Source source = unitElement.source;
+  return _locationForArgs(context, source, range);
+}
+
+/**
+ * Compare the maps [mapA] and [mapB], using [valueEqual] to compare map
+ * values.
+ */
+bool _mapEqual(Map mapA, Map mapB, bool valueEqual(a, b)) {
+  if (mapA.length != mapB.length) {
+    return false;
+  }
+  for (var key in mapA.keys) {
+    if (!mapB.containsKey(key)) {
+      return false;
+    }
+    if (!valueEqual(mapA[key], mapB[key])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+RefactoringProblemSeverity
+    _maxRefactoringProblemSeverity(RefactoringProblemSeverity a,
+    RefactoringProblemSeverity b) {
+  if (b == null) {
+    return a;
+  }
+  if (a == null) {
+    return b;
+  } else if (a == RefactoringProblemSeverity.INFO) {
+    return b;
+  } else if (a == RefactoringProblemSeverity.WARNING) {
+    if (b == RefactoringProblemSeverity.ERROR ||
+        b == RefactoringProblemSeverity.FATAL) {
+      return b;
+    }
+  } else if (a == RefactoringProblemSeverity.ERROR) {
+    if (b == RefactoringProblemSeverity.FATAL) {
+      return b;
+    }
+  }
+  return a;
+}
+
+/**
+ * Create an OverriddenMember based on an element from the analyzer engine.
+ */
+OverriddenMember _overriddenMemberFromEngine(engine.Element member) {
+  Element element = elementFromEngine(member);
+  String className = member.enclosingElement.displayName;
+  return new OverriddenMember(element, className);
+}
+
+
+/**
+ * Create a SearchResultKind based on a value from the search engine.
+ */
+SearchResultKind _searchResultKindFromEngine(engine.MatchKind kind) {
+  if (kind == engine.MatchKind.DECLARATION) {
+    return SearchResultKind.DECLARATION;
+  }
+  if (kind == engine.MatchKind.READ) {
+    return SearchResultKind.READ;
+  }
+  if (kind == engine.MatchKind.READ_WRITE) {
+    return SearchResultKind.READ_WRITE;
+  }
+  if (kind == engine.MatchKind.WRITE) {
+    return SearchResultKind.WRITE;
+  }
+  if (kind == engine.MatchKind.INVOCATION) {
+    return SearchResultKind.INVOCATION;
+  }
+  if (kind == engine.MatchKind.REFERENCE) {
+    return SearchResultKind.REFERENCE;
+  }
+  return SearchResultKind.UNKNOWN;
+}
+
+
+/**
+ * Type of callbacks used to decode parts of JSON objects.  [jsonPath] is a
+ * string describing the part of the JSON object being decoded, and [value] is
+ * the part to decode.
+ */
+typedef Object JsonDecoderCallback(String jsonPath, Object value);
+
+/**
+ * Base class for decoding JSON objects.  The derived class must implement
+ * error reporting logic.
+ */
+abstract class JsonDecoder {
+  /**
+   * Create an exception to throw if the JSON object at [jsonPath] fails to
+   * match the API definition of [expected].
+   */
+  dynamic mismatch(String jsonPath, String expected);
+
+  /**
+   * Create an exception to throw if the JSON object at [jsonPath] is missing
+   * the key [key].
+   */
+  dynamic missingKey(String jsonPath, String key);
+
+  /**
+   * Decode a JSON object that is expected to be a boolean.  The strings "true"
+   * and "false" are also accepted.
+   */
+  bool _decodeBool(String jsonPath, Object json) {
+    if (json is bool) {
+      return json;
+    } else if (json == 'true') {
+      return true;
+    } else if (json == 'false') {
+      return false;
+    }
+    throw mismatch(jsonPath, 'bool');
+  }
+
+  /**
+   * Decode a JSON object that is expected to be an integer.  A string
+   * representation of an integer is also accepted.
+   */
+  int _decodeInt(String jsonPath, Object json) {
+    if (json is int) {
+      return json;
+    } else if (json is String) {
+      return int.parse(json, onError: (String value) {
+        throw mismatch(jsonPath, 'int');
+      });
+    }
+    throw mismatch(jsonPath, 'int');
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a List.  [decoder] is used to
+   * decode the items in the list.
+   */
+  List _decodeList(String jsonPath, Object json,
+      [JsonDecoderCallback decoder]) {
+    if (json == null) {
+      return [];
+    } else if (json is List) {
+      List result = [];
+      for (int i = 0; i < json.length; i++) {
+        result.add(decoder('$jsonPath[$i]', json[i]));
+      }
+      return result;
+    } else {
+      throw mismatch(jsonPath, 'List');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a Map.  [keyDecoder] is used
+   * to decode the keys, and [valueDecoder] is used to decode the values.
+   */
+  Map _decodeMap(String jsonPath, Object json, {JsonDecoderCallback keyDecoder,
+      JsonDecoderCallback valueDecoder}) {
+    if (json == null) {
+      return {};
+    } else if (json is Map) {
+      Map result = {};
+      json.forEach((String key, value) {
+        Object decodedKey;
+        if (keyDecoder != null) {
+          decodedKey = keyDecoder('$jsonPath.key', key);
+        } else {
+          decodedKey = key;
+        }
+        if (valueDecoder != null) {
+          value = valueDecoder('$jsonPath[${JSON.encode(key)}]', value);
+        }
+        result[decodedKey] = value;
+      });
+      return result;
+    } else {
+      throw mismatch(jsonPath, 'Map');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a string.
+   */
+  String _decodeString(String jsonPath, Object json) {
+    if (json is String) {
+      return json;
+    } else {
+      throw mismatch(jsonPath, 'String');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be one of several choices,
+   * where the choices are disambiguated by the contents of the field [field].
+   * [decoders] is a map from each possible string in the field to the decoder
+   * that should be used to decode the JSON object.
+   */
+  Object _decodeUnion(String jsonPath, Map json, String field, Map<String,
+      JsonDecoderCallback> decoders) {
+    if (json is Map) {
+      if (!json.containsKey(field)) {
+        throw missingKey(jsonPath, field);
+      }
+      var disambiguatorPath = '$jsonPath[${JSON.encode(field)}]';
+      String disambiguator = _decodeString(disambiguatorPath, json[field]);
+      if (!decoders.containsKey(disambiguator)) {
+        throw mismatch(disambiguatorPath, 'One of: ${decoders.keys.toList()}');
+      }
+      return decoders[disambiguator](jsonPath, json);
+    } else {
+      throw mismatch(jsonPath, 'Map');
+    }
+  }
+}
+
+
+/**
+ * Instances of the class [Notification] represent a notification from the
+ * server about an event that occurred.
+ */
+class Notification {
+  /**
+   * The name of the JSON attribute containing the name of the event that
+   * triggered the notification.
+   */
+  static const String EVENT = 'event';
+
+  /**
+   * The name of the JSON attribute containing the result values.
+   */
+  static const String PARAMS = 'params';
+
+  /**
+   * The name of the event that triggered the notification.
+   */
+  final String event;
+
+  /**
+   * A table mapping the names of notification parameters to their values, or
+   * null if there are no notification parameters.
+   */
+  Map<String, Object> _params;
+
+  /**
+   * Initialize a newly created [Notification] to have the given [event] name.
+   * If [_params] is provided, it will be used as the params; otherwise no
+   * params will be used.
+   */
+  Notification(this.event, [this._params]);
+
+  /**
+   * Initialize a newly created instance based upon the given JSON data
+   */
+  factory Notification.fromJson(Map<String, Object> json) {
+    return new Notification(json[Notification.EVENT],
+        json[Notification.PARAMS]);
+  }
+
+  /**
+   * Return a table representing the structure of the Json object that will be
+   * sent to the client to represent this response.
+   */
+  Map<String, Object> toJson() {
+    Map<String, Object> jsonObject = {};
+    jsonObject[EVENT] = event;
+    if (_params != null) {
+      jsonObject[PARAMS] = _params;
+    }
+    return jsonObject;
   }
 }
 
@@ -80,18 +643,15 @@
   /**
    * A table mapping the names of request parameters to their values.
    */
-  final Map<String, Object> params = new HashMap<String, Object>();
-
-  /**
-   * A decoder that can be used to decode strings into JSON objects.
-   */
-  static const JsonDecoder DECODER = const JsonDecoder(null);
+  final Map<String, Object> _params;
 
   /**
    * Initialize a newly created [Request] to have the given [id] and [method]
-   * name.
+   * name.  If [params] is supplied, it is used as the "params" map for the
+   * request.  Otherwise an empty "params" map is allocated.
    */
-  Request(this.id, this.method);
+  Request(this.id, this.method, [Map<String, Object> params])
+      : _params = params != null ? params : new HashMap<String, Object>();
 
   /**
    * Return a request parsed from the given [data], or `null` if the [data] is
@@ -111,7 +671,7 @@
    */
   factory Request.fromString(String data) {
     try {
-      var result = DECODER.convert(data);
+      var result = JSON.decode(data);
       if (result is! Map) {
         return null;
       }
@@ -121,51 +681,17 @@
         return null;
       }
       var params = result[Request.PARAMS];
-      Request request = new Request(id, method);
-      if (params is Map) {
-        params.forEach((String key, Object value) {
-          request.setParameter(key, value);
-        });
-      } else if (params != null) {
+      if (params is Map || params == null) {
+        return new Request(id, method, params);
+      } else {
         return null;
       }
-      return request;
     } catch (exception) {
       return null;
     }
   }
 
   /**
-   * Return the value of the parameter with the given [name], or [defaultValue]
-   * if there is no such parameter associated with this request.
-   */
-  RequestDatum getParameter(String name, defaultValue) {
-    if (!params.containsKey(name)) {
-      return new RequestDatum(this, "default for $name", defaultValue);
-    }
-    return new RequestDatum(this, name, params[name]);
-  }
-
-  /**
-   * Return the value of the parameter with the given [name], or throw a
-   * [RequestFailure] exception with an appropriate error message if there is no
-   * such parameter associated with this request.
-   */
-  RequestDatum getRequiredParameter(String name) {
-    if (!params.containsKey(name)) {
-      throw new RequestFailure(new Response.missingRequiredParameter(this, name));
-    }
-    return new RequestDatum(this, name, params[name]);
-  }
-
-  /**
-   * Set the value of the parameter with the given [name] to the given [value].
-   */
-  void setParameter(String name, Object value) {
-    params[name] = value;
-  }
-
-  /**
    * Return a table representing the structure of the Json object that will be
    * sent to the client to represent this response.
    */
@@ -173,498 +699,38 @@
     Map<String, Object> jsonObject = new HashMap<String, Object>();
     jsonObject[ID] = id;
     jsonObject[METHOD] = method;
-    if (params.isNotEmpty) {
-      jsonObject[PARAMS] = params;
+    if (_params.isNotEmpty) {
+      jsonObject[PARAMS] = _params;
     }
     return jsonObject;
   }
 }
 
 /**
- * Instances of the class [RequestDatum] wrap a piece of data from a
- * request parameter, and contain accessor methods which automatically validate
- * and convert the data into the appropriate form.
+ * JsonDecoder for decoding requests.  Errors are reporting by throwing a
+ * [RequestFailure].
  */
-class RequestDatum {
+class RequestDecoder extends JsonDecoder {
   /**
-   * Request object that should be referred to in any errors that are
-   * generated.
+   * The request being deserialized.
    */
-  final Request request;
+  final Request _request;
 
-  /**
-   * String description of how [datum] was obtained from the request.
-   */
-  final String path;
+  RequestDecoder(this._request);
 
-  /**
-   * Value to be decoded and validated.
-   */
-  final dynamic datum;
-
-  /**
-   * Create a RequestDatum for decoding and validating [datum], which refers to
-   * [request] in any errors it reports.
-   */
-  RequestDatum(this.request, this.path, this.datum);
-
-  /**
-   * Validate that the datum is a Map containing the given [key], and return
-   * a [RequestDatum] containing the corresponding value.
-   */
-  RequestDatum operator [](String key) {
-    Map<String, Object> map = _asMap();
-    if (!map.containsKey(key)) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "contain key '$key'"));
-    }
-    return new RequestDatum(request, "$path.$key", map[key]);
+  @override
+  dynamic mismatch(String jsonPath, String expected) {
+    return new RequestFailure(
+        new Response.invalidParameter(_request, jsonPath, 'be $expected'));
   }
 
-  /**
-   * Return `true` if the datum is a Map containing the given [key].
-   */
-  bool hasKey(String key) {
-    return _asMap().containsKey(key);
-  }
-
-  /**
-   * Validate that the datum is a Map, and return an iterable for its keys.
-   */
-  Iterable<String> get keys => _asMap().keys;
-
-  /**
-   * 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)) {
-    _asMap().forEach((String key, value) {
-      f(key, new RequestDatum(request, "$path.$key", value));
-    });
-  }
-
-  /**
-   * Validate that the datum is an integer (or a string that can be parsed
-   * as an integer), and return the int.
-   */
-  int asInt() {
-    if (datum is int) {
-      return datum;
-    } else if (datum is String) {
-      return int.parse(datum, onError: (String value) {
-        throw new RequestFailure(new Response.invalidParameter(request, path,
-            "be an integer"));
-      });
-    }
-    throw new RequestFailure(new Response.invalidParameter(request, path,
-        "be an integer"));
-  }
-
-  /**
-   * Validate that the datum is a boolean (or a string that can be parsed
-   * as a boolean), and return the bool.
-   *
-   * The value is typically the result of invoking either [getParameter] or
-   * [getRequiredParameter].
-   */
-  bool asBool() {
-    if (datum is bool) {
-      return datum;
-    } else if (datum == 'true') {
-      return true;
-    } else if (datum == 'false') {
-      return false;
-    }
-    throw new RequestFailure(new Response.invalidParameter(request, datum,
-        "be a boolean"));
-  }
-
-  /**
-   * Determine if the datum is a list.  Note: null is considered a synonym for
-   * the empty list.
-   */
-  bool get isList {
-    return datum == null || datum is List;
-  }
-
-  /**
-   * Validate that the datum is a list, and return it in raw form.
-   */
-  List _asList() {
-    if (!isList) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a list"));
-    }
-    if (datum == null) {
-      return [];
-    } else {
-      return datum;
-    }
-  }
-
-  /**
-   * Validate that the datum is a list, and return a list where each element in
-   * the datum has been converted using the provided function.
-   */
-  List asList(elementConverter(RequestDatum datum)) {
-    List result = [];
-    List list = _asList();
-    for (int i = 0; i < list.length; i++) {
-      result.add(elementConverter(new RequestDatum(request, "$path.$i", list[i])));
-    }
-    return result;
-  }
-
-  /**
-   * Validate that the datum is a string, and return it.
-   */
-  String asString() {
-    if (datum is! String) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a string"));
-    }
-    return datum;
-  }
-
-  /**
-   * Determine if the datum is a list of strings.  Note: null is considered a
-   * synonym for the empty list.
-   */
-  bool get isStringList {
-    if (!isList) {
-      return false;
-    }
-    for (var element in _asList()) {
-      if (element is! String) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /**
-   * Validate that the datum is a list of strings, and return it.  Note: null
-   * is considered a synonym for the empty list.
-   */
-  List<String> asStringList() {
-    if (!isStringList) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a list of strings"));
-    }
-    return _asList();
-  }
-
-  /**
-   * Validate that the datum is a list of strings, and convert it into [Enum]s.
-   */
-  Set<Enum2> asEnumSet(List<Enum2> allValues) {
-    Set values = new Set();
-    for (String name in asStringList()) {
-      Enum2 value = Enum2.valueOf(allValues, name);
-      if (value == null) {
-        throw new RequestFailure(new Response.invalidParameter(request, path,
-            "be a list of names from the list $allValues"));
-      }
-      values.add(value);
-    }
-    return values;
-  }
-
-  /**
-   * Determine if the datum is a map.  Note: null is considered a synonym for
-   * the empty map.
-   */
-  bool get isMap {
-    return datum == null || datum is Map;
-  }
-
-  /**
-   * Validate that the datum is a map, and return it in raw form.
-   */
-  Map<String, Object> _asMap() {
-    if (!isMap) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    if (datum == null) {
-      return {};
-    } else {
-      return datum;
-    }
-  }
-
-  /**
-   * Determine if the datum is a map whose values are all strings.  Note: null
-   * is considered a synonym for the empty map.
-   *
-   * Note: we can safely assume that the keys are all strings, since JSON maps
-   * cannot have any other key type.
-   */
-  bool get isStringMap {
-    if (!isMap) {
-      return false;
-    }
-    for (var value in _asMap().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 (!isStringMap) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a string map"));
-    }
-    return _asMap();
-  }
-
-  /**
-   * Determine if the datum is a map whose values are all string lists.  Note:
-   * null is considered a synonym for the empty map.
-   *
-   * Note: we can safely assume that the keys are all strings, since JSON maps
-   * cannot have any other key type.
-   */
-  bool get isStringListMap {
-    if (!isMap) {
-      return false;
-    }
-    for (var value in _asMap().values) {
-      if (value is! List) {
-        return false;
-      }
-      for (var listItem in value) {
-        if (listItem is! String) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  /**
-   * Validate that the datum is a map from strings to string lists, and return
-   * it.
-   */
-  Map<String, List<String>> asStringListMap() {
-    if (!isStringListMap) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a string list map"));
-    }
-    return _asMap();
-  }
-
-  bool get isNull => datum == null;
-}
-
-/**
- * Instances of the class [Response] represent a response to a request.
- */
-class Response {
-  /**
-   * The [Response] instance that is returned when a real [Response] cannot
-   * be provided at the moment.
-   */
-  static final Response DELAYED_RESPONSE = new Response('DELAYED_RESPONSE');
-
-  /**
-   * The name of the JSON attribute containing the id of the request for which
-   * this is a response.
-   */
-  static const String ID = 'id';
-
-  /**
-   * The name of the JSON attribute containing the error message.
-   */
-  static const String ERROR = 'error';
-
-  /**
-   * The name of the JSON attribute containing the result values.
-   */
-  static const String RESULT = 'result';
-
-  /**
-   * The unique identifier used to identify the request that this response is
-   * associated with.
-   */
-  final String id;
-
-  /**
-   * The error that was caused by attempting to handle the request, or `null` if
-   * there was no error.
-   */
-  final RequestError error;
-
-  /**
-   * A table mapping the names of result fields to their values.  Should be
-   * null if there is no result to send.
-   */
-  Map<String, Object> result;
-
-  /**
-   * Initialize a newly created instance to represent a response to a request
-   * with the given [id]. If an [error] is provided then the response will
-   * represent an error condition.
-   */
-  Response(this.id, [this.error]);
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a [request] referencing a context that does not exist.
-   */
-  Response.contextDoesNotExist(Request request)
-    : this(request.id, new RequestError('NONEXISTENT_CONTEXT', 'Context does not exist'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a [request] that had invalid parameter.  [path] is the path to the
-   * invalid parameter, in Javascript notation (e.g. "foo.bar" means that the
-   * parameter "foo" contained a key "bar" whose value was the wrong type).
-   * [expectation] is a description of the type of data that was expected.
-   */
-  Response.invalidParameter(Request request, String path, String expectation)
-      : this(request.id, new RequestError('INVALID_PARAMETER',
-          "Expected parameter $path to $expectation"));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a malformed request.
-   */
-  Response.invalidRequestFormat()
-    : this('', new RequestError('INVALID_REQUEST', 'Invalid request'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a [request] that does not have a required parameter.
-   */
-  Response.missingRequiredParameter(Request request, String parameterName)
-    : this(request.id, new RequestError('MISSING_PARAMETER', 'Missing required parameter: $parameterName'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a [request] that takes a set of analysis options but for which an
-   * unknown analysis option was provided.
-   */
-  Response.unknownAnalysisOption(Request request, String optionName)
-    : this(request.id, new RequestError('UNKNOWN_ANALYSIS_OPTION', 'Unknown analysis option: "$optionName"'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a [request] that cannot be handled by any known handlers.
-   */
-  Response.unknownRequest(Request request)
-    : this(request.id, new RequestError('UNKNOWN_REQUEST', 'Unknown request'));
-
-  Response.contextAlreadyExists(Request request)
-    : this(request.id, new RequestError('CONTENT_ALREADY_EXISTS', 'Context already exists'));
-
-  Response.unsupportedFeature(String requestId, String message)
-    : this(requestId, new RequestError('UNSUPPORTED_FEATURE', message));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a `analysis.setSubscriptions` [request] that includes an unknown
-   * analysis service name.
-   */
-  Response.unknownAnalysisService(Request request, String name)
-    : this(request.id, new RequestError('UNKNOWN_ANALYSIS_SERVICE', 'Unknown analysis service: "$name"'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a `analysis.setPriorityFiles` [request] that includes one or more files
-   * that are not being analyzed.
-   */
-  Response.unanalyzedPriorityFiles(Request request, String fileNames)
-    : this(request.id, new RequestError('UNANALYZED_PRIORITY_FILES', "Unanalyzed files cannot be a priority: '$fileNames'"));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by a `analysis.updateOptions` [request] that includes an unknown analysis
-   * option.
-   */
-  Response.unknownOptionName(Request request, String optionName)
-    : this(request.id, new RequestError('UNKNOWN_OPTION_NAME', 'Unknown analysis option: "$optionName"'));
-
-  /**
-   * Initialize a newly created instance to represent an error condition caused
-   * by an error during `analysis.getErrors`.
-   */
-  Response.getErrorsError(Request request, String message)
-    : this(
-        request.id,
-        new RequestError('GET_ERRORS_ERROR', 'Error during `analysis.getErrors`: $message.'));
-
-  /**
-   * Initialize a newly created instance based upon the given JSON data
-   */
-  factory Response.fromJson(Map<String, Object> json) {
-    try {
-      Object id = json[Response.ID];
-      if (id is! String) {
-        return null;
-      }
-      Object error = json[Response.ERROR];
-      Object result = json[Response.RESULT];
-      Response response;
-      if (error is Map) {
-        response = new Response(id, new RequestError.fromJson(error));
-      } else {
-        response = new Response(id);
-      }
-      if (result is Map) {
-        result.forEach((String key, Object value) {
-          response.setResult(key, value);
-        });
-      }
-      return response;
-    } catch (exception) {
-      return null;
-    }
-  }
-
-  /**
-   * Return the value of the result field with the given [name].
-   */
-  Object getResult(String name) {
-    return result == null ? null : result[name];
-  }
-
-  /**
-   * Set the value of the result field with the given [name] to the given [value].
-   */
-  void setResult(String name, Object value) {
-    if (result == null) {
-      result = new HashMap<String, Object>();
-    }
-    result[name] = _toJson(value);
-  }
-
-  /**
-   * Set the result to be an empty map.
-   */
-  void setEmptyResult() {
-    result = new HashMap<String, Object>();
-  }
-
-  /**
-   * Return a table representing the structure of the Json object that will be
-   * sent to the client to represent this response.
-   */
-  Map<String, Object> toJson() {
-    Map<String, Object> jsonObject = new HashMap<String, Object>();
-    jsonObject[ID] = id;
-    if (error != null) {
-      jsonObject[ERROR] = error.toJson();
-    }
-    if (result != null) {
-      jsonObject[RESULT] = result;
-    }
-    return jsonObject;
+  @override
+  dynamic missingKey(String jsonPath, String key) {
+    return new RequestFailure(
+        new Response.invalidParameter(
+            _request,
+            jsonPath,
+            'contain key ${JSON.encode(key)}'));
   }
 }
 
@@ -755,43 +821,6 @@
   RequestError(this.code, this.message);
 
   /**
-   * Initialize a newly created [Error] to indicate a parse error. Invalid JSON
-   * was received by the server. An error occurred on the server while parsing
-   * the JSON text.
-   */
-  RequestError.parseError() : this(CODE_PARSE_ERROR, "Parse error");
-
-  /**
-   * Initialize a newly created [Error] to indicate that the analysis server
-   * has already been started (and hence won't accept new connections).
-   */
-  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.
-   */
-  RequestError.invalidRequest() : this(CODE_INVALID_REQUEST, "Invalid request");
-
-  /**
-   * Initialize a newly created [Error] to indicate that a method was not found.
-   * Either the method does not exist or is not currently available.
-   */
-  RequestError.methodNotFound() : this(CODE_METHOD_NOT_FOUND, "Method not found");
-
-  /**
-   * Initialize a newly created [Error] to indicate one or more invalid
-   * parameters.
-   */
-  RequestError.invalidParameters() : this(CODE_INVALID_PARAMS, "Invalid parameters");
-
-  /**
-   * Initialize a newly created [Error] to indicate an internal error.
-   */
-  RequestError.internalError() : this(CODE_INTERNAL_ERROR, "Internal error");
-
-  /**
    * Initialize a newly created [Error] from the given JSON.
    */
   factory RequestError.fromJson(Map<String, Object> json) {
@@ -812,6 +841,43 @@
   }
 
   /**
+   * Initialize a newly created [Error] to indicate an internal error.
+   */
+  RequestError.internalError() : this(CODE_INTERNAL_ERROR, "Internal error");
+
+  /**
+   * Initialize a newly created [Error] to indicate one or more invalid
+   * parameters.
+   */
+  RequestError.invalidParameters() : this(CODE_INVALID_PARAMS, "Invalid parameters");
+
+  /**
+   * Initialize a newly created [Error] to indicate an invalid request. The
+   * JSON sent is not a valid [Request] object.
+   */
+  RequestError.invalidRequest() : this(CODE_INVALID_REQUEST, "Invalid request");
+
+  /**
+   * Initialize a newly created [Error] to indicate that a method was not found.
+   * Either the method does not exist or is not currently available.
+   */
+  RequestError.methodNotFound() : this(CODE_METHOD_NOT_FOUND, "Method not found");
+
+  /**
+   * Initialize a newly created [Error] to indicate a parse error. Invalid JSON
+   * was received by the server. An error occurred on the server while parsing
+   * the JSON text.
+   */
+  RequestError.parseError() : this(CODE_PARSE_ERROR, "Parse error");
+
+  /**
+   * Initialize a newly created [Error] to indicate that the analysis server
+   * has already been started (and hence won't accept new connections).
+   */
+  RequestError.serverAlreadyStarted()
+    : this(CODE_SERVER_ALREADY_STARTED, "Server already started");
+
+  /**
    * Return the value of the data with the given [name], or `null` if there is
    * no such data associated with this error.
    */
@@ -842,96 +908,6 @@
   String toString() => toJson().toString();
 }
 
-/**
- * Instances of the class [Notification] represent a notification from the
- * server about an event that occurred.
- */
-class Notification {
-  /**
-   * The name of the JSON attribute containing the name of the event that
-   * triggered the notification.
-   */
-  static const String EVENT = 'event';
-
-  /**
-   * The name of the JSON attribute containing the result values.
-   */
-  static const String PARAMS = 'params';
-
-  /**
-   * The name of the event that triggered the notification.
-   */
-  final String event;
-
-  /**
-   * A table mapping the names of notification parameters to their values.
-   */
-  final Map<String, Object> params = new HashMap<String, Object>();
-
-  /**
-   * Initialize a newly created [Notification] to have the given [event] name.
-   */
-  Notification(this.event);
-
-  /**
-   * Initialize a newly created instance based upon the given JSON data
-   */
-  factory Notification.fromJson(Map<String, Object> json) {
-    try {
-      String event = json[Notification.EVENT];
-      Object params = json[Notification.PARAMS];
-      Notification notification = new Notification(event);
-      if (params is Map) {
-        params.forEach((String key, Object value) {
-          notification.setParameter(key, value);
-        });
-      }
-      return notification;
-    } catch (exception) {
-      return null;
-    }
-  }
-
-  /**
-   * Return the value of the parameter with the given [name], or `null` if there
-   * is no such parameter associated with this notification.
-   */
-  Object getParameter(String name) => params[name];
-
-  /**
-   * Set the value of the parameter with the given [name] to the given [value].
-   */
-  void setParameter(String name, Object value) {
-    params[name] = _toJson(value);
-  }
-
-  /**
-   * Return a table representing the structure of the Json object that will be
-   * sent to the client to represent this response.
-   */
-  Map<String, Object> toJson() {
-    Map<String, Object> jsonObject = {};
-    jsonObject[EVENT] = event;
-    if (!params.isEmpty) {
-      jsonObject[PARAMS] = params;
-    }
-    return jsonObject;
-  }
-}
-
-/**
- * Instances of the class [RequestHandler] implement a handler that can handle
- * requests and produce responses for them.
- */
-abstract class RequestHandler {
-  /**
-   * Attempt to handle the given [request]. If the request is not recognized by
-   * this handler, return `null` so that other handlers will be given a chance
-   * to handle it. Otherwise, return the response that should be passed back to
-   * the client.
-   */
-  Response handleRequest(Request request);
-}
 
 /**
  * Instances of the class [RequestFailure] represent an exception that occurred
@@ -951,14 +927,240 @@
 }
 
 /**
- * Returns a JSON presention of [value].
+ * Instances of the class [RequestHandler] implement a handler that can handle
+ * requests and produce responses for them.
  */
-_toJson(Object value) {
-  if (value is HasToJson) {
-    return value.toJson();
+abstract class RequestHandler {
+  /**
+   * Attempt to handle the given [request]. If the request is not recognized by
+   * this handler, return `null` so that other handlers will be given a chance
+   * to handle it. Otherwise, return the response that should be passed back to
+   * the client.
+   */
+  Response handleRequest(Request request);
+}
+
+/**
+ * Instances of the class [Response] represent a response to a request.
+ */
+class Response {
+  /**
+   * The [Response] instance that is returned when a real [Response] cannot
+   * be provided at the moment.
+   */
+  static final Response DELAYED_RESPONSE = new Response('DELAYED_RESPONSE');
+
+  /**
+   * The name of the JSON attribute containing the id of the request for which
+   * this is a response.
+   */
+  static const String ID = 'id';
+
+  /**
+   * The name of the JSON attribute containing the error message.
+   */
+  static const String ERROR = 'error';
+
+  /**
+   * The name of the JSON attribute containing the result values.
+   */
+  static const String RESULT = 'result';
+
+  /**
+   * The unique identifier used to identify the request that this response is
+   * associated with.
+   */
+  final String id;
+
+  /**
+   * The error that was caused by attempting to handle the request, or `null` if
+   * there was no error.
+   */
+  final RequestError error;
+
+  /**
+   * A table mapping the names of result fields to their values.  Should be
+   * null if there is no result to send.
+   */
+  Map<String, Object> _result;
+
+  /**
+   * Initialize a newly created instance to represent a response to a request
+   * with the given [id].  If [_result] is provided, it will be used as the
+   * result; otherwise an empty result will be used.  If an [error] is provided
+   * then the response will represent an error condition.
+   */
+  Response(this.id, {Map<String, Object> result, this.error})
+      : _result = result;
+
+  Response.contextAlreadyExists(Request request)
+    : this(request.id, error: new RequestError('CONTENT_ALREADY_EXISTS', 'Context already exists'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] referencing a context that does not exist.
+   */
+  Response.contextDoesNotExist(Request request)
+    : this(request.id, error: new RequestError('NONEXISTENT_CONTEXT', 'Context does not exist'));
+
+  /**
+   * Initialize a newly created instance based upon the given JSON data
+   */
+  factory Response.fromJson(Map<String, Object> json) {
+    try {
+      Object id = json[Response.ID];
+      if (id is! String) {
+        return null;
+      }
+      Object error = json[Response.ERROR];
+      RequestError decodedError;
+      if (error is Map) {
+        decodedError = new RequestError.fromJson(error);
+      }
+      Object result = json[Response.RESULT];
+      Map<String, Object> decodedResult;
+      if (result is Map) {
+        decodedResult = result;
+      }
+      return new Response(id, error: decodedError,
+          result: decodedResult);
+    } catch (exception) {
+      return null;
+    }
   }
-  if (value is Iterable) {
-    return value.map((item) => _toJson(item)).toList();
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by an error during `analysis.getErrors`.
+   */
+  Response.getErrorsError(Request request, String message,
+      Map<String, Object> result)
+    : this(
+        request.id,
+        error: new RequestError('GET_ERRORS_ERROR', 'Error during `analysis.getErrors`: $message.'),
+        result: result);
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that had invalid parameter.  [path] is the path to the
+   * invalid parameter, in Javascript notation (e.g. "foo.bar" means that the
+   * parameter "foo" contained a key "bar" whose value was the wrong type).
+   * [expectation] is a description of the type of data that was expected.
+   */
+  Response.invalidParameter(Request request, String path, String expectation)
+      : this(request.id, error: new RequestError('INVALID_PARAMETER',
+          "Expected parameter $path to $expectation"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a malformed request.
+   */
+  Response.invalidRequestFormat()
+    : this('', error: new RequestError('INVALID_REQUEST', 'Invalid request'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that does not have a required parameter.
+   */
+  Response.missingRequiredParameter(Request request, String parameterName)
+    : this(request.id, error: new RequestError('MISSING_PARAMETER', 'Missing required parameter: $parameterName'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.setPriorityFiles` [request] that includes one or more files
+   * that are not being analyzed.
+   */
+  Response.unanalyzedPriorityFiles(Request request, String fileNames)
+    : this(request.id, error: new RequestError('UNANALYZED_PRIORITY_FILES', "Unanalyzed files cannot be a priority: '$fileNames'"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that takes a set of analysis options but for which an
+   * unknown analysis option was provided.
+   */
+  Response.unknownAnalysisOption(Request request, String optionName)
+    : this(request.id, error: new RequestError('UNKNOWN_ANALYSIS_OPTION', 'Unknown analysis option: "$optionName"'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.setSubscriptions` [request] that includes an unknown
+   * analysis service name.
+   */
+  Response.unknownAnalysisService(Request request, String name)
+    : this(request.id, error: new RequestError('UNKNOWN_ANALYSIS_SERVICE', 'Unknown analysis service: "$name"'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.updateOptions` [request] that includes an unknown analysis
+   * option.
+   */
+  Response.unknownOptionName(Request request, String optionName)
+    : this(request.id, error: new RequestError('UNKNOWN_OPTION_NAME', 'Unknown analysis option: "$optionName"'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that cannot be handled by any known handlers.
+   */
+  Response.unknownRequest(Request request)
+    : this(request.id, error: new RequestError('UNKNOWN_REQUEST', 'Unknown request'));
+
+  Response.unsupportedFeature(String requestId, String message)
+    : this(requestId, error: new RequestError('UNSUPPORTED_FEATURE', message));
+
+  /**
+   * Return a table representing the structure of the Json object that will be
+   * sent to the client to represent this response.
+   */
+  Map<String, Object> toJson() {
+    Map<String, Object> jsonObject = new HashMap<String, Object>();
+    jsonObject[ID] = id;
+    if (error != null) {
+      jsonObject[ERROR] = error.toJson();
+    }
+    if (_result != null) {
+      jsonObject[RESULT] = _result;
+    }
+    return jsonObject;
   }
-  return value;
+}
+
+/**
+ * JsonDecoder for decoding responses from the server.  This is intended to be
+ * used only for testing.  Errors are reported using bare [Exception] objects.
+ */
+class ResponseDecoder extends JsonDecoder {
+  @override
+  dynamic mismatch(String jsonPath, String expected) {
+    return new Exception('Expected $expected at $jsonPath');
+  }
+
+  @override
+  dynamic missingKey(String jsonPath, String key) {
+    return new Exception('Missing key $key at $jsonPath');
+  }
+}
+
+/**
+ * Jenkins hash function, optimized for small integers.  Borrowed from
+ * sdk/lib/math/jenkins_smi_hash.dart.
+ *
+ * TODO(paulberry): Move to somewhere that can be shared with other code.
+ */
+class _JenkinsSmiHash {
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
 }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 436d052..0503f90 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -7,9 +7,9 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/collections.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart' show SearchResult;
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index a57cdff..63962d5 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -7,22 +7,18 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/element.dart' as se;
 import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol;
 import 'package:analysis_server/src/search/element_references.dart';
-import 'package:analysis_server/src/search/search_result.dart';
 import 'package:analysis_server/src/search/type_hierarchy.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 /**
  * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
  * that handles requests in the search domain.
  */
-class SearchDomainHandler implements RequestHandler {
+class SearchDomainHandler implements protocol.RequestHandler {
   /**
    * The analysis server that is using this handler to process requests.
    */
@@ -45,13 +41,11 @@
     searchEngine = server.searchEngine;
   }
 
-  Response findElementReferences(Request request) {
-    String file = request.getRequiredParameter(FILE).asString();
-    int offset = request.getRequiredParameter(OFFSET).asInt();
-    bool includePotential =
-        request.getRequiredParameter(INCLUDE_POTENTIAL).asBool();
+  protocol.Response findElementReferences(protocol.Request request) {
+    var params = new protocol.SearchFindElementReferencesParams.fromRequest(request);
     // prepare elements
-    List<Element> elements = server.getElementsAtOffset(file, offset);
+    List<Element> elements = server.getElementsAtOffset(params.file,
+        params.offset);
     elements = elements.map((Element element) {
       if (element is FieldFormalParameterElement) {
         return element.field;
@@ -65,8 +59,8 @@
     String searchId = (_nextSearchId++).toString();
     elements.forEach((Element element) {
       var computer = new ElementReferencesComputer(searchEngine);
-      var future = computer.compute(element, includePotential);
-      future.then((List<SearchResult> results) {
+      var future = computer.compute(element, params.includePotential);
+      future.then((List<protocol.SearchResult> results) {
         bool isLast = identical(element, elements.last);
         _sendSearchNotification(searchId, isLast, results);
       });
@@ -77,88 +71,87 @@
       });
     }
     // respond
-    Response response = new Response(request.id);
-    response.setResult(ID, searchId);
+    protocol.Element element;
     if (elements.isNotEmpty) {
-      var serverElement = new se.Element.fromEngine(elements[0]);
-      response.setResult(ELEMENT, serverElement);
+      element = new protocol.Element.fromEngine(elements[0]);
     }
-    return response;
+    return new protocol.SearchFindElementReferencesResult(searchId,
+        element: element).toResponse(request.id);
   }
 
-  Response findMemberDeclarations(Request request) {
-    String name = request.getRequiredParameter(NAME).asString();
+  protocol.Response findMemberDeclarations(protocol.Request request) {
+    var params = new protocol.SearchFindMemberDeclarationsParams.fromRequest(request);
     // schedule search
     String searchId = (_nextSearchId++).toString();
     {
-      var matchesFuture = searchEngine.searchMemberDeclarations(name);
+      var matchesFuture = searchEngine.searchMemberDeclarations(params.name);
       matchesFuture.then((List<SearchMatch> matches) {
         _sendSearchNotification(searchId, true, matches.map(toResult));
       });
     }
     // respond
-    return new Response(request.id)..setResult(ID, searchId);
+    return new protocol.SearchFindMemberDeclarationsResult(
+        searchId).toResponse(request.id);
   }
 
-  Response findMemberReferences(Request request) {
-    String name = request.getRequiredParameter(NAME).asString();
+  protocol.Response findMemberReferences(protocol.Request request) {
+    var params = new protocol.SearchFindMemberReferencesParams.fromRequest(request);
     // schedule search
     String searchId = (_nextSearchId++).toString();
     {
-      var matchesFuture = searchEngine.searchMemberReferences(name);
+      var matchesFuture = searchEngine.searchMemberReferences(params.name);
       matchesFuture.then((List<SearchMatch> matches) {
         _sendSearchNotification(searchId, true, matches.map(toResult));
       });
     }
     // respond
-    return new Response(request.id)..setResult(ID, searchId);
+    return new protocol.SearchFindMemberReferencesResult(searchId).toResponse(
+        request.id);
   }
 
-  Response findTopLevelDeclarations(Request request) {
-    String pattern = request.getRequiredParameter(PATTERN).asString();
+  protocol.Response findTopLevelDeclarations(protocol.Request request) {
+    var params = new protocol.SearchFindTopLevelDeclarationsParams.fromRequest(request);
     // schedule search
     String searchId = (_nextSearchId++).toString();
     {
-      var matchesFuture = searchEngine.searchTopLevelDeclarations(pattern);
+      var matchesFuture = searchEngine.searchTopLevelDeclarations(params.pattern);
       matchesFuture.then((List<SearchMatch> matches) {
         _sendSearchNotification(searchId, true, matches.map(toResult));
       });
     }
     // respond
-    return new Response(request.id)..setResult(ID, searchId);
+    return new protocol.SearchFindTopLevelDeclarationsResult(
+        searchId).toResponse(request.id);
   }
 
   /**
    * Implement the `search.getTypeHierarchy` request.
    */
-  Response getTypeHierarchy(Request request) {
+  protocol.Response getTypeHierarchy(protocol.Request request) {
+    var params = new protocol.SearchGetTypeHierarchyParams.fromRequest(request);
     // prepare parameters
-    String file = request.getRequiredParameter(FILE).asString();
-    int offset = request.getRequiredParameter(OFFSET).asInt();
     // prepare Element
-    List<Element> elements = server.getElementsAtOffset(file, offset);
-    Response response = new Response(request.id);
+    List<Element> elements = server.getElementsAtOffset(params.file,
+        params.offset);
     if (elements.isEmpty) {
-      response.setEmptyResult();
+      protocol.Response response =
+          new protocol.SearchGetTypeHierarchyResult().toResponse(request.id);
       return response;
     }
     Element element = elements.first;
     // prepare type hierarchy
     TypeHierarchyComputer computer = new TypeHierarchyComputer(searchEngine);
-    computer.compute(element).then((List<TypeHierarchyItem> items) {
-      if (items != null) {
-        response.setResult(HIERARCHY_ITEMS, objectToJson(items));
-      } else {
-        response.setEmptyResult();
-      }
+    computer.compute(element).then((List<protocol.TypeHierarchyItem> items) {
+      protocol.Response response = new protocol.SearchGetTypeHierarchyResult(
+          hierarchyItems: items).toResponse(request.id);
       server.sendResponse(response);
     });
     // delay response
-    return Response.DELAYED_RESPONSE;
+    return protocol.Response.DELAYED_RESPONSE;
   }
 
   @override
-  Response handleRequest(Request request) {
+  protocol.Response handleRequest(protocol.Request request) {
     try {
       String requestName = request.method;
       if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
@@ -172,22 +165,19 @@
       } else if (requestName == SEARCH_GET_TYPE_HIERARCHY) {
         return getTypeHierarchy(request);
       }
-    } on RequestFailure catch (exception) {
+    } on protocol.RequestFailure catch (exception) {
       return exception.response;
     }
     return null;
   }
 
   void _sendSearchNotification(String searchId, bool isLast,
-      Iterable<SearchResult> results) {
-    Notification notification = new Notification(SEARCH_RESULTS);
-    notification.setParameter(ID, searchId);
-    notification.setParameter(LAST, isLast);
-    notification.setParameter(RESULTS, results);
-    server.sendNotification(notification);
+      Iterable<protocol.SearchResult> results) {
+    server.sendNotification(new protocol.SearchResultsParams(searchId,
+        results.toList(), isLast).toNotification());
   }
 
-  static SearchResult toResult(SearchMatch match) {
-    return new SearchResult.fromMatch(match);
+  static protocol.SearchResult toResult(SearchMatch match) {
+    return new protocol.SearchResult.fromMatch(match);
   }
 }
diff --git a/pkg/analysis_server/lib/src/search/search_result.dart b/pkg/analysis_server/lib/src/search/search_result.dart
index 8170e8f..e0e5667 100644
--- a/pkg/analysis_server/lib/src/search/search_result.dart
+++ b/pkg/analysis_server/lib/src/search/search_result.dart
@@ -4,154 +4,23 @@
 
 library search.search_result;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart' as engine;
 
 
-/**
- * A single result from a search request.
- */
-class SearchResult implements HasToJson {
-  /**
-   * The kind of element that was found or the kind of reference that was found.
-   */
-  final SearchResultKind kind;
-
-  /**
-   * Is `true` if the result is a potential match but cannot be confirmed to be
-   * a match.
-   *
-   * For example, if all references to a method `m` defined in some class were
-   * requested, and a reference to a method `m` from an unknown class were
-   * found, it would be marked as being a potential match.
-   */
-  final bool isPotential;
-
-  /**
-   * The location of the code that matched the search criteria.
-   */
-  final Location location;
-
-  /**
-   * The elements that contain the result, starting with the most immediately
-   * enclosing ancestor and ending with the library.
-   */
-  final List<Element> path;
-
-  SearchResult(this.kind, this.isPotential, this.location, this.path);
-
-  factory SearchResult.fromJson(Map<String, Object> map) {
-    SearchResultKind kind = new SearchResultKind.fromName(map[KIND]);
-    bool isPotential = map[IS_POTENTIAL];
-    Location location = new Location.fromJson(map[LOCATION]);
-    List<Map<String, Object>> pathJson = map[PATH];
-    List<Element> path = pathJson.map((json) {
-      return new Element.fromJson(json);
-    }).toList();
-    return new SearchResult(kind, isPotential, location, path);
-  }
-
-  factory SearchResult.fromMatch(SearchMatch match) {
-    SearchResultKind kind = new SearchResultKind.fromEngine(match.kind);
-    Location location =
-        new Location.fromOffset(
-            match.element,
-            match.sourceRange.offset,
-            match.sourceRange.length);
-    List<Element> path = _computePath(match.element);
-    return new SearchResult(kind, !match.isResolved, location, path);
-  }
-
-  Map<String, Object> toJson() {
-    return {
-      KIND: kind.name,
-      IS_POTENTIAL: isPotential,
-      LOCATION: location.toJson(),
-      PATH: path.map(Element.asJson).toList()
-    };
-  }
-
-  @override
-  String toString() => toJson().toString();
-
-  static Map<String, Object> asJson(SearchResult result) {
-    return result.toJson();
-  }
-
-  static List<Element> _computePath(engine.Element element) {
-    List<Element> path = <Element>[];
-    while (element != null) {
-      path.add(new Element.fromEngine(element));
-      element = element.enclosingElement;
-    }
-    return path;
-  }
+SearchResult searchResultFromMatch(SearchMatch match) {
+  SearchResultKind kind = new SearchResultKind.fromEngine(match.kind);
+  Location location = new Location.fromMatch(match);
+  List<Element> path = _computePath(match.element);
+  return new SearchResult(location, kind, !match.isResolved, path);
 }
 
-
-/**
- * An enumeration of the kinds of search results returned by the search domain.
- */
-class SearchResultKind {
-  static const DECLARATION = const SearchResultKind('DECLARATION');
-  static const READ = const SearchResultKind('READ');
-  static const READ_WRITE = const SearchResultKind('READ_WRITE');
-  static const WRITE = const SearchResultKind('WRITE');
-  static const INVOCATION = const SearchResultKind('INVOCATION');
-  static const REFERENCE = const SearchResultKind('REFERENCE');
-  static const UNKNOWN = const SearchResultKind('UNKNOWN');
-
-  final String name;
-
-  const SearchResultKind(this.name);
-
-  factory SearchResultKind.fromEngine(MatchKind kind) {
-    if (kind == MatchKind.DECLARATION) {
-      return DECLARATION;
-    }
-    if (kind == MatchKind.READ) {
-      return READ;
-    }
-    if (kind == MatchKind.READ_WRITE) {
-      return READ_WRITE;
-    }
-    if (kind == MatchKind.WRITE) {
-      return WRITE;
-    }
-    if (kind == MatchKind.INVOCATION) {
-      return INVOCATION;
-    }
-    if (kind == MatchKind.REFERENCE) {
-      return REFERENCE;
-    }
-    return UNKNOWN;
+List<Element> _computePath(engine.Element element) {
+  List<Element> path = <Element>[];
+  while (element != null) {
+    path.add(new Element.fromEngine(element));
+    element = element.enclosingElement;
   }
-
-  factory SearchResultKind.fromName(String name) {
-    if (name == DECLARATION.name) {
-      return DECLARATION;
-    }
-    if (name == READ.name) {
-      return READ;
-    }
-    if (name == READ_WRITE.name) {
-      return READ_WRITE;
-    }
-    if (name == WRITE.name) {
-      return WRITE;
-    }
-    if (name == INVOCATION.name) {
-      return INVOCATION;
-    }
-    if (name == REFERENCE.name) {
-      return REFERENCE;
-    }
-    return UNKNOWN;
-  }
-
-  @override
-  String toString() => name;
+  return path;
 }
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 650f8a7..bc6462d 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -8,11 +8,10 @@
 import 'dart:collection';
 
 import 'package:analysis_server/src/computer/element.dart' show
-    engineElementToJson;
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/search/search_engine.dart';
+    elementFromEngine;
+import 'package:analysis_server/src/protocol.dart' show TypeHierarchyItem;
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 /**
@@ -25,6 +24,7 @@
   String _pivotName;
 
   final List<TypeHierarchyItem> _items = <TypeHierarchyItem>[];
+  final List<ClassElement> _itemClassElements = <ClassElement>[];
   final Map<Element, TypeHierarchyItem> _elementItemMap =
       new HashMap<Element, TypeHierarchyItem>();
 
@@ -43,17 +43,17 @@
     if (element is ClassElement) {
       InterfaceType type = element.type;
       _createSuperItem(type);
-      return _createSubclasses(_items[0], type).then((_) {
+      return _createSubclasses(_items[0], 0, type).then((_) {
         return new Future.value(_items);
       });
     }
     return new Future.value(null);
   }
 
-  Future _createSubclasses(TypeHierarchyItem item, InterfaceType type) {
+  Future _createSubclasses(TypeHierarchyItem item, int itemId, InterfaceType type) {
     var future = getDirectSubClasses(_searchEngine, type.element);
     return future.then((Set<ClassElement> subElements) {
-      List<TypeHierarchyItem> subItems = <TypeHierarchyItem>[];
+      List<int> subItemIds = <int>[];
       for (ClassElement subElement in subElements) {
         // check for recursion
         TypeHierarchyItem subItem = _elementItemMap[subElement];
@@ -65,24 +65,25 @@
         // create a subclass item
         ExecutableElement subMemberElement = _findMemberElement(subElement);
         subItem = new TypeHierarchyItem(
-            _items.length,
-            subElement,
-            subMemberElement,
-            null,
-            item.id,
-            <int>[],
-            <int>[]);
+            elementFromEngine(subElement),
+            memberElement: subMemberElement != null ?
+                elementFromEngine(subMemberElement) : null,
+            superclass: itemId);
+        int subItemId = _items.length;
         // remember
         _elementItemMap[subElement] = subItem;
         _items.add(subItem);
+        _itemClassElements.add(subElement);
         // add to hierarchy
-        item.subclasses.add(subItem.id);
-        subItems.add(subItem);
+        item.subclasses.add(subItemId);
+        subItemIds.add(subItemId);
       }
       // compute subclasses of subclasses
-      return Future.forEach(subItems, (TypeHierarchyItem subItem) {
-        InterfaceType subType = subItem.classElement.type;
-        return _createSubclasses(subItem, subType);
+      return Future.forEach(subItemIds, (int subItemId) {
+        TypeHierarchyItem subItem = _items[subItemId];
+        ClassElement subItemElement = _itemClassElements[subItemId];
+        InterfaceType subType = subItemElement.type;
+        return _createSubclasses(subItem, subItemId, subType);
       });
     });
   }
@@ -94,6 +95,7 @@
       return _items.indexOf(item);
     }
     // create an empty item now
+    int itemId;
     {
       String displayName = null;
       if (type.typeArguments.isNotEmpty) {
@@ -102,15 +104,14 @@
       ClassElement classElement = type.element;
       ExecutableElement memberElement = _findMemberElement(classElement);
       item = new TypeHierarchyItem(
-          _items.length,
-          classElement,
-          memberElement,
-          displayName,
-          null,
-          <int>[],
-          <int>[]);
+          elementFromEngine(classElement),
+          displayName: displayName,
+          memberElement: memberElement != null ?
+              elementFromEngine(memberElement) : null);
       _elementItemMap[classElement] = item;
+      itemId = _items.length;
       _items.add(item);
+      _itemClassElements.add(classElement);
     }
     // superclass
     {
@@ -130,7 +131,7 @@
       item.interfaces.add(id);
     });
     // done
-    return item.id;
+    return itemId;
   }
 
   ExecutableElement _findMemberElement(ClassElement classElement) {
@@ -146,36 +147,3 @@
     return null;
   }
 }
-
-
-class TypeHierarchyItem implements HasToJson {
-  final int id;
-  final ClassElement classElement;
-  final Element memberElement;
-  final String displayName;
-  int superclass;
-  final List<int> mixins;
-  final List<int> interfaces;
-  final List<int> subclasses = <int>[];
-
-  TypeHierarchyItem(this.id, this.classElement, this.memberElement,
-      this.displayName, this.superclass, this.mixins, this.interfaces);
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {};
-    json[CLASS_ELEMENT] = engineElementToJson(classElement);
-    if (memberElement != null) {
-      json[MEMBER_ELEMENT] = engineElementToJson(memberElement);
-    }
-    if (displayName != null) {
-      json[DISPLAY_NAME] = displayName;
-    }
-    if (superclass != null) {
-      json[SUPERCLASS] = objectToJson(superclass);
-    }
-    json[INTERFACES] = objectToJson(interfaces);
-    json[MIXINS] = objectToJson(mixins);
-    json[SUBCLASSES] = objectToJson(subclasses);
-    return json;
-  }
-}
diff --git a/pkg/analysis_services/lib/completion/completion_computer.dart b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
similarity index 65%
rename from pkg/analysis_services/lib/completion/completion_computer.dart
rename to pkg/analysis_server/lib/src/services/completion/completion_manager.dart
index 6d06232..c58e308 100644
--- a/pkg/analysis_services/lib/completion/completion_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
@@ -6,45 +6,13 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/completion/dart_completion_manager.dart';
-import 'package:analyzer/src/generated/ast.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /**
- * The base class for computing code completion suggestions.
- */
-abstract class CompletionComputer {
-  AnalysisContext context;
-  Source source;
-  int offset;
-  SearchEngine searchEngine;
-
-  /**
-   * Computes the initial set of [CompletionSuggestion]s based on
-   * the compilation [unit], the AST [node] in which the completion occurred,
-   * and information already cached in the analysis context.
-   * The supplied [unit] and [node] may not be resolved.
-   * This method should execute quickly and not block waiting for any analysis.
-   * Returns `true` if the computer's work is complete
-   * or `false` if [computeFull] should be called to complete the work.
-   */
-  bool computeFast(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions);
-
-  /**
-   * Computes the complete set of [CompletionSuggestion]s based on
-   * the resolved compilation [unit] and the resolved AST [node] in which the
-   * completion occurred.
-   * Returns `true` if the receiver modified the list of suggestions.
-   */
-  Future<bool> computeFull(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions);
-}
-
-/**
  * Manages `CompletionComputer`s for a given completion request.
  */
 abstract class CompletionManager {
@@ -77,7 +45,11 @@
       int offset, SearchEngine searchEngine) {
     if (context != null) {
       if (AnalysisEngine.isDartFileName(source.shortName)) {
-        return new DartCompletionManager(context, source, offset, searchEngine);
+        return new DartCompletionManager(context, searchEngine, source, offset);
+      }
+      if (AnalysisEngine.isHtmlFileName(source.shortName)) {
+        //TODO (danrubel) implement
+//        return new HtmlCompletionManager(context, searchEngine, source, offset);
       }
     }
     return new NoOpCompletionManager(source, offset);
@@ -119,7 +91,6 @@
       this.suggestions, this.last);
 }
 
-
 class NoOpCompletionManager extends CompletionManager {
   final Source source;
   final int offset;
diff --git a/pkg/analysis_services/lib/completion/completion_suggestion.dart b/pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart
similarity index 96%
rename from pkg/analysis_services/lib/completion/completion_suggestion.dart
rename to pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart
index 1825fde..384bb57 100644
--- a/pkg/analysis_services/lib/completion/completion_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_suggestion.dart
@@ -4,8 +4,8 @@
 
 library services.completion.suggestion;
 
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/services/json.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 /**
@@ -141,6 +141,8 @@
       const CompletionSuggestionKind('GETTER');
   static const CompletionSuggestionKind IMPORT =
       const CompletionSuggestionKind('IMPORT');
+  static const CompletionSuggestionKind KEYWORD =
+      const CompletionSuggestionKind('KEYWORD');
   static const CompletionSuggestionKind LIBRARY_PREFIX =
       const CompletionSuggestionKind('LIBRARY_PREFIX');
   static const CompletionSuggestionKind LOCAL_VARIABLE =
@@ -219,6 +221,7 @@
     if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
     if (GETTER.name == name) return GETTER;
     if (IMPORT.name == name) return IMPORT;
+    if (KEYWORD.name == name) return KEYWORD;
     if (LIBRARY_PREFIX.name == name) return LIBRARY_PREFIX;
     if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
     if (METHOD.name == name) return METHOD;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
new file mode 100644
index 0000000..197fa38
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.dart;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/completion/imported_type_computer.dart';
+import 'package:analysis_server/src/services/completion/invocation_computer.dart';
+import 'package:analysis_server/src/services/completion/keyword_computer.dart';
+import 'package:analysis_server/src/services/completion/local_computer.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * The base class for computing code completion suggestions.
+ */
+abstract class DartCompletionComputer {
+  /**
+   * Computes the initial set of [CompletionSuggestion]s based on
+   * the given completion context. The compilation unit and completion node
+   * in the given completion context may not be resolved.
+   * This method should execute quickly and not block waiting for any analysis.
+   * Returns `true` if the computer's work is complete
+   * or `false` if [computeFull] should be called to complete the work.
+   */
+  bool computeFast(DartCompletionRequest request);
+
+  /**
+   * Computes the complete set of [CompletionSuggestion]s based on
+   * the given completion context.  The compilation unit and completion node
+   * in the given completion context are resolved.
+   * Returns `true` if the receiver modified the list of suggestions.
+   */
+  Future<bool> computeFull(DartCompletionRequest request);
+}
+
+/**
+ * Manages code completion for a given Dart file completion request.
+ */
+class DartCompletionManager extends CompletionManager {
+  final AnalysisContext context;
+  final Source source;
+  final int offset;
+  DartCompletionRequest request;
+  List<DartCompletionComputer> computers;
+
+  DartCompletionManager(this.context, SearchEngine searchEngine, this.source,
+      this.offset) {
+    request = new DartCompletionRequest(context, searchEngine, source, offset);
+  }
+
+  @override
+  void compute() {
+    initComputers();
+    computeFast();
+    if (!computers.isEmpty) {
+      computeFull();
+    }
+  }
+
+  /**
+   * Compute suggestions based upon cached information only
+   * then send an initial response to the client.
+   */
+  void computeFast() {
+    CompilationUnit unit = context.parseCompilationUnit(source);
+    request.unit = unit;
+    request.node = new NodeLocator.con1(offset).searchWithin(unit);
+    computers.removeWhere((DartCompletionComputer c) => c.computeFast(request));
+    sendResults(computers.isEmpty);
+  }
+
+  /**
+   * If there is remaining work to be done, then wait for the unit to be
+   * resolved and request that each remaining computer finish their work.
+   */
+  void computeFull() {
+    waitForAnalysis().then((CompilationUnit unit) {
+      if (unit == null) {
+        sendResults(true);
+        return;
+      }
+      request.unit = unit;
+      request.node = new NodeLocator.con1(offset).searchWithin(unit);
+      int count = computers.length;
+      computers.forEach((c) {
+        c.computeFull(request).then((bool changed) {
+          var last = --count == 0;
+          if (changed || last) {
+            sendResults(last);
+          }
+        });
+      });
+    });
+  }
+
+  /**
+   * Build and initialize the list of completion computers
+   */
+  void initComputers() {
+    if (computers == null) {
+      computers = [
+          new KeywordComputer(),
+          new LocalComputer(),
+          new ImportedTypeComputer(),
+          new InvocationComputer()];
+    }
+  }
+
+  /**
+   * Send the current list of suggestions to the client.
+   */
+  void sendResults(bool last) {
+    controller.add(
+        new CompletionResult(request.offset, 0, request.suggestions, last));
+    if (last) {
+      controller.close();
+    }
+  }
+
+  /**
+   * Return a future that completes when analysis is complete.
+   * Return `true` if the compilation unit is be resolved.
+   */
+  Future<CompilationUnit> waitForAnalysis() {
+    LibraryElement library = context.getLibraryElement(source);
+    if (library != null) {
+      CompilationUnit unit =
+          context.getResolvedCompilationUnit(source, library);
+      if (unit != null) {
+        return new Future.value(unit);
+      }
+    }
+    //TODO (danrubel) Determine if analysis is complete but unit not resolved
+    return new Future(waitForAnalysis);
+  }
+}
+
+/**
+ * The context in which the completion is requested.
+ */
+class DartCompletionRequest {
+  /**
+   * The analysis context in which the completion is requested.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The search engine for use when building suggestions.
+   */
+  final SearchEngine searchEngine;
+
+  /**
+   * The source in which the completion is requested.
+   */
+  final Source source;
+
+  /**
+   * The offset within the source at which the completion is requested.
+   */
+  final int offset;
+
+  /**
+   * The compilation unit in which the completion was requested. This unit
+   * may or may not be resolved when [DartCompletionComputer.computeFast]
+   * is called but is resolved when [DartCompletionComputer.computeFull].
+   */
+  CompilationUnit unit;
+
+  /**
+   * The node in which the completion occurred. This node
+   * may or may not be resolved when [DartCompletionComputer.computeFast]
+   * is called but is resolved when [DartCompletionComputer.computeFull].
+   */
+  AstNode node;
+
+  /**
+   * The list of suggestions to be sent to the client.
+   */
+  final List<CompletionSuggestion> suggestions = [];
+
+  DartCompletionRequest(this.context, this.searchEngine, this.source,
+      this.offset);
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_type_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_type_computer.dart
new file mode 100644
index 0000000..d030126
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/imported_type_computer.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer.dart.toplevel;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A computer for calculating imported class and top level variable
+ * `completion.getSuggestions` request results.
+ */
+class ImportedTypeComputer extends DartCompletionComputer {
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    // TODO: implement computeFast
+    // - compute results based upon current search, then replace those results
+    // during the full compute phase
+    // - filter results based upon completion offset
+    return false;
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) {
+    return request.node.accept(new _ImportedTypeVisitor(request));
+  }
+}
+
+/**
+ * A visitor for determining which imported class and top level variable
+ * should be suggested and building those suggestions.
+ */
+class _ImportedTypeVisitor extends GeneralizingAstVisitor<Future<bool>> {
+  final DartCompletionRequest request;
+
+  _ImportedTypeVisitor(this.request);
+
+  @override
+  Future<bool> visitCombinator(Combinator node) {
+    NamespaceDirective directive =
+        node.getAncestor((parent) => parent is NamespaceDirective);
+    if (directive != null) {
+      LibraryElement library = directive.uriElement;
+      LibraryElementSuggestionBuilder.suggestionsFor(request, library);
+      return new Future.value(true);
+    }
+    return new Future.value(false);
+  }
+
+  @override
+  Future<bool> visitNode(AstNode node) {
+    return _addImportedElements();
+  }
+
+  @override
+  Future<bool> visitSimpleIdentifier(SimpleIdentifier node) {
+    return node.parent.accept(this);
+  }
+
+  @override
+  Future<bool> visitVariableDeclaration(VariableDeclaration node) {
+    // Do not add suggestions if editing the name in a var declaration
+    SimpleIdentifier name = node.name;
+    if (name == null ||
+        name.offset < request.offset ||
+        request.offset > name.end) {
+      return visitNode(node);
+    }
+    return new Future.value(false);
+  }
+
+  Future<bool> _addImportedElements() {
+    var future = request.searchEngine.searchTopLevelDeclarations('');
+    return future.then((List<SearchMatch> matches) {
+
+      Set<LibraryElement> visibleLibs = new Set<LibraryElement>();
+      Set<LibraryElement> excludedLibs = new Set<LibraryElement>();
+
+      Map<LibraryElement, Set<String>> showNames =
+          new Map<LibraryElement, Set<String>>();
+      Map<LibraryElement, Set<String>> hideNames =
+          new Map<LibraryElement, Set<String>>();
+
+      // Exclude elements from the local library
+      // as they will be included by the LocalComputer
+      excludedLibs.add(request.unit.element.library);
+
+      // Build the set of visible and excluded libraries
+      // and the list of names that should be shown or hidden
+      request.unit.directives.forEach((Directive directive) {
+        if (directive is ImportDirective) {
+          LibraryElement lib = directive.element.importedLibrary;
+          if (directive.prefix == null) {
+            visibleLibs.add(lib);
+            directive.combinators.forEach((Combinator combinator) {
+              if (combinator is ShowCombinator) {
+                showNames[lib] = combinator.shownNames.map(
+                    (SimpleIdentifier id) => id.name).toSet();
+              } else if (combinator is HideCombinator) {
+                hideNames[lib] = combinator.hiddenNames.map(
+                    (SimpleIdentifier id) => id.name).toSet();
+              }
+            });
+          } else {
+            excludedLibs.add(lib);
+          }
+        }
+      });
+
+      // Compute the set of possible classes, functions, and top level variables
+      matches.forEach((SearchMatch match) {
+        if (match.kind == MatchKind.DECLARATION) {
+          Element element = match.element;
+          LibraryElement lib = element.library;
+          if (element.isPublic && !excludedLibs.contains(lib)) {
+            String completion = element.displayName;
+            Set<String> show = showNames[lib];
+            Set<String> hide = hideNames[lib];
+            if ((show == null || show.contains(completion)) &&
+                (hide == null || !hide.contains(completion))) {
+              request.suggestions.add(
+                  new CompletionSuggestion(
+                      new CompletionSuggestionKind.fromElementKind(element.kind),
+                      visibleLibs.contains(lib) || lib.isDartCore ?
+                          CompletionRelevance.DEFAULT :
+                          CompletionRelevance.LOW,
+                      completion,
+                      completion.length,
+                      0,
+                      element.isDeprecated,
+                      false));
+            }
+          }
+        }
+      });
+      return true;
+    });
+  }
+}
+
diff --git a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
new file mode 100644
index 0000000..bd26d71
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer.dart.invocation;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * A computer for calculating invocation / access suggestions
+ * `completion.getSuggestions` request results.
+ */
+class InvocationComputer extends DartCompletionComputer {
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    // TODO: implement computeFast
+    return false;
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) {
+    return request.node.accept(new _InvocationAstVisitor(request));
+  }
+}
+
+/**
+ * An [AstNode] vistor for determining the appropriate invocation/access
+ * suggestions based upon the node in which the completion is requested.
+ */
+class _InvocationAstVisitor extends GeneralizingAstVisitor<Future<bool>> {
+  final DartCompletionRequest request;
+  AstNode completionNode;
+
+  _InvocationAstVisitor(this.request);
+
+  @override
+  Future<bool> visitNode(AstNode node) {
+    return new Future.value(false);
+  }
+
+  @override
+  Future<bool> visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (node.identifier == completionNode) {
+      return _addSuggestions(node.prefix.bestElement);
+    }
+    return super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  Future<bool> visitSimpleIdentifier(SimpleIdentifier node) {
+    completionNode = node;
+    return node.parent.accept(this);
+  }
+
+  /**
+   * Add invocation / access suggestions for the given element.
+   */
+  Future<bool> _addSuggestions(Element element) {
+    if (element != null) {
+      return element.accept(new _InvocationElementVisitor(request));
+    }
+    return new Future.value(false);
+  }
+}
+
+/**
+ * An [Element] visitor for determining the appropriate invocation/access
+ * suggestions based upon the element for which the completion is requested.
+ */
+class _InvocationElementVisitor extends GeneralizingElementVisitor<Future<bool>>
+    {
+  final DartCompletionRequest request;
+
+  _InvocationElementVisitor(this.request);
+
+  @override
+  Future<bool> visitElement(Element element) {
+    return new Future.value(false);
+  }
+
+  @override
+  Future<bool> visitPrefixElement(PrefixElement element) {
+    //TODO (danrubel) reimplement to use prefixElement.importedLibraries
+    // once that accessor is implemented and available in Dart
+    bool modified = false;
+    // Find the import directive with the given prefix
+    request.unit.directives.forEach((Directive directive) {
+      if (directive is ImportDirective) {
+        if (directive.prefix != null) {
+          if (directive.prefix.name == element.name) {
+            // Suggest elements from the imported library
+            LibraryElement library = directive.uriElement;
+            LibraryElementSuggestionBuilder.suggestionsFor(request, library);
+            modified = true;
+          }
+        }
+      }
+    });
+
+    element.importedLibraries.forEach((LibraryElement library) {
+      modified = true;
+      library.accept(new ClassElementSuggestionBuilder(request));
+    });
+    return new Future.value(modified);
+  }
+
+  @override
+  Future<bool> visitVariableElement(VariableElement element) {
+    DartType type = element.type;
+    if (type != null) {
+      Element typeElement = type.element;
+      ClassElementSuggestionBuilder.suggestionsFor(request, typeElement);
+    }
+    return new Future.value(true);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart b/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart
new file mode 100644
index 0000000..4187b61
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/keyword_computer.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer.dart.keyword;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+
+/**
+ * A computer for calculating `completion.getSuggestions` request results
+ * for the local library in which the completion is requested.
+ */
+class KeywordComputer extends DartCompletionComputer {
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    request.node.accept(new _KeywordVisitor(request));
+    return true;
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) {
+    return new Future.value(false);
+  }
+}
+
+/**
+ * A vistor for generating keyword suggestions.
+ */
+class _KeywordVisitor extends GeneralizingAstVisitor {
+  final DartCompletionRequest request;
+
+  _KeywordVisitor(this.request);
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    // Very simplistic suggestion because analyzer will warn if
+    // the extends / with / implements keywords are out of order
+    if (node.extendsClause == null) {
+      _addSuggestion(Keyword.EXTENDS);
+    } else if (node.withClause == null) {
+      _addSuggestion(Keyword.WITH);
+    }
+    if (node.implementsClause == null) {
+      _addSuggestion(Keyword.IMPLEMENTS);
+    }
+  }
+
+  @override
+  visitCompilationUnit(CompilationUnit node) {
+    Directive firstDirective;
+    int endOfDirectives = 0;
+    if (node.directives.length > 0) {
+      firstDirective = node.directives[0];
+      endOfDirectives = node.directives.last.end - 1;
+    }
+    int startOfDeclarations = node.end;
+    if (node.declarations.length > 0) {
+      startOfDeclarations = node.declarations[0].offset;
+    }
+
+    // Simplistic check for library as first directive
+    if (firstDirective is! LibraryDirective) {
+      if (firstDirective != null) {
+        if (request.offset <= firstDirective.offset) {
+          _addSuggestions([Keyword.LIBRARY]);
+        }
+      } else {
+        if (request.offset <= startOfDeclarations) {
+          _addSuggestions([Keyword.LIBRARY]);
+        }
+      }
+    }
+    if (request.offset <= startOfDeclarations) {
+      _addSuggestions([Keyword.EXPORT, Keyword.IMPORT, Keyword.PART]);
+    }
+    if (request.offset >= endOfDirectives) {
+      _addSuggestions(
+          [
+              Keyword.ABSTRACT,
+              Keyword.CLASS,
+              Keyword.CONST,
+              Keyword.FINAL,
+              Keyword.TYPEDEF,
+              Keyword.VAR]);
+    }
+  }
+
+  @override
+  visitNode(AstNode node) {
+    if (request.offset == node.end) {
+      Token token = node.endToken;
+      if (token != null && !token.isSynthetic) {
+        if (token.lexeme == ';' || token.lexeme == '}') {
+          node.parent.accept(this);
+        }
+      }
+    }
+  }
+
+  void _addSuggestion(Keyword keyword) {
+    String completion = keyword.syntax;
+    request.suggestions.add(
+        new CompletionSuggestion(
+            CompletionSuggestionKind.KEYWORD,
+            CompletionRelevance.DEFAULT,
+            completion,
+            completion.length,
+            0,
+            false,
+            false));
+  }
+
+  void _addSuggestions(List<Keyword> keywords) {
+    keywords.forEach((Keyword keyword) {
+      _addSuggestion(keyword);
+    });
+  }
+}
diff --git a/pkg/analysis_services/lib/src/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
similarity index 63%
rename from pkg/analysis_services/lib/src/completion/local_computer.dart
rename to pkg/analysis_server/lib/src/services/completion/local_computer.dart
index a9cd972..3b77976 100644
--- a/pkg/analysis_services/lib/src/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -6,36 +6,32 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analyzer/src/generated/ast.dart';
 
 /**
  * A computer for calculating `completion.getSuggestions` request results
  * for the local library in which the completion is requested.
  */
-class LocalComputer extends CompletionComputer {
+class LocalComputer extends DartCompletionComputer {
 
   @override
-  bool computeFast(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
+  bool computeFast(DartCompletionRequest request) {
 
     // Find the specific child [AstNode] that contains the completion offset
     // and collect suggestions starting with that node
-    if (node != null) {
-      node.accept(new _LocalVisitor(offset, suggestions));
-    }
+    request.node.accept(new _LocalVisitor(request));
 
     // If the unit is not a part and does not reference any parts
     // then work is complete
-    return !unit.directives.any(
+    return !request.unit.directives.any(
         (Directive directive) =>
             directive is PartOfDirective || directive is PartDirective);
   }
 
   @override
-  Future<bool> computeFull(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
+  Future<bool> computeFull(DartCompletionRequest request) {
     // TODO: implement computeFull
     // include results from part files that are included in the library
     return new Future.value(false);
@@ -47,16 +43,139 @@
  * that contains the completion offset to the [CompilationUnit].
  */
 class _LocalVisitor extends GeneralizingAstVisitor<dynamic> {
-  final int offset;
-  final List<CompletionSuggestion> suggestions;
+  final DartCompletionRequest request;
 
-  _LocalVisitor(this.offset, this.suggestions);
+  _LocalVisitor(this.request);
 
-  void addSuggestion(SimpleIdentifier id, CompletionSuggestionKind kind) {
+  @override
+  visitBlock(Block node) {
+    node.statements.forEach((Statement stmt) {
+      if (stmt.offset < request.offset) {
+        if (stmt is LabeledStatement) {
+          stmt.labels.forEach((Label label) {
+//            _addSuggestion(label.label, CompletionSuggestionKind.LABEL);
+          });
+        } else if (stmt is VariableDeclarationStatement) {
+          stmt.variables.variables.forEach((VariableDeclaration varDecl) {
+            if (varDecl.end < request.offset) {
+              _addSuggestion(
+                  varDecl.name,
+                  CompletionSuggestionKind.LOCAL_VARIABLE);
+            }
+          });
+        }
+      }
+    });
+    visitNode(node);
+  }
+
+  @override
+  visitCatchClause(CatchClause node) {
+    _addSuggestion(node.exceptionParameter, CompletionSuggestionKind.PARAMETER);
+    _addSuggestion(node.stackTraceParameter, CompletionSuggestionKind.PARAMETER);
+    visitNode(node);
+  }
+
+  @override
+  visitClassDeclaration(ClassDeclaration node) {
+    node.members.forEach((ClassMember classMbr) {
+      if (classMbr is FieldDeclaration) {
+        _addSuggestions(classMbr.fields, CompletionSuggestionKind.FIELD);
+      } else if (classMbr is MethodDeclaration) {
+        _addSuggestion(classMbr.name, CompletionSuggestionKind.METHOD_NAME);
+      }
+    });
+    visitNode(node);
+  }
+
+  @override
+  visitCompilationUnit(CompilationUnit node) {
+    node.directives.forEach((Directive directive) {
+      if (directive is ImportDirective) {
+        _addSuggestion(
+            directive.prefix,
+            CompletionSuggestionKind.LIBRARY_PREFIX);
+      }
+    });
+    node.declarations.forEach((Declaration declaration) {
+      if (declaration is ClassDeclaration) {
+        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS);
+      } else if (declaration is EnumDeclaration) {
+//        _addSuggestion(d.name, CompletionSuggestionKind.ENUM);
+      } else if (declaration is FunctionDeclaration) {
+        _addSuggestion(declaration.name, CompletionSuggestionKind.FUNCTION);
+      } else if (declaration is TopLevelVariableDeclaration) {
+        _addSuggestions(
+            declaration.variables,
+            CompletionSuggestionKind.TOP_LEVEL_VARIABLE);
+      } else if (declaration is ClassTypeAlias) {
+        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS_ALIAS);
+      } else if (declaration is FunctionTypeAlias) {
+        _addSuggestion(
+            declaration.name,
+            CompletionSuggestionKind.FUNCTION_TYPE_ALIAS);
+      }
+    });
+  }
+
+  @override
+  visitForEachStatement(ForEachStatement node) {
+    _addSuggestion(node.identifier, CompletionSuggestionKind.LOCAL_VARIABLE);
+    visitNode(node);
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    _addSuggestions(node.variables, CompletionSuggestionKind.LOCAL_VARIABLE);
+    visitNode(node);
+  }
+
+  @override
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    // This is added by the compilation unit containing it
+    //_addSuggestion(node.name, CompletionSuggestionKind.FUNCTION);
+    visitNode(node);
+  }
+
+  @override
+  visitFunctionExpression(FunctionExpression node) {
+    node.parameters.parameters.forEach((FormalParameter param) {
+      _addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
+    });
+    visitNode(node);
+  }
+
+  @override
+  visitMethodDeclaration(MethodDeclaration node) {
+    node.parameters.parameters.forEach((FormalParameter param) {
+      if (param.identifier != null) {
+        _addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
+      }
+    });
+    visitNode(node);
+  }
+
+  @override
+  visitNode(AstNode node) {
+    node.parent.accept(this);
+  }
+
+  @override
+  visitVariableDeclaration(VariableDeclaration node) {
+    // Do not add suggestions if editing the name in a var declaration
+    SimpleIdentifier name = node.name;
+    if (name == null ||
+        name.offset < request.offset ||
+        request.offset > name.end) {
+      visitNode(node);
+    }
+  }
+
+  void _addSuggestion(SimpleIdentifier id, CompletionSuggestionKind kind) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0) {
-        suggestions.add(
+        request.suggestions.add(
             new CompletionSuggestion(
                 kind,
                 CompletionRelevance.DEFAULT,
@@ -69,113 +188,10 @@
     }
   }
 
-  void addSuggestions(VariableDeclarationList variables,
+  void _addSuggestions(VariableDeclarationList variables,
       CompletionSuggestionKind kind) {
     variables.variables.forEach((VariableDeclaration varDecl) {
-      addSuggestion(varDecl.name, kind);
+      _addSuggestion(varDecl.name, kind);
     });
   }
-
-  visitBlock(Block node) {
-    node.statements.forEach((Statement stmt) {
-      if (stmt.offset < offset) {
-        if (stmt is LabeledStatement) {
-          stmt.labels.forEach((Label label) {
-//            addSuggestion(label.label, CompletionSuggestionKind.LABEL);
-          });
-        } else if (stmt is VariableDeclarationStatement) {
-          stmt.variables.variables.forEach((VariableDeclaration varDecl) {
-            if (varDecl.end < offset) {
-              addSuggestion(
-                  varDecl.name,
-                  CompletionSuggestionKind.LOCAL_VARIABLE);
-            }
-          });
-        }
-      }
-    });
-    visitNode(node);
-  }
-
-  visitCatchClause(CatchClause node) {
-    addSuggestion(node.exceptionParameter, CompletionSuggestionKind.PARAMETER);
-    addSuggestion(node.stackTraceParameter, CompletionSuggestionKind.PARAMETER);
-    visitNode(node);
-  }
-
-  visitClassDeclaration(ClassDeclaration node) {
-    node.members.forEach((ClassMember classMbr) {
-      if (classMbr is FieldDeclaration) {
-        addSuggestions(classMbr.fields, CompletionSuggestionKind.FIELD);
-      } else if (classMbr is MethodDeclaration) {
-        addSuggestion(classMbr.name, CompletionSuggestionKind.METHOD_NAME);
-      }
-    });
-    visitNode(node);
-  }
-
-  visitCompilationUnit(CompilationUnit node) {
-    node.directives.forEach((Directive directive) {
-      if (directive is ImportDirective) {
-        addSuggestion(
-            directive.prefix,
-            CompletionSuggestionKind.LIBRARY_PREFIX);
-      }
-    });
-    node.declarations.forEach((Declaration declaration) {
-      if (declaration is ClassDeclaration) {
-        addSuggestion(declaration.name, CompletionSuggestionKind.CLASS);
-      } else if (declaration is EnumDeclaration) {
-//        addSuggestion(d.name, CompletionSuggestionKind.ENUM);
-      } else if (declaration is FunctionDeclaration) {
-        addSuggestion(declaration.name, CompletionSuggestionKind.FUNCTION);
-      } else if (declaration is TopLevelVariableDeclaration) {
-        addSuggestions(
-            declaration.variables,
-            CompletionSuggestionKind.TOP_LEVEL_VARIABLE);
-      } else if (declaration is ClassTypeAlias) {
-        addSuggestion(declaration.name, CompletionSuggestionKind.CLASS_ALIAS);
-      } else if (declaration is FunctionTypeAlias) {
-        addSuggestion(
-            declaration.name,
-            CompletionSuggestionKind.FUNCTION_TYPE_ALIAS);
-      }
-    });
-  }
-
-  visitForEachStatement(ForEachStatement node) {
-    addSuggestion(node.identifier, CompletionSuggestionKind.LOCAL_VARIABLE);
-    visitNode(node);
-  }
-
-  visitForStatement(ForStatement node) {
-    addSuggestions(node.variables, CompletionSuggestionKind.LOCAL_VARIABLE);
-    visitNode(node);
-  }
-
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    // This is added by the compilation unit containing it
-    //addSuggestion(node.name, CompletionSuggestionKind.FUNCTION);
-    visitNode(node);
-  }
-
-  visitFunctionExpression(FunctionExpression node) {
-    node.parameters.parameters.forEach((FormalParameter param) {
-      addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
-    });
-    visitNode(node);
-  }
-
-  visitMethodDeclaration(MethodDeclaration node) {
-    node.parameters.parameters.forEach((FormalParameter param) {
-      if (param.identifier != null) {
-        addSuggestion(param.identifier, CompletionSuggestionKind.PARAMETER);
-      }
-    });
-    visitNode(node);
-  }
-
-  visitNode(AstNode node) {
-    node.parent.accept(this);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
new file mode 100644
index 0000000..f2e085d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.suggestion.builder;
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * This class visits elements in a class and provides suggestions based upon
+ * the visible members in that class. Clients should call
+ * [ClassElementSuggestionBuilder.suggestionsFor].
+ */
+class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
+  final DartCompletionRequest request;
+  final Set<String> _completions = new Set<String>();
+
+  ClassElementSuggestionBuilder(this.request);
+
+  @override
+  visitClassElement(ClassElement element) {
+    element.visitChildren(this);
+    element.allSupertypes.forEach((InterfaceType type) {
+      type.element.visitChildren(this);
+    });
+  }
+
+  @override
+  visitElement(Element element) {
+    // ignored
+  }
+
+  @override
+  visitFieldElement(FieldElement element) {
+    _addSuggestion(element, CompletionSuggestionKind.FIELD);
+  }
+
+  @override
+  visitMethodElement(MethodElement element) {
+    _addSuggestion(element, CompletionSuggestionKind.METHOD);
+  }
+
+  @override
+  visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (element.isGetter) {
+      _addSuggestion(element, CompletionSuggestionKind.GETTER);
+    } else if (element.isSetter) {
+      _addSuggestion(element, CompletionSuggestionKind.SETTER);
+    }
+  }
+
+  void _addSuggestion(Element element, CompletionSuggestionKind kind) {
+    if (element.isSynthetic) {
+      return;
+    }
+    if (element.isPrivate) {
+      LibraryElement elementLibrary =
+          element.getAncestor((parent) => parent is LibraryElement);
+      LibraryElement unitLibrary =
+          request.unit.element.getAncestor((parent) => parent is LibraryElement);
+      if (elementLibrary != unitLibrary) {
+        return;
+      }
+    }
+    String completion = element.displayName;
+    if (completion == null ||
+        completion.length <= 0 ||
+        !_completions.add(completion)) {
+      return;
+    }
+    request.suggestions.add(
+        new CompletionSuggestion(
+            kind,
+            CompletionRelevance.DEFAULT,
+            completion,
+            completion.length,
+            0,
+            element.isDeprecated,
+            false));
+  }
+
+  /**
+   * Add suggestions for the visible members in the given class
+   */
+  static void suggestionsFor(DartCompletionRequest request, Element element) {
+    if (element is ClassElement) {
+      element.accept(new ClassElementSuggestionBuilder(request));
+    }
+  }
+}
+
+/**
+ * This class visits elements in a library and provides suggestions based upon
+ * the visible members in that library. Clients should call
+ * [LibraryElementSuggestionBuilder.suggestionsFor].
+ */
+class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor {
+
+  final DartCompletionRequest request;
+
+  LibraryElementSuggestionBuilder(this.request);
+
+  @override
+  visitClassElement(ClassElement element) {
+    _addSuggestion(element);
+  }
+
+  @override
+  visitCompilationUnitElement(CompilationUnitElement element) {
+    element.visitChildren(this);
+  }
+
+  @override
+  visitElement(Element element) {
+    // ignored
+  }
+
+  @override
+  visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+    _addSuggestion(element);
+  }
+
+  @override
+  visitTopLevelVariableElement(TopLevelVariableElement element) {
+    _addSuggestion(element);
+  }
+
+  void _addSuggestion(Element element) {
+    if (element != null) {
+      String completion = element.name;
+      if (completion != null && completion.length > 0) {
+        request.suggestions.add(
+            new CompletionSuggestion(
+                new CompletionSuggestionKind.fromElementKind(element.kind),
+                CompletionRelevance.DEFAULT,
+                completion,
+                completion.length,
+                0,
+                element.isDeprecated,
+                false));
+      }
+    }
+  }
+
+  /**
+   * Add suggestions for the visible members in the given library
+   */
+  static void suggestionsFor(DartCompletionRequest request,
+      LibraryElement library) {
+    if (library != null) {
+      library.visitChildren(new LibraryElementSuggestionBuilder(request));
+    }
+  }
+}
diff --git a/pkg/analysis_services/lib/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
similarity index 94%
rename from pkg/analysis_services/lib/correction/assist.dart
rename to pkg/analysis_server/lib/src/services/correction/assist.dart
index a81c211..30cd52e 100644
--- a/pkg/analysis_services/lib/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -4,9 +4,9 @@
 
 library services.correction.assist;
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/assist.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -31,7 +31,7 @@
  */
 class Assist {
   final AssistKind kind;
-  final Change change;
+  final SourceChange change;
 
   Assist(this.kind, this.change);
 
@@ -69,7 +69,7 @@
   static const EXCHANGE_OPERANDS =
       const AssistKind('EXCHANGE_OPERANDS', 30, "Exchange operands");
   static const EXTRACT_CLASS =
-      const AssistKind('EXTRACT_CLASS', 30, "Extract class into file '%s'");
+      const AssistKind('EXTRACT_CLASS', 30, "Extract class into file '{0}'");
   static const IMPORT_ADD_SHOW =
       const AssistKind('IMPORT_ADD_SHOW', 30, "Add explicit 'show' combinator");
   static const INVERT_IF_STATEMENT =
diff --git a/pkg/analysis_services/lib/src/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
similarity index 96%
rename from pkg/analysis_services/lib/src/correction/assist.dart
rename to pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index c7aa997..2cd0ce6 100644
--- a/pkg/analysis_services/lib/src/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -6,15 +6,15 @@
 
 import 'dart:collection';
 
-import 'package:analysis_services/correction/assist.dart';
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/name_suggestion.dart';
-import 'package:analysis_services/src/correction/source_buffer.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_services/src/correction/statement_analyzer.dart';
-import 'package:analysis_services/src/correction/util.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
+import 'package:analysis_server/src/services/correction/source_buffer.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
@@ -42,7 +42,7 @@
   String unitLibraryFile;
   String unitLibraryFolder;
 
-  final List<Edit> edits = <Edit>[];
+  final List<SourceEdit> edits = <SourceEdit>[];
   final Map<String, LinkedEditGroup> linkedPositionGroups = <String,
       LinkedEditGroup>{};
   Position exitPosition = null;
@@ -125,11 +125,11 @@
     if (assistFile == null) {
       assistFile = file;
     }
-    FileEdit fileEdit = new FileEdit(file);
-    edits.forEach((edit) => fileEdit.add(edit));
+    SourceFileEdit fileEdit = new SourceFileEdit(file);
+    fileEdit.addAll(edits);
     // prepare Change
-    String message = JavaString.format(kind.message, args);
-    Change change = new Change(message);
+    String message = formatList(kind.message, args);
+    SourceChange change = new SourceChange(message);
     change.addFileEdit(fileEdit);
     linkedPositionGroups.values.forEach(
         (group) => change.addLinkedEditGroup(group));
@@ -147,7 +147,7 @@
    * Adds a new [Edit] to [edits].
    */
   void _addInsertEdit(int offset, String text) {
-    Edit edit = new Edit(offset, 0, text);
+    SourceEdit edit = new SourceEdit(offset, 0, text);
     edits.add(edit);
   }
 
@@ -1216,7 +1216,7 @@
     {
       _addInsertEdit(statementsRange.offset, "${indentOld}{${eol}");
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1242,7 +1242,7 @@
         _insertBuilder(sb);
       }
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1268,7 +1268,7 @@
         _insertBuilder(sb);
       }
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1300,7 +1300,7 @@
         _insertBuilder(sb);
       }
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1344,7 +1344,7 @@
         _insertBuilder(sb);
       }
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1357,7 +1357,7 @@
     {
       _addInsertEdit(statementsRange.offset, "${indentOld}do {${eol}");
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1383,7 +1383,7 @@
     {
       _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1429,7 +1429,7 @@
     {
       _addInsertEdit(statementsRange.offset, "${indentOld}try {${eol}");
       {
-        Edit edit =
+        SourceEdit edit =
             utils.createIndentEdit(statementsRange, indentOld, indentNew);
         edits.add(edit);
       }
@@ -1470,10 +1470,10 @@
   }
 
   /**
-   * Adds a new [Edit] to [edits].
+   * Adds a new [SourceEdit] to [edits].
    */
   void _addReplaceEdit(SourceRange range, String text) {
-    Edit edit = new Edit(range.offset, range.length, text);
+    SourceEdit edit = new SourceEdit(range.offset, range.length, text);
     edits.add(edit);
   }
 
@@ -1483,7 +1483,7 @@
   LinkedEditGroup _getLinkedPosition(String groupId) {
     LinkedEditGroup group = linkedPositionGroups[groupId];
     if (group == null) {
-      group = new LinkedEditGroup(groupId);
+      group = new LinkedEditGroup.empty();
       linkedPositionGroups[groupId] = group;
     }
     return group;
@@ -1510,8 +1510,8 @@
     String text = builder.toString();
     _addInsertEdit(builder.offset, text);
     // add linked positions
-    builder.linkedPositionGroups.forEach((LinkedEditGroup group) {
-      LinkedEditGroup fixGroup = _getLinkedPosition(group.id);
+    builder.linkedPositionGroups.forEach((String id, LinkedEditGroup group) {
+      LinkedEditGroup fixGroup = _getLinkedPosition(id);
       group.positions.forEach((Position position) {
         fixGroup.addPosition(position, group.length);
       });
diff --git a/pkg/analysis_services/lib/correction/change.dart b/pkg/analysis_server/lib/src/services/correction/change.dart
similarity index 76%
rename from pkg/analysis_services/lib/correction/change.dart
rename to pkg/analysis_server/lib/src/services/correction/change.dart
index c331143..71383f7 100644
--- a/pkg/analysis_services/lib/correction/change.dart
+++ b/pkg/analysis_server/lib/src/services/correction/change.dart
@@ -4,8 +4,8 @@
 
 library services.correction.change;
 
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/json.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/services/json.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
@@ -112,12 +112,22 @@
    */
   final String replacement;
 
+  /**
+   * An identifier that uniquely identifies this source edit from other edits in
+   * the same response. This field is omitted unless a containing structure
+   * needs to be able to identify the edit for some reason.
+   *
+   * For example, some refactoring operations can produce edits that might not
+   * be appropriate (referred to as potential edits). Such edits will have an id
+   * so that they can be referenced. Edits in the same response that do not need
+   * to be referenced will not have an id.
+   */
+  String id;
+
   Edit(this.offset, this.length, this.replacement);
 
-  Edit.range(SourceRange range, String replacement) : this(
-      range.offset,
-      range.length,
-      replacement);
+  Edit.range(SourceRange range, String replacement)
+      : this(range.offset, range.length, replacement);
 
   /**
    * The offset of a character immediately after the region to be modified. 
@@ -133,6 +143,13 @@
     return false;
   }
 
+  /**
+   * Get the result of applying the edit to the given [code].
+   */
+  String apply(String code) {
+    return code.substring(0, offset) + replacement + code.substring(end);
+  }
+
   @override
   Map<String, Object> toJson() {
     return {
@@ -143,13 +160,41 @@
   }
 
   @override
-  String toString() =>
-      "Edit(offset=$offset, length=$length, replacement=:>$replacement<:)";
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('Edit(offset=');
+    sb.write(offset);
+    sb.write(', length=');
+    sb.write(length);
+    sb.write(', replacement=:>');
+    sb.write(replacement);
+    sb.write('<:');
+    if (id != null) {
+      sb.write(', id=');
+      sb.write(id);
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+
+  /**
+   * Get the result of applying a set of [edits] to the given [code].  Edits
+   * are applied in the order they appear in [edits].
+   */
+  static String applySequence(String code, Iterable<Edit> edits) {
+    edits.forEach((Edit edit) {
+      code = edit.apply(code);
+    });
+    return code;
+  }
 }
 
 
 /**
- * A description of a set of changes to a single file. 
+ * A description of a set of changes to a single file.
+ *
+ * [Edit]s are added in the order of decreasing offset, so they are easy to
+ * apply to the original file content without correcting offsets.
  */
 class FileEdit implements HasToJson {
   /**
@@ -168,7 +213,18 @@
    * Adds the given [Edit] to the list.
    */
   void add(Edit edit) {
-    edits.add(edit);
+    int index = 0;
+    while (index < edits.length && edits[index].offset > edit.offset) {
+      index++;
+    }
+    edits.insert(index, edit);
+  }
+
+  /**
+   * Adds the given [Edit]s.
+   */
+  void addAll(Iterable<Edit> edits) {
+    edits.forEach(add);
   }
 
   @override
diff --git a/pkg/analysis_services/lib/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
similarity index 79%
rename from pkg/analysis_services/lib/correction/fix.dart
rename to pkg/analysis_server/lib/src/services/correction/fix.dart
index 3db3401..00fb160 100644
--- a/pkg/analysis_services/lib/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -4,9 +4,9 @@
 
 library services.correction.fix;
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/fix.dart';
+import 'package:analysis_server/src/protocol.dart' show SourceChange;
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -17,8 +17,8 @@
  *
  * Returns the computed [Fix]s, not `null`.
  */
-List<Fix> computeFixes(SearchEngine searchEngine,
-    CompilationUnit unit, AnalysisError error) {
+List<Fix> computeFixes(SearchEngine searchEngine, CompilationUnit unit,
+    AnalysisError error) {
   Source source = unit.element.source;
   String file = source.fullName;
   var processor = new FixProcessor(searchEngine, source, file, unit, error);
@@ -31,7 +31,7 @@
  */
 class Fix {
   final FixKind kind;
-  final Change change;
+  final SourceChange change;
 
   Fix(this.kind, this.change);
 
@@ -47,49 +47,49 @@
  */
 class FixKind {
   static const ADD_PACKAGE_DEPENDENCY =
-      const FixKind('ADD_PACKAGE_DEPENDENCY', 50, "Add dependency on package '%s'");
+      const FixKind('ADD_PACKAGE_DEPENDENCY', 50, "Add dependency on package '{0}'");
   static const ADD_SUPER_CONSTRUCTOR_INVOCATION =
       const FixKind(
           'ADD_SUPER_CONSTRUCTOR_INVOCATION',
           50,
-          "Add super constructor %s invocation");
-  static const CHANGE_TO = const FixKind('CHANGE_TO', 51, "Change to '%s'");
+          "Add super constructor {0} invocation");
+  static const CHANGE_TO = const FixKind('CHANGE_TO', 51, "Change to '{0}'");
   static const CHANGE_TO_STATIC_ACCESS =
       const FixKind(
           'CHANGE_TO_STATIC_ACCESS',
           50,
-          "Change access to static using '%s'");
+          "Change access to static using '{0}'");
   static const CREATE_CLASS =
-      const FixKind('CREATE_CLASS', 50, "Create class '%s'");
+      const FixKind('CREATE_CLASS', 50, "Create class '{0}'");
   static const CREATE_CONSTRUCTOR =
-      const FixKind('CREATE_CONSTRUCTOR', 50, "Create constructor '%s'");
+      const FixKind('CREATE_CONSTRUCTOR', 50, "Create constructor '{0}'");
   static const CREATE_CONSTRUCTOR_SUPER =
-      const FixKind('CREATE_CONSTRUCTOR_SUPER', 50, "Create constructor to call %s");
+      const FixKind('CREATE_CONSTRUCTOR_SUPER', 50, "Create constructor to call {0}");
   static const CREATE_FUNCTION =
-      const FixKind('CREATE_FUNCTION', 49, "Create function '%s'");
+      const FixKind('CREATE_FUNCTION', 49, "Create function '{0}'");
   static const CREATE_METHOD =
-      const FixKind('CREATE_METHOD', 50, "Create method '%s'");
+      const FixKind('CREATE_METHOD', 50, "Create method '{0}'");
   static const CREATE_MISSING_OVERRIDES =
       const FixKind('CREATE_MISSING_OVERRIDES', 50, "Create %d missing override(s)");
   static const CREATE_NO_SUCH_METHOD =
       const FixKind('CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
   static const CREATE_PART =
-      const FixKind('CREATE_PART', 50, "Create part '%s'");
+      const FixKind('CREATE_PART', 50, "Create part '{0}'");
   static const IMPORT_LIBRARY_PREFIX =
       const FixKind(
           'IMPORT_LIBRARY_PREFIX',
           51,
-          "Use imported library '%s' with prefix '%s'");
+          "Use imported library '{0}' with prefix '{1}'");
   static const IMPORT_LIBRARY_PROJECT =
-      const FixKind('IMPORT_LIBRARY_PROJECT', 51, "Import library '%s'");
+      const FixKind('IMPORT_LIBRARY_PROJECT', 51, "Import library '{0}'");
   static const IMPORT_LIBRARY_SDK =
-      const FixKind('IMPORT_LIBRARY_SDK', 51, "Import library '%s'");
+      const FixKind('IMPORT_LIBRARY_SDK', 51, "Import library '{0}'");
   static const IMPORT_LIBRARY_SHOW =
-      const FixKind('IMPORT_LIBRARY_SHOW', 51, "Update library '%s' import");
+      const FixKind('IMPORT_LIBRARY_SHOW', 51, "Update library '{0}' import");
   static const INSERT_SEMICOLON =
       const FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
   static const MAKE_CLASS_ABSTRACT =
-      const FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '%s' abstract");
+      const FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION =
       const FixKind(
           'REMOVE_PARAMETERS_IN_GETTER_DECLARATION',
diff --git a/pkg/analysis_services/lib/src/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
similarity index 94%
rename from pkg/analysis_services/lib/src/correction/fix.dart
rename to pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index aab68f4..f0c1516 100644
--- a/pkg/analysis_services/lib/src/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -6,16 +6,19 @@
 
 import 'dart:collection';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/fix.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/levenshtein.dart';
-import 'package:analysis_services/src/correction/name_suggestion.dart';
-import 'package:analysis_services/src/correction/source_buffer.dart';
-import 'package:analysis_services/src/correction/source_range.dart' as rf;
-import 'package:analysis_services/src/correction/strings.dart';
-import 'package:analysis_services/src/correction/util.dart';
+import 'package:analysis_server/src/protocol.dart' hide AnalysisError, Element,
+    ElementKind;
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/levenshtein.dart';
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
+import 'package:analysis_server/src/services/correction/namespace.dart';
+import 'package:analysis_server/src/services/correction/source_buffer.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart' as
+    rf;
+import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -52,9 +55,9 @@
   String unitLibraryFile;
   String unitLibraryFolder;
 
-  final List<Edit> edits = <Edit>[];
-  final Map<String, LinkedEditGroup> linkedPositionGroups = <String,
-      LinkedEditGroup>{};
+  final List<SourceEdit> edits = <SourceEdit>[];
+  final LinkedHashMap<String, LinkedEditGroup> linkedPositionGroups =
+      new LinkedHashMap<String, LinkedEditGroup>();
   Position exitPosition = null;
   final List<Fix> fixes = <Fix>[];
 
@@ -202,11 +205,11 @@
     if (fixFile == null) {
       fixFile = file;
     }
-    FileEdit fileEdit = new FileEdit(file);
-    edits.forEach((edit) => fileEdit.add(edit));
+    SourceFileEdit fileEdit = new SourceFileEdit(file);
+    fileEdit.addAll(edits);
     // prepare Change
-    String message = JavaString.format(kind.message, args);
-    Change change = new Change(message);
+    String message = formatList(kind.message, args);
+    SourceChange change = new SourceChange(message);
     change.addFileEdit(fileEdit);
     linkedPositionGroups.values.forEach(
         (group) => change.addLinkedEditGroup(group));
@@ -420,8 +423,8 @@
           }
           // prepare InstanceCreationExpression
           if (constructorName.parent is InstanceCreationExpression) {
-            instanceCreation = constructorName.parent as
-                InstanceCreationExpression;
+            instanceCreation =
+                constructorName.parent as InstanceCreationExpression;
             if (instanceCreation.constructorName != constructorName) {
               return;
             }
@@ -474,8 +477,8 @@
         if (constructorName.name == name) {
           // Type.name
           if (constructorName.parent is InstanceCreationExpression) {
-            instanceCreation = constructorName.parent as
-                InstanceCreationExpression;
+            instanceCreation =
+                constructorName.parent as InstanceCreationExpression;
             // new Type.name()
             if (instanceCreation.constructorName != constructorName) {
               return;
@@ -546,9 +549,8 @@
         } else {
           ClassDeclaration enclosingClass =
               node.getAncestor((node) => node is ClassDeclaration);
-          targetElement = enclosingClass != null ?
-              enclosingClass.element :
-              null;
+          targetElement =
+              enclosingClass != null ? enclosingClass.element : null;
           argument = nameNode;
         }
       }
@@ -963,11 +965,10 @@
   void _addFix_undefinedClass_useSimilar() {
     if (_mayBeTypeIdentifier(node)) {
       String name = (node as SimpleIdentifier).name;
-      _ClosestElementFinder finder =
-          new _ClosestElementFinder(
-              name,
-              (Element element) => element is ClassElement,
-              MAX_LEVENSHTEIN_DISTANCE);
+      _ClosestElementFinder finder = new _ClosestElementFinder(
+          name,
+          (Element element) => element is ClassElement,
+          MAX_LEVENSHTEIN_DISTANCE);
       // find closest element
       {
         // elements of this library
@@ -1042,11 +1043,10 @@
   void _addFix_undefinedFunction_useSimilar() {
     if (node is SimpleIdentifier) {
       String name = (node as SimpleIdentifier).name;
-      _ClosestElementFinder finder =
-          new _ClosestElementFinder(
-              name,
-              (Element element) => element is FunctionElement,
-              MAX_LEVENSHTEIN_DISTANCE);
+      _ClosestElementFinder finder = new _ClosestElementFinder(
+          name,
+          (Element element) => element is FunctionElement,
+          MAX_LEVENSHTEIN_DISTANCE);
       // this library
       for (CompilationUnitElement unit in unitLibraryElement.units) {
         finder._updateList(unit.functions);
@@ -1184,11 +1184,10 @@
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       String name = (node as SimpleIdentifier).name;
-      _ClosestElementFinder finder =
-          new _ClosestElementFinder(
-              name,
-              (Element element) => element is MethodElement && !element.isOperator,
-              MAX_LEVENSHTEIN_DISTANCE);
+      _ClosestElementFinder finder = new _ClosestElementFinder(
+          name,
+          (Element element) => element is MethodElement && !element.isOperator,
+          MAX_LEVENSHTEIN_DISTANCE);
       // unqualified invocation
       Expression target = invocation.realTarget;
       if (target == null) {
@@ -1274,7 +1273,7 @@
    * Adds a new [Edit] to [edits].
    */
   void _addInsertEdit(int offset, String text) {
-    Edit edit = new Edit(offset, 0, text);
+    SourceEdit edit = new SourceEdit(offset, 0, text);
     edits.add(edit);
   }
 
@@ -1435,7 +1434,7 @@
    * Adds a new [Edit] to [edits].
    */
   void _addReplaceEdit(SourceRange range, String text) {
-    Edit edit = new Edit(range.offset, range.length, text);
+    SourceEdit edit = new SourceEdit(range.offset, range.length, text);
     edits.add(edit);
   }
 
@@ -1571,7 +1570,7 @@
   LinkedEditGroup _getLinkedPosition(String groupId) {
     LinkedEditGroup group = linkedPositionGroups[groupId];
     if (group == null) {
-      group = new LinkedEditGroup(groupId);
+      group = new LinkedEditGroup.empty();
       linkedPositionGroups[groupId] = group;
     }
     return group;
@@ -1716,8 +1715,8 @@
     String text = builder.toString();
     _addInsertEdit(builder.offset, text);
     // add linked positions
-    builder.linkedPositionGroups.forEach((LinkedEditGroup group) {
-      LinkedEditGroup fixGroup = _getLinkedPosition(group.id);
+    builder.linkedPositionGroups.forEach((String id, LinkedEditGroup group) {
+      LinkedEditGroup fixGroup = _getLinkedPosition(id);
       group.positions.forEach((Position position) {
         fixGroup.addPosition(position, group.length);
       });
@@ -1727,31 +1726,6 @@
     });
   }
 
-//  void _addLinkedPositionProposal(String group,
-//      LinkedPositionProposal proposal) {
-//    List<LinkedPositionProposal> nodeProposals = linkedPositionProposals[group];
-//    if (nodeProposals == null) {
-//      nodeProposals = <LinkedPositionProposal>[];
-//      linkedPositionProposals[group] = nodeProposals;
-//    }
-//    nodeProposals.add(proposal);
-//  }
-
-//  /**
-//   * Returns `true` if the given [ClassMember] is a part of a static method or
-//   * a field initializer.
-//   */
-//  bool _inStaticMemberContext2(ClassMember member) {
-//    if (member is MethodDeclaration) {
-//      return member.isStatic;
-//    }
-//    // field initializer cannot reference "this"
-//    if (member is FieldDeclaration) {
-//      return true;
-//    }
-//    return false;
-//  }
-
   _ConstructorLocation
       _prepareNewConstructorLocation(ClassDeclaration classDeclaration) {
     List<ClassMember> members = classDeclaration.members;
diff --git a/pkg/analysis_services/lib/src/correction/levenshtein.dart b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
similarity index 100%
rename from pkg/analysis_services/lib/src/correction/levenshtein.dart
rename to pkg/analysis_server/lib/src/services/correction/levenshtein.dart
diff --git a/pkg/analysis_services/lib/src/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
similarity index 98%
rename from pkg/analysis_services/lib/src/correction/name_suggestion.dart
rename to pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index 5c55124..9ce5a4c 100644
--- a/pkg/analysis_services/lib/src/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -4,7 +4,7 @@
 
 library services.src.correction.name_suggestion;
 
-import 'package:analysis_services/src/correction/strings.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
new file mode 100644
index 0000000..fc0fd35
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -0,0 +1,189 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.correction.namespace;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+
+/**
+ * Returns the namespace of the given [ExportElement].
+ */
+Map<String, Element> getExportNamespaceForDirective(ExportElement exp) {
+  Namespace namespace =
+      new NamespaceBuilder().createExportNamespaceForDirective(exp);
+  return namespace.definedNames;
+}
+
+
+/**
+ * Returns the export namespace of the given [LibraryElement].
+ */
+Map<String, Element> getExportNamespaceForLibrary(LibraryElement library) {
+  Namespace namespace =
+      new NamespaceBuilder().createExportNamespaceForLibrary(library);
+  return namespace.definedNames;
+}
+
+
+/**
+ * Returns the [Element] exported from the given [LibraryElement].
+ */
+Element getExportedElement(LibraryElement library, String name) {
+  if (library == null) {
+    return null;
+  }
+  return getExportNamespaceForLibrary(library)[name];
+}
+
+
+/**
+ * Returns the [ImportElement] that is referenced by [prefixNode] with
+ * an [PrefixElement], maybe `null`.
+ */
+ImportElement getImportElement(SimpleIdentifier prefixNode) {
+  if (prefixNode.parent is ImportDirective) {
+    ImportDirective importDirective = prefixNode.parent;
+    return importDirective.element;
+  }
+  ImportElementInfo info = internal_getImportElementInfo(prefixNode);
+  return info != null ? info.element : null;
+}
+
+/**
+ * Return the [ImportElement] that declared [prefix] and imports [element].
+ *
+ * [libraryElement] - the [LibraryElement] where reference is.
+ * [prefix] - the import prefix, maybe `null`.
+ * [element] - the referenced element.
+ * [importElementsMap] - the cache of [Element]s imported by [ImportElement]s.
+ */
+ImportElement internal_getImportElement(LibraryElement libraryElement,
+    String prefix, Element element, Map<ImportElement,
+    Set<Element>> importElementsMap) {
+  // validate Element
+  if (element == null) {
+    return null;
+  }
+  if (element.enclosingElement is! CompilationUnitElement) {
+    return null;
+  }
+  LibraryElement usedLibrary = element.library;
+  // find ImportElement that imports used library with used prefix
+  List<ImportElement> candidates = null;
+  for (ImportElement importElement in libraryElement.imports) {
+    // required library
+    if (importElement.importedLibrary != usedLibrary) {
+      continue;
+    }
+    // required prefix
+    PrefixElement prefixElement = importElement.prefix;
+    if (prefix == null) {
+      if (prefixElement != null) {
+        continue;
+      }
+    } else {
+      if (prefixElement == null) {
+        continue;
+      }
+      if (prefix != prefixElement.name) {
+        continue;
+      }
+    }
+    // no combinators => only possible candidate
+    if (importElement.combinators.length == 0) {
+      return importElement;
+    }
+    // OK, we have candidate
+    if (candidates == null) {
+      candidates = [];
+    }
+    candidates.add(importElement);
+  }
+  // no candidates, probably element is defined in this library
+  if (candidates == null) {
+    return null;
+  }
+  // one candidate
+  if (candidates.length == 1) {
+    return candidates[0];
+  }
+  // ensure that each ImportElement has set of elements
+  for (ImportElement importElement in candidates) {
+    if (importElementsMap.containsKey(importElement)) {
+      continue;
+    }
+    Namespace namespace =
+        new NamespaceBuilder().createImportNamespaceForDirective(importElement);
+    Set<Element> elements = new Set.from(namespace.definedNames.values);
+    importElementsMap[importElement] = elements;
+  }
+  // use import namespace to choose correct one
+  for (ImportElement importElement in importElementsMap.keys) {
+    Set<Element> elements = importElementsMap[importElement];
+    if (elements.contains(element)) {
+      return importElement;
+    }
+  }
+  // not found
+  return null;
+}
+
+
+/**
+ * Returns the [ImportElementInfo] with the [ImportElement] that is referenced
+ * by [prefixNode] with a [PrefixElement], maybe `null`.
+ */
+ImportElementInfo internal_getImportElementInfo(SimpleIdentifier prefixNode) {
+  ImportElementInfo info = new ImportElementInfo();
+  // prepare environment
+  AstNode parent = prefixNode.parent;
+  CompilationUnit unit =
+      prefixNode.getAncestor((node) => node is CompilationUnit);
+  LibraryElement libraryElement = unit.element.library;
+  // prepare used element
+  Element usedElement = null;
+  if (parent is PrefixedIdentifier) {
+    PrefixedIdentifier prefixed = parent;
+    if (prefixed.prefix == prefixNode) {
+      usedElement = prefixed.staticElement;
+      info.periodEnd = prefixed.period.end;
+    }
+  }
+  if (parent is MethodInvocation) {
+    MethodInvocation invocation = parent;
+    if (invocation.target == prefixNode) {
+      usedElement = invocation.methodName.staticElement;
+      info.periodEnd = invocation.period.end;
+    }
+  }
+  // we need used Element
+  if (usedElement == null) {
+    return null;
+  }
+  // find ImportElement
+  String prefix = prefixNode.name;
+  Map<ImportElement, Set<Element>> importElementsMap = {};
+  info.element = internal_getImportElement(
+      libraryElement,
+      prefix,
+      usedElement,
+      importElementsMap);
+  if (info.element == null) {
+    return null;
+  }
+  return info;
+}
+
+
+/**
+ * Information about [ImportElement] and place where it is referenced using
+ * [PrefixElement].
+ */
+class ImportElementInfo {
+  ImportElement element;
+  int periodEnd;
+}
diff --git a/pkg/analysis_services/lib/src/correction/selection_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
similarity index 97%
rename from pkg/analysis_services/lib/src/correction/selection_analyzer.dart
rename to pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
index b048891..f8ab474 100644
--- a/pkg/analysis_services/lib/src/correction/selection_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
@@ -4,7 +4,7 @@
 
 library services.src.correction.selection_analyzer;
 
-import 'package:analysis_services/src/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/source.dart';
 
diff --git a/pkg/analysis_services/lib/src/correction/source_buffer.dart b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
similarity index 78%
rename from pkg/analysis_services/lib/src/correction/source_buffer.dart
rename to pkg/analysis_server/lib/src/services/correction/source_buffer.dart
index 7ff8985..15cc6ce 100644
--- a/pkg/analysis_services/lib/src/correction/source_buffer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
@@ -4,7 +4,7 @@
 
 library services.src.correction.source_buffer;
 
-import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
@@ -16,15 +16,17 @@
   final int offset;
   final StringBuffer _buffer = new StringBuffer();
 
-  final List<LinkedEditGroup> linkedPositionGroups = <LinkedEditGroup>[
-      ];
+  final Map<String, LinkedEditGroup> linkedPositionGroups = <String,
+      LinkedEditGroup>{};
   LinkedEditGroup _currentLinkedPositionGroup;
   int _currentPositionStart;
   int _exitOffset;
 
   SourceBuilder(this.file, this.offset);
 
-  SourceBuilder.buffer() : file = null, offset = 0;
+  SourceBuilder.buffer()
+      : file = null,
+        offset = 0;
 
   /**
    * Returns the exit offset, maybe `null` if not set.
@@ -39,7 +41,7 @@
   int get length => _buffer.length;
 
   void addSuggestion(LinkedEditSuggestionKind kind, String value) {
-    var suggestion = new LinkedEditSuggestion(kind, value);
+    var suggestion = new LinkedEditSuggestion(value, kind);
     _currentLinkedPositionGroup.addSuggestion(suggestion);
   }
 
@@ -74,17 +76,12 @@
   /**
    * Marks start of a new linked position for the group with the given ID.
    */
-  void startPosition(String groupId) {
+  void startPosition(String id) {
     assert(_currentLinkedPositionGroup == null);
-    for (LinkedEditGroup position in linkedPositionGroups) {
-      if (position.id == groupId) {
-        _currentLinkedPositionGroup = position;
-        break;
-      }
-    }
+    _currentLinkedPositionGroup = linkedPositionGroups[id];
     if (_currentLinkedPositionGroup == null) {
-      _currentLinkedPositionGroup = new LinkedEditGroup(groupId);
-      linkedPositionGroups.add(_currentLinkedPositionGroup);
+      _currentLinkedPositionGroup = new LinkedEditGroup.empty();
+      linkedPositionGroups[id] = _currentLinkedPositionGroup;
     }
     _currentPositionStart = _buffer.length;
   }
diff --git a/pkg/analysis_services/lib/src/correction/source_range.dart b/pkg/analysis_server/lib/src/services/correction/source_range.dart
similarity index 96%
rename from pkg/analysis_services/lib/src/correction/source_range.dart
rename to pkg/analysis_server/lib/src/services/correction/source_range.dart
index 444889f..9ed3438f 100644
--- a/pkg/analysis_services/lib/src/correction/source_range.dart
+++ b/pkg/analysis_server/lib/src/services/correction/source_range.dart
@@ -12,7 +12,7 @@
 
 
 SourceRange rangeElementName(Element element) {
-  return new SourceRange(element.nameOffset, element.name.length);
+  return new SourceRange(element.nameOffset, element.displayName.length);
 }
 
 SourceRange rangeEndEnd(a, b) {
diff --git a/pkg/analysis_services/lib/src/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
similarity index 88%
rename from pkg/analysis_services/lib/src/correction/statement_analyzer.dart
rename to pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index a18307b..bb86914 100644
--- a/pkg/analysis_services/lib/src/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -4,14 +4,15 @@
 
 library services.src.correction.statement_analyzer;
 
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/src/correction/selection_analyzer.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_services/src/correction/util.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/src/protocol.dart';
 
 
 /**
@@ -50,16 +51,9 @@
   RefactoringStatus get status => _status;
 
   /**
-   * Records fatal error with given message.
+   * Records fatal error with given message and [Location].
    */
-  void invalidSelection(String message) {
-    invalidSelection2(message, null);
-  }
-
-  /**
-   * Records fatal error with given message and [RefactoringStatusContext].
-   */
-  void invalidSelection2(String message, RefactoringStatusContext context) {
+  void invalidSelection(String message, [Location context]) {
     _status.addFatalError(message, context);
     reset();
   }
@@ -186,9 +180,10 @@
       AstNode firstNode = nodes[0];
       SourceRange rangeBeforeFirstNode = rangeStartStart(selection, firstNode);
       if (_hasTokens(rangeBeforeFirstNode)) {
-        invalidSelection2(
-            "The beginning of the selection contains characters that do not belong to a statement.",
-            new RefactoringStatusContext.forUnit(unit, rangeBeforeFirstNode));
+        invalidSelection(
+            "The beginning of the selection contains characters that "
+                "do not belong to a statement.",
+            new Location.fromUnit(unit, rangeBeforeFirstNode));
       }
     }
     // some tokens after last selected node
@@ -196,9 +191,10 @@
       AstNode lastNode = nodes.last;
       SourceRange rangeAfterLastNode = rangeEndEnd(lastNode, selection);
       if (_hasTokens(rangeAfterLastNode)) {
-        invalidSelection2(
-            "The end of the selection contains characters that do not belong to a statement.",
-            new RefactoringStatusContext.forUnit(unit, rangeAfterLastNode));
+        invalidSelection(
+            "The end of the selection contains characters that "
+                "do not belong to a statement.",
+            new Location.fromUnit(unit, rangeAfterLastNode));
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/status.dart b/pkg/analysis_server/lib/src/services/correction/status.dart
new file mode 100644
index 0000000..b8b8f38
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/status.dart
@@ -0,0 +1,191 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.status;
+
+import 'package:analysis_server/src/protocol.dart';
+
+
+/**
+ * An outcome of a condition checking operation.
+ */
+class RefactoringStatus {
+  /**
+   * The current severity of this [RefactoringStatus] - the maximum of the
+   * severities of its [entries].
+   */
+  RefactoringProblemSeverity _severity = null;
+
+  /**
+   * A list of [RefactoringProblem]s.
+   */
+  final List<RefactoringProblem> problems = [];
+
+  /**
+   * Creates a new OK [RefactoringStatus].
+   */
+  RefactoringStatus();
+
+  /**
+   * Creates a new [RefactoringStatus] with the ERROR severity.
+   */
+  factory RefactoringStatus.error(String msg, [Location location]) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addError(msg, location);
+    return status;
+  }
+
+  /**
+   * Creates a new [RefactoringStatus] with the FATAL severity.
+   */
+  factory RefactoringStatus.fatal(String msg, [Location location]) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addFatalError(msg, location);
+    return status;
+  }
+
+  /**
+   * Creates a new [RefactoringStatus] with the WARNING severity.
+   */
+  factory RefactoringStatus.warning(String msg, [Location location]) {
+    RefactoringStatus status = new RefactoringStatus();
+    status.addWarning(msg, location);
+    return status;
+  }
+
+  /**
+   * Returns `true` if the severity is FATAL or ERROR.
+   */
+  bool get hasError {
+    return _severity == RefactoringProblemSeverity.FATAL ||
+        _severity == RefactoringProblemSeverity.ERROR;
+  }
+
+  /**
+   * Returns `true` if the severity is FATAL.
+   */
+  bool get hasFatalError => _severity == RefactoringProblemSeverity.FATAL;
+
+  /**
+   * Returns `true` if the severity is WARNING.
+   */
+  bool get hasWarning => _severity == RefactoringProblemSeverity.WARNING;
+
+  /**
+   * Return `true` if the severity is `OK`.
+   */
+  bool get isOK => _severity == null;
+
+  /**
+   * Returns the message of the [RefactoringProblem] with highest severity;
+   * may be `null` if no problems.
+   */
+  String get message {
+    RefactoringProblem problem = this.problem;
+    if (problem == null) {
+      return null;
+    }
+    return problem.message;
+  }
+
+  /**
+   * Returns the first [RefactoringProblem] with the highest severity.
+   *
+   * Returns `null` if no entries.
+   */
+  RefactoringProblem get problem {
+    for (RefactoringProblem problem in problems) {
+      if (problem.severity == _severity) {
+        return problem;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the current severity of this [RefactoringStatus].
+   */
+  RefactoringProblemSeverity get severity => _severity;
+
+  /**
+   * Adds an ERROR problem with the given message and location.
+   */
+  void addError(String msg, [Location location]) {
+    _addProblem(
+        new RefactoringProblem(
+            RefactoringProblemSeverity.ERROR,
+            msg,
+            location: location));
+  }
+
+  /**
+   * Adds a FATAL problem with the given message and location.
+   */
+  void addFatalError(String msg, [Location location]) {
+    _addProblem(
+        new RefactoringProblem(
+            RefactoringProblemSeverity.FATAL,
+            msg,
+            location: location));
+  }
+
+  /**
+   * Merges [other] into this [RefactoringStatus].
+   *
+   * The [other]'s entries are added to this.
+   *
+   * The resulting severity is the more severe of this and [other] severities.
+   *
+   * Merging with `null` is allowed - it has no effect.
+   */
+  void addStatus(RefactoringStatus other) {
+    if (other == null) {
+      return;
+    }
+    problems.addAll(other.problems);
+    _severity = RefactoringProblemSeverity.max(_severity, other.severity);
+  }
+
+  /**
+   * Adds a WARNING problem with the given message and location.
+   */
+  void addWarning(String msg, [Location location]) {
+    _addProblem(
+        new RefactoringProblem(
+            RefactoringProblemSeverity.WARNING,
+            msg,
+            location: location));
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("<");
+    if (_severity == null) {
+      sb.write('OK');
+    } else {
+      sb.write(_severity.name);
+    }
+    if (!isOK) {
+      sb.write("\n");
+      for (RefactoringProblem problem in problems) {
+        sb.write("\t");
+        sb.write(problem);
+        sb.write("\n");
+      }
+    }
+    sb.write(">");
+    return sb.toString();
+  }
+
+  /**
+   * Adds the given [RefactoringProblem] and updates [severity].
+   */
+  void _addProblem(RefactoringProblem problem) {
+    problems.add(problem);
+    // update maximum severity
+    RefactoringProblemSeverity severity = problem.severity;
+    _severity = RefactoringProblemSeverity.max(_severity, severity);
+  }
+}
diff --git a/pkg/analysis_services/lib/src/correction/strings.dart b/pkg/analysis_server/lib/src/services/correction/strings.dart
similarity index 86%
rename from pkg/analysis_services/lib/src/correction/strings.dart
rename to pkg/analysis_server/lib/src/services/correction/strings.dart
index a72b6f6..ff5c495 100644
--- a/pkg/analysis_services/lib/src/correction/strings.dart
+++ b/pkg/analysis_server/lib/src/services/correction/strings.dart
@@ -42,6 +42,22 @@
 }
 
 /**
+ * Counts how many times [sub] appears in [str].
+ */
+int countMatches(String str, String sub) {
+  if (isEmpty(str) || isEmpty(sub)) {
+    return 0;
+  }
+  int count = 0;
+  int idx = 0;
+  while ((idx = str.indexOf(sub, idx)) != -1) {
+    count++;
+    idx += sub.length;
+  }
+  return count;
+}
+
+/**
  * Checks if [str] is `null`, empty or is whitespace.
  */
 bool isBlank(String str) {
@@ -101,6 +117,7 @@
   return str;
 }
 
+
 String repeat(String s, int n) {
   StringBuffer sb = new StringBuffer();
   for (int i = 0; i < n; i++) {
diff --git a/pkg/analysis_services/lib/src/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
similarity index 68%
rename from pkg/analysis_services/lib/src/correction/util.dart
rename to pkg/analysis_server/lib/src/services/correction/util.dart
index 5e59e32..da767a1 100644
--- a/pkg/analysis_services/lib/src/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -4,9 +4,11 @@
 
 library services.src.correction.util;
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_services/src/correction/strings.dart';
+import 'dart:math';
+
+import 'package:analysis_server/src/protocol.dart' show SourceEdit;
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -16,6 +18,20 @@
 
 
 /**
+ * @return <code>true</code> if given [List]s are identical at given position.
+ */
+bool allListsIdentical(List<List> lists, int position) {
+  Object element = lists[0][position];
+  for (List list in lists) {
+    if (list[position] != element) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+/**
  * TODO(scheglov) replace with nodes once there will be [CompilationUnit#getComments].
  *
  * Returns [SourceRange]s of all comments in [unit].
@@ -78,6 +94,26 @@
 
 
 /**
+ * Returns a class or an unit member enclosing the given [node].
+ */
+AstNode getEnclosingClassOrUnitMember(AstNode node) {
+  AstNode member = node;
+  while (node != null) {
+    if (node is ClassDeclaration) {
+      return member;
+    }
+    if (node is CompilationUnit) {
+      return member;
+    }
+    member = node;
+    node = node.parent;
+  }
+  return null;
+}
+
+
+
+/**
  * @return the [ExecutableElement] of the enclosing executable [AstNode].
  */
 ExecutableElement getEnclosingExecutableElement(AstNode node) {
@@ -97,34 +133,25 @@
 }
 
 /**
- * Returns a namespace of the given [ExportElement].
+ * @return the enclosing executable [AstNode].
  */
-Map<String, Element> getExportNamespaceForDirective(ExportElement exp) {
-  Namespace namespace =
-      new NamespaceBuilder().createExportNamespaceForDirective(exp);
-  return namespace.definedNames;
-}
-
-
-/**
- * Returns a export namespace of the given [LibraryElement].
- */
-Map<String, Element> getExportNamespaceForLibrary(LibraryElement library) {
-  Namespace namespace =
-      new NamespaceBuilder().createExportNamespaceForLibrary(library);
-  return namespace.definedNames;
-}
-
-/**
- * Returns an [Element] exported from the given [LibraryElement].
- */
-Element getExportedElement(LibraryElement library, String name) {
-  if (library == null) {
-    return null;
+AstNode getEnclosingExecutableNode(AstNode node) {
+  while (node != null) {
+    if (node is FunctionDeclaration) {
+      return node;
+    }
+    if (node is ConstructorDeclaration) {
+      return node;
+    }
+    if (node is MethodDeclaration) {
+      return node;
+    }
+    node = node.parent;
   }
-  return getExportNamespaceForLibrary(library)[name];
+  return null;
 }
 
+
 /**
  * Returns [getExpressionPrecedence] for the parent of [node],
  * or `0` if the parent node is [ParenthesizedExpression].
@@ -139,6 +166,7 @@
   return getExpressionPrecedence(parent);
 }
 
+
 /**
  * Returns the precedence of [node] it is an [Expression], negative otherwise.
  */
@@ -149,6 +177,7 @@
   return -1000;
 }
 
+
 /**
  * Returns the namespace of the given [ImportElement].
  */
@@ -159,6 +188,90 @@
 }
 
 
+
+/**
+ * @return the [LocalVariableElement] or [ParameterElement] if given
+ *         [SimpleIdentifier] is the reference to local variable or parameter, or
+ *         <code>null</code> in the other case.
+ */
+VariableElement getLocalOrParameterVariableElement(SimpleIdentifier node) {
+  Element element = node.staticElement;
+  if (element is LocalVariableElement) {
+    return element;
+  }
+  if (element is ParameterElement) {
+    return element;
+  }
+  return null;
+}
+
+
+/**
+ * @return the [LocalVariableElement] if given [SimpleIdentifier] is the reference to
+ *         local variable, or <code>null</code> in the other case.
+ */
+LocalVariableElement getLocalVariableElement(SimpleIdentifier node) {
+  Element element = node.staticElement;
+  if (element is LocalVariableElement) {
+    return element;
+  }
+  return null;
+}
+
+
+/**
+ * @return the nearest common ancestor [AstNode] of the given [AstNode]s.
+ */
+AstNode getNearestCommonAncestor(List<AstNode> nodes) {
+  // may be no nodes
+  if (nodes.isEmpty) {
+    return null;
+  }
+  // prepare parents
+  List<List<AstNode>> parents = [];
+  for (AstNode node in nodes) {
+    parents.add(getParents(node));
+  }
+  // find min length
+  int minLength = 1 << 20;
+  for (List<AstNode> parentList in parents) {
+    minLength = min(minLength, parentList.length);
+  }
+  // find deepest parent
+  int i = 0;
+  for ( ; i < minLength; i++) {
+    if (!allListsIdentical(parents, i)) {
+      break;
+    }
+  }
+  return parents[0][i - 1];
+}
+
+
+/**
+ * @return parent [AstNode]s from [CompilationUnit] (at index "0") to the given one.
+ */
+List<AstNode> getParents(AstNode node) {
+  // prepare number of parents
+  int numParents = 0;
+  {
+    AstNode current = node.parent;
+    while (current != null) {
+      numParents++;
+      current = current.parent;
+    }
+  }
+  // fill array of parents
+  List<AstNode> parents = new List<AstNode>(numParents);
+  AstNode current = node.parent;
+  int index = numParents;
+  while (current != null) {
+    parents[--index] = current;
+    current = current.parent;
+  }
+  return parents;
+}
+
 /**
  * If given [AstNode] is name of qualified property extraction, returns target from which
  * this property is extracted. Otherwise `null`.
@@ -180,7 +293,6 @@
   return null;
 }
 
-
 /**
  * Returns the given [Statement] if not a [Block], or the first child
  * [Statement] if a [Block], or `null` if more than one child.
@@ -217,6 +329,49 @@
 }
 
 
+/**
+ * Checks if the given [Element]'s display name equals to the given name.
+ */
+bool hasDisplayName(Element element, String name) {
+  if (element == null) {
+    return false;
+  }
+  return element.displayName == name;
+}
+
+
+/**
+ * @return <code>true</code> if given [DartNode] is left hand side of assignment, or
+ *         declaration of the variable.
+ */
+bool isLeftHandOfAssignment(SimpleIdentifier node) {
+  if (node.inSetterContext()) {
+    return true;
+  }
+  return node.parent is VariableDeclaration &&
+      (node.parent as VariableDeclaration).name == node;
+}
+
+
+/**
+ * @return `true` if the given [SimpleIdentifier] is the name of the
+ *         [NamedExpression].
+ */
+bool isNamedExpressionName(SimpleIdentifier node) {
+  AstNode parent = node.parent;
+  if (parent is Label) {
+    Label label = parent;
+    if (identical(label.label, node)) {
+      AstNode parent2 = label.parent;
+      if (parent2 is NamedExpression) {
+        return identical(parent2.name, label);
+      }
+    }
+  }
+  return false;
+}
+
+
 class CorrectionUtils {
   final CompilationUnit unit;
 
@@ -249,9 +404,10 @@
    * [SourceRange] from [oldIndent] to [newIndent], keeping indentation of lines
    * relative to each other.
    */
-  Edit createIndentEdit(SourceRange range, String oldIndent, String newIndent) {
+  SourceEdit createIndentEdit(SourceRange range, String oldIndent,
+      String newIndent) {
     String newSource = replaceSourceRangeIndent(range, oldIndent, newIndent);
-    return new Edit(range.offset, range.length, newSource);
+    return new SourceEdit(range.offset, range.length, newSource);
   }
 
   /**
@@ -691,15 +847,29 @@
       _invertCondition0(expression)._source;
 
   /**
+   * @return <code>true</code> if selection range contains only whitespace or comments
+   */
+  bool isJustWhitespaceOrComment(SourceRange range) {
+    String trimmedText = getRangeText(range).trim();
+    // may be whitespace
+    if (trimmedText.isEmpty) {
+      return true;
+    }
+    // may be comment
+    return TokenUtils.getTokens(trimmedText).isEmpty;
+  }
+
+  /**
    * Returns the source with indentation changed from [oldIndent] to
    * [newIndent], keeping indentation of lines relative to each other.
    */
-  String replaceSourceIndent(String source, String oldIndent, String newIndent) {
+  String replaceSourceIndent(String source, String oldIndent,
+      String newIndent) {
     // prepare STRING token ranges
     List<SourceRange> lineRanges = [];
     {
-      var token = unit.beginToken;
-      while (token != null && token.type != TokenType.EOF) {
+      List<Token> tokens = TokenUtils.getTokens(source);
+      for (Token token in tokens) {
         if (token.type == TokenType.STRING) {
           lineRanges.add(rangeToken(token));
         }
@@ -751,6 +921,41 @@
   }
 
   /**
+   * @return <code>true</code> if "selection" covers "node" and there are any non-whitespace tokens
+   *         between "selection" and "node" start/end.
+   */
+  bool selectionIncludesNonWhitespaceOutsideNode(SourceRange selection,
+      AstNode node) {
+    return _selectionIncludesNonWhitespaceOutsideRange(
+        selection,
+        rangeNode(node));
+  }
+
+  /**
+   * @return <code>true</code> if given range of [BinaryExpression] can be extracted.
+   */
+  bool validateBinaryExpressionRange(BinaryExpression binaryExpression,
+      SourceRange range) {
+    // only parts of associative expression are safe to extract
+    if (!binaryExpression.operator.type.isAssociativeOperator) {
+      return false;
+    }
+    // prepare selected operands
+    List<Expression> operands = _getOperandsInOrderFor(binaryExpression);
+    List<Expression> subOperands = _getOperandsForSourceRange(operands, range);
+    // if empty, then something wrong with selection
+    if (subOperands.isEmpty) {
+      return false;
+    }
+    // may be some punctuation included into selection - operators, braces, etc
+    if (_selectionIncludesNonWhitespaceOutsideOperands(range, subOperands)) {
+      return false;
+    }
+    // OK
+    return true;
+  }
+
+  /**
    * @return the [ImportElement] used to import given [Element] into [library].
    *         May be `null` if was not imported, i.e. declared in the same library.
    */
@@ -854,6 +1059,95 @@
     }
     return _InvertedCondition._simple(getNodeText(expression));
   }
+
+  bool _selectionIncludesNonWhitespaceOutsideOperands(SourceRange selection,
+      List<Expression> operands) {
+    return _selectionIncludesNonWhitespaceOutsideRange(
+        selection,
+        rangeNodes(operands));
+  }
+
+  /**
+   * @return <code>true</code> if "selection" covers "range" and there are any non-whitespace tokens
+   *         between "selection" and "range" start/end.
+   */
+  bool _selectionIncludesNonWhitespaceOutsideRange(SourceRange selection,
+      SourceRange range) {
+    // selection should cover range
+    if (!selection.covers(range)) {
+      return false;
+    }
+    // non-whitespace between selection start and range start
+    if (!isJustWhitespaceOrComment(rangeStartStart(selection, range))) {
+      return true;
+    }
+    // non-whitespace after range
+    if (!isJustWhitespaceOrComment(rangeEndEnd(range, selection))) {
+      return true;
+    }
+    // only whitespace in selection around range
+    return false;
+  }
+
+  /**
+   * @return [Expression]s from <code>operands</code> which are completely covered by given
+   *         [SourceRange]. Range should start and end between given [Expression]s.
+   */
+  static List<Expression> _getOperandsForSourceRange(List<Expression> operands,
+      SourceRange range) {
+    assert(!operands.isEmpty);
+    List<Expression> subOperands = [];
+    // track range enter/exit
+    bool entered = false;
+    bool exited = false;
+    // may be range starts before or on first operand
+    if (range.offset <= operands[0].offset) {
+      entered = true;
+    }
+    // iterate over gaps between operands
+    for (int i = 0; i < operands.length - 1; i++) {
+      Expression operand = operands[i];
+      Expression nextOperand = operands[i + 1];
+      SourceRange inclusiveGap =
+          rangeEndStart(operand, nextOperand).getMoveEnd(1);
+      // add operand, if already entered range
+      if (entered) {
+        subOperands.add(operand);
+        // may be last operand in range
+        if (range.endsIn(inclusiveGap)) {
+          exited = true;
+        }
+      } else {
+        // may be first operand in range
+        if (range.startsIn(inclusiveGap)) {
+          entered = true;
+        }
+      }
+    }
+    // check if last operand is in range
+    Expression lastGroupMember = operands[operands.length - 1];
+    if (range.end == lastGroupMember.end) {
+      subOperands.add(lastGroupMember);
+      exited = true;
+    }
+    // we expect that range covers only given operands
+    if (!exited) {
+      return [];
+    }
+    // done
+    return subOperands;
+  }
+
+  /**
+   * @return all operands of the given [BinaryExpression] and its children with the same
+   *         operator.
+   */
+  static List<Expression> _getOperandsInOrderFor(BinaryExpression groupRoot) {
+    List<Expression> operands = [];
+    TokenType groupOperatorType = groupRoot.operator.type;
+    groupRoot.accept(new _OrderedOperandsVisitor(groupOperatorType, operands));
+    return operands;
+  }
 }
 
 
@@ -868,6 +1162,66 @@
 
 
 /**
+ * Utilities to work with [Token]s.
+ */
+class TokenUtils {
+  /**
+   * @return the first [KeywordToken] with given [Keyword], may be <code>null</code> if
+   *         not found.
+   */
+  static KeywordToken findKeywordToken(List<Token> tokens, Keyword keyword) {
+    for (Token token in tokens) {
+      if (token is KeywordToken) {
+        KeywordToken keywordToken = token;
+        if (keywordToken.keyword == keyword) {
+          return keywordToken;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return the first [Token] with given [TokenType], may be <code>null</code> if not
+   *         found.
+   */
+  static Token findToken(List<Token> tokens, TokenType type) {
+    for (Token token in tokens) {
+      if (token.type == type) {
+        return token;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return [Token]s of the given Dart source, not <code>null</code>, may be empty if no
+   *         tokens or some exception happens.
+   */
+  static List<Token> getTokens(String s) {
+    try {
+      List<Token> tokens = [];
+      Scanner scanner = new Scanner(null, new CharSequenceReader(s), null);
+      Token token = scanner.tokenize();
+      while (token.type != TokenType.EOF) {
+        tokens.add(token);
+        token = token.next;
+      }
+      return tokens;
+    } catch (e) {
+      return [];
+    }
+  }
+
+  /**
+   * @return <code>true</code> if given [Token]s contain only single [Token] with given
+   *         [TokenType].
+   */
+  static bool hasOnly(List<Token> tokens, TokenType type) =>
+      tokens.length == 1 && tokens[0].type == type;
+}
+
+/**
  * A container with a source and its precedence.
  */
 class _InvertedCondition {
@@ -909,3 +1263,20 @@
   static _InvertedCondition _simple(String source) =>
       new _InvertedCondition(2147483647, source);
 }
+
+
+class _OrderedOperandsVisitor extends GeneralizingAstVisitor {
+  final TokenType groupOperatorType;
+  final List<Expression> operands;
+
+  _OrderedOperandsVisitor(this.groupOperatorType, this.operands);
+
+  @override
+  Object visitExpression(Expression node) {
+    if (node is BinaryExpression && node.operator.type == groupOperatorType) {
+      return super.visitNode(node);
+    }
+    operands.add(node);
+    return null;
+  }
+}
diff --git a/pkg/analysis_services/lib/src/generated/completion.dart b/pkg/analysis_server/lib/src/services/generated/completion.dart
similarity index 99%
rename from pkg/analysis_services/lib/src/generated/completion.dart
rename to pkg/analysis_server/lib/src/services/generated/completion.dart
index 6419e0e..bad6d0d 100644
--- a/pkg/analysis_services/lib/src/generated/completion.dart
+++ b/pkg/analysis_server/lib/src/services/generated/completion.dart
@@ -8,6 +8,8 @@
 library services.completion;
 
 import 'dart:collection';
+import 'package:analysis_server/src/protocol.dart' show
+    CompletionSuggestionKind;
 import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
@@ -23,8 +25,6 @@
 import 'stubs.dart';
 import 'util.dart';
 
-import '../../completion/completion_suggestion.dart';
-
 class AstNodeClassifier_CompletionEngine_typeOf extends CompletionEngine_AstNodeClassifier {
   final CompletionEngine CompletionEngine_this;
 
diff --git a/pkg/analysis_services/lib/src/generated/stubs.dart b/pkg/analysis_server/lib/src/services/generated/stubs.dart
similarity index 100%
rename from pkg/analysis_services/lib/src/generated/stubs.dart
rename to pkg/analysis_server/lib/src/services/generated/stubs.dart
diff --git a/pkg/analysis_services/lib/src/generated/util.dart b/pkg/analysis_server/lib/src/services/generated/util.dart
similarity index 70%
rename from pkg/analysis_services/lib/src/generated/util.dart
rename to pkg/analysis_server/lib/src/services/generated/util.dart
index fdfb01b..c969c96 100644
--- a/pkg/analysis_services/lib/src/generated/util.dart
+++ b/pkg/analysis_server/lib/src/services/generated/util.dart
@@ -16,9 +16,6 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/scanner.dart';
-import 'change.dart';
-import 'proposal.dart';
-import 'status.dart';
 import 'stubs.dart';
 
 /**
@@ -123,31 +120,6 @@
   static List<String> _KNOWN_METHOD_NAME_PREFIXES = ["get", "is", "to"];
 
   /**
-   * Validates that the [Edit] replaces the expected part of the [Source] and adds this
-   * [Edit] to the [SourceChange].
-   */
-  static void addEdit(AnalysisContext context, SourceChange change, String description, String expected, Edit edit) {
-    if (_DEBUG_VALIDATE_EDITS) {
-      Source source = change.source;
-      String sourceContent = getSourceContent(context, source);
-      // prepare range
-      int beginIndex = edit.offset;
-      int endIndex = beginIndex + edit.length;
-      int sourceLength = sourceContent.length;
-      if (beginIndex >= sourceLength || endIndex >= sourceLength) {
-        throw new IllegalStateException("${source} has ${sourceLength} characters but ${beginIndex} to ${endIndex} requested.\n\nTry to use Tools | Reanalyze Sources.");
-      }
-      // check that range has expected content
-      String rangeContent = sourceContent.substring(beginIndex, endIndex);
-      if (rangeContent != expected) {
-        throw new IllegalStateException("${source} expected |${expected}| at ${beginIndex} to ${endIndex} but |${rangeContent}| found.\n\nTry to use Tools | Reanalyze Sources.");
-      }
-    }
-    // do add the Edit
-    change.addEdit(edit, description);
-  }
-
-  /**
    * @return <code>true</code> if given [List]s are equals at given position.
    */
   static bool allListsEqual(List<List> lists, int position) {
@@ -161,26 +133,6 @@
   }
 
   /**
-   * @return the updated [String] with applied [Edit]s.
-   */
-  static String applyReplaceEdits(String s, List<Edit> edits) {
-    // sort edits
-    edits = [];
-    edits.sort((Edit o1, Edit o2) => o1.offset - o2.offset);
-    // apply edits
-    int delta = 0;
-    for (Edit edit in edits) {
-      int editOffset = edit.offset + delta;
-      String beforeEdit = s.substring(0, editOffset);
-      String afterEdit = s.substring(editOffset + edit.length);
-      s = "${beforeEdit}${edit.replacement}${afterEdit}";
-      delta += getDeltaOffset(edit);
-    }
-    // done
-    return s;
-  }
-
-  /**
    * @return <code>true</code> if given [SourceRange] covers given [AstNode].
    */
   static bool covers(SourceRange r, AstNode node) {
@@ -225,11 +177,6 @@
   }
 
   /**
-   * @return the number of characters this [Edit] will move offsets after its range.
-   */
-  static int getDeltaOffset(Edit edit) => edit.replacement.length - edit.length;
-
-  /**
    * @return the name of the [Element] kind.
    */
   static String getElementKindName(Element element) {
@@ -939,17 +886,6 @@
     return result;
   }
 
-  /**
-   * Adds enclosing parenthesis if the precedence of the [InvertedCondition] if less than the
-   * precedence of the expression we are going it to use in.
-   */
-  static String _parenthesizeIfRequired(CorrectionUtils_InvertedCondition expr, int newOperatorPrecedence) {
-    if (expr._precedence < newOperatorPrecedence) {
-      return "(${expr._source})";
-    }
-    return expr._source;
-  }
-
   final CompilationUnit unit;
 
   LibraryElement _library;
@@ -965,15 +901,6 @@
   }
 
   /**
-   * @return the source of the given [SourceRange] with indentation changed from "oldIndent"
-   *         to "newIndent", keeping indentation of the lines relative to each other.
-   */
-  Edit createIndentEdit(SourceRange range, String oldIndent, String newIndent) {
-    String newSource = getIndentSource(range, oldIndent, newIndent);
-    return new Edit(range.offset, range.length, newSource);
-  }
-
-  /**
    * @return the [AstNode] that encloses the given offset.
    */
   AstNode findNode(int offset) => new NodeLocator.con1(offset).searchWithin(unit);
@@ -1506,11 +1433,6 @@
   }
 
   /**
-   * @return the source of the inverted condition for the given logical expression.
-   */
-  String invertCondition(Expression expression) => _invertCondition0(expression)._source;
-
-  /**
    * @return <code>true</code> if selection range contains only whitespace.
    */
   bool isJustWhitespace(SourceRange range) => getText3(range).trim().length == 0;
@@ -1571,89 +1493,6 @@
     return null;
   }
 
-  /**
-   * @return the [InvertedCondition] for the given logical expression.
-   */
-  CorrectionUtils_InvertedCondition _invertCondition0(Expression expression) {
-    if (expression is BooleanLiteral) {
-      BooleanLiteral literal = expression;
-      if (literal.value) {
-        return CorrectionUtils_InvertedCondition._simple("false");
-      } else {
-        return CorrectionUtils_InvertedCondition._simple("true");
-      }
-    }
-    if (expression is BinaryExpression) {
-      BinaryExpression binary = expression;
-      TokenType operator = binary.operator.type;
-      Expression le = binary.leftOperand;
-      Expression re = binary.rightOperand;
-      CorrectionUtils_InvertedCondition ls = _invertCondition0(le);
-      CorrectionUtils_InvertedCondition rs = _invertCondition0(re);
-      if (operator == TokenType.LT) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " >= ", rs);
-      }
-      if (operator == TokenType.GT) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " <= ", rs);
-      }
-      if (operator == TokenType.LT_EQ) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " > ", rs);
-      }
-      if (operator == TokenType.GT_EQ) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " < ", rs);
-      }
-      if (operator == TokenType.EQ_EQ) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " != ", rs);
-      }
-      if (operator == TokenType.BANG_EQ) {
-        return CorrectionUtils_InvertedCondition._binary2(ls, " == ", rs);
-      }
-      if (operator == TokenType.AMPERSAND_AMPERSAND) {
-        int newPrecedence = TokenType.BAR_BAR.precedence;
-        return CorrectionUtils_InvertedCondition._binary(newPrecedence, ls, " || ", rs);
-      }
-      if (operator == TokenType.BAR_BAR) {
-        int newPrecedence = TokenType.AMPERSAND_AMPERSAND.precedence;
-        return CorrectionUtils_InvertedCondition._binary(newPrecedence, ls, " && ", rs);
-      }
-    }
-    if (expression is IsExpression) {
-      IsExpression isExpression = expression;
-      String expressionSource = getText(isExpression.expression);
-      String typeSource = getText(isExpression.type);
-      if (isExpression.notOperator == null) {
-        return CorrectionUtils_InvertedCondition._simple("${expressionSource} is! ${typeSource}");
-      } else {
-        return CorrectionUtils_InvertedCondition._simple("${expressionSource} is ${typeSource}");
-      }
-    }
-    if (expression is PrefixExpression) {
-      PrefixExpression prefixExpression = expression;
-      TokenType operator = prefixExpression.operator.type;
-      if (operator == TokenType.BANG) {
-        Expression operand = prefixExpression.operand;
-        while (operand is ParenthesizedExpression) {
-          ParenthesizedExpression pe = operand as ParenthesizedExpression;
-          operand = pe.expression;
-        }
-        return CorrectionUtils_InvertedCondition._simple(getText(operand));
-      }
-    }
-    if (expression is ParenthesizedExpression) {
-      ParenthesizedExpression pe = expression;
-      Expression innerExpresion = pe.expression;
-      while (innerExpresion is ParenthesizedExpression) {
-        innerExpresion = (innerExpresion as ParenthesizedExpression).expression;
-      }
-      return _invertCondition0(innerExpresion);
-    }
-    DartType type = expression.bestType;
-    if (type.displayName == "bool") {
-      return CorrectionUtils_InvertedCondition._simple("!${getText(expression)}");
-    }
-    return CorrectionUtils_InvertedCondition._simple(getText(expression));
-  }
-
   bool _selectionIncludesNonWhitespaceOutsideOperands(SourceRange selection, List<Expression> operands) => _selectionIncludesNonWhitespaceOutsideRange(selection, SourceRangeFactory.rangeNodes(operands));
 
   /**
@@ -1689,24 +1528,6 @@
   String suffix = "";
 }
 
-/**
- * This class is used to hold the source and also its precedence during inverting logical
- * expressions.
- */
-class CorrectionUtils_InvertedCondition {
-  static CorrectionUtils_InvertedCondition _binary(int precedence, CorrectionUtils_InvertedCondition left, String operation, CorrectionUtils_InvertedCondition right) => new CorrectionUtils_InvertedCondition(precedence, "${CorrectionUtils._parenthesizeIfRequired(left, precedence)}${operation}${CorrectionUtils._parenthesizeIfRequired(right, precedence)}");
-
-  static CorrectionUtils_InvertedCondition _binary2(CorrectionUtils_InvertedCondition left, String operation, CorrectionUtils_InvertedCondition right) => new CorrectionUtils_InvertedCondition(2147483647, "${left._source}${operation}${right._source}");
-
-  static CorrectionUtils_InvertedCondition _simple(String source) => new CorrectionUtils_InvertedCondition(2147483647, source);
-
-  final int _precedence;
-
-  final String _source;
-
-  CorrectionUtils_InvertedCondition(this._precedence, this._source);
-}
-
 class GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor extends GeneralizingAstVisitor<Object> {
   TokenType groupOperatorType;
 
@@ -1881,452 +1702,6 @@
 }
 
 /**
- * Abstract visitor for visiting [AstNode]s covered by the selection [SourceRange].
- */
-class SelectionAnalyzer extends GeneralizingAstVisitor<Object> {
-  SourceRange selection;
-
-  AstNode _coveringNode;
-
-  List<AstNode> _selectedNodes;
-
-  SelectionAnalyzer(SourceRange selection) {
-    assert(selection != null);
-    this.selection = selection;
-  }
-
-  /**
-   * @return the [AstNode] with the shortest length which completely covers the specified
-   *         selection.
-   */
-  AstNode get coveringNode => _coveringNode;
-
-  /**
-   * @return the first selected [AstNode], may be <code>null</code>.
-   */
-  AstNode get firstSelectedNode {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return null;
-    }
-    return _selectedNodes[0];
-  }
-
-  /**
-   * @return the last selected [AstNode], may be <code>null</code>.
-   */
-  AstNode get lastSelectedNode {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return null;
-    }
-    return _selectedNodes[_selectedNodes.length - 1];
-  }
-
-  /**
-   * @return the [SourceRange] which covers selected [AstNode]s, may be
-   *         <code>null</code> if no [AstNode]s under selection.
-   */
-  SourceRange get selectedNodeRange {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return null;
-    }
-    AstNode firstNode = _selectedNodes[0];
-    AstNode lastNode = _selectedNodes[_selectedNodes.length - 1];
-    return SourceRangeFactory.rangeStartEnd(firstNode, lastNode);
-  }
-
-  /**
-   * @return the [AstNode]s fully covered by the selection [SourceRange].
-   */
-  List<AstNode> get selectedNodes {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return [];
-    }
-    return _selectedNodes;
-  }
-
-  /**
-   * @return <code>true</code> if there are [AstNode] fully covered by the selection
-   *         [SourceRange].
-   */
-  bool get hasSelectedNodes => _selectedNodes != null && !_selectedNodes.isEmpty;
-
-  @override
-  Object visitNode(AstNode node) {
-    SourceRange nodeRange = SourceRangeFactory.rangeNode(node);
-    if (selection.covers(nodeRange)) {
-      if (isFirstNode) {
-        handleFirstSelectedNode(node);
-      } else {
-        handleNextSelectedNode(node);
-      }
-      return null;
-    } else if (selection.coveredBy(nodeRange)) {
-      _coveringNode = node;
-      node.visitChildren(this);
-      return null;
-    } else if (selection.startsIn(nodeRange)) {
-      handleSelectionStartsIn(node);
-      node.visitChildren(this);
-      return null;
-    } else if (selection.endsIn(nodeRange)) {
-      handleSelectionEndsIn(node);
-      node.visitChildren(this);
-      return null;
-    }
-    // no intersection
-    return null;
-  }
-
-  /**
-   * Adds first selected [AstNode].
-   */
-  void handleFirstSelectedNode(AstNode node) {
-    _selectedNodes = [];
-    _selectedNodes.add(node);
-  }
-
-  /**
-   * Adds second or more selected [AstNode].
-   */
-  void handleNextSelectedNode(AstNode node) {
-    if (identical(firstSelectedNode.parent, node.parent)) {
-      _selectedNodes.add(node);
-    }
-  }
-
-  /**
-   * Notifies that selection ends in given [AstNode].
-   */
-  void handleSelectionEndsIn(AstNode node) {
-  }
-
-  /**
-   * Notifies that selection starts in given [AstNode].
-   */
-  void handleSelectionStartsIn(AstNode node) {
-  }
-
-  /**
-   * Resets selected nodes.
-   */
-  void reset() {
-    _selectedNodes = null;
-  }
-
-  /**
-   * @return <code>true</code> if there was no selected nodes yet.
-   */
-  bool get isFirstNode => _selectedNodes == null;
-}
-
-/**
- * Helper for building Dart source with tracked positions.
- */
-class SourceBuilder {
-  final int offset;
-
-  JavaStringBuilder _buffer = new JavaStringBuilder();
-
-  Map<String, List<SourceRange>> _linkedPositions = {};
-
-  final Map<String, List<LinkedPositionProposal>> linkedProposals = {};
-
-  String _currentPositionGroupId;
-
-  int _currentPositionStart = 0;
-
-  int _endPosition = -1;
-
-  SourceBuilder.con1(this.offset);
-
-  SourceBuilder.con2(SourceRange offsetRange) : this.con1(offsetRange.offset);
-
-  /**
-   * Adds proposal for the current position, may be called after [startPosition].
-   */
-  void addProposal(CorrectionImage icon, String text) {
-    List<LinkedPositionProposal> proposals = linkedProposals[_currentPositionGroupId];
-    if (proposals == null) {
-      proposals = [];
-      linkedProposals[_currentPositionGroupId] = proposals;
-    }
-    proposals.add(new LinkedPositionProposal(icon, text));
-  }
-
-  /**
-   * Appends source to the buffer.
-   */
-  SourceBuilder append(String s) {
-    _buffer.append(s);
-    return this;
-  }
-
-  /**
-   * Ends position started using [startPosition].
-   */
-  void endPosition() {
-    assert(_currentPositionGroupId != null);
-    _addPosition();
-    _currentPositionGroupId = null;
-  }
-
-  /**
-   * @return the "end position" for the [CorrectionProposal], may be <code>-1</code> if not
-   *         set in this [SourceBuilder].
-   */
-  int get endPosition2 {
-    if (_endPosition == -1) {
-      return -1;
-    }
-    return offset + _endPosition;
-  }
-
-  /**
-   * @return the [Map] or position IDs to their locations.
-   */
-  Map<String, List<SourceRange>> get linkedPositions => _linkedPositions;
-
-  /**
-   * @return the length of the built source.
-   */
-  int length() => _buffer.length;
-
-  /**
-   * Marks current position as "end position" of the [CorrectionProposal].
-   */
-  void setEndPosition() {
-    _endPosition = _buffer.length;
-  }
-
-  /**
-   * Sets text-only proposals for the current position.
-   */
-  void set proposals(List<String> proposals) {
-    List<LinkedPositionProposal> proposalList = [];
-    for (String proposalText in proposals) {
-      proposalList.add(new LinkedPositionProposal(null, proposalText));
-    }
-    linkedProposals[_currentPositionGroupId] = proposalList;
-  }
-
-  /**
-   * Starts linked position with given ID.
-   */
-  void startPosition(String groupId) {
-    assert(_currentPositionGroupId == null);
-    _currentPositionGroupId = groupId;
-    _currentPositionStart = _buffer.length;
-  }
-
-  @override
-  String toString() => _buffer.toString();
-
-  /**
-   * Adds position location [SourceRange] using current fields.
-   */
-  void _addPosition() {
-    List<SourceRange> locations = _linkedPositions[_currentPositionGroupId];
-    if (locations == null) {
-      locations = [];
-      _linkedPositions[_currentPositionGroupId] = locations;
-    }
-    int start = offset + _currentPositionStart;
-    int end = offset + _buffer.length;
-    locations.add(SourceRangeFactory.rangeStartEnd(start, end));
-  }
-}
-
-/**
- * Analyzer to check if a selection covers a valid set of statements of AST.
- */
-class StatementAnalyzer extends SelectionAnalyzer {
-  /**
-   * @return <code>true</code> if "nodes" contains "node".
-   */
-  static bool _contains(List<AstNode> nodes, AstNode node) => nodes.contains(node);
-
-  /**
-   * @return <code>true</code> if "nodes" contains one of the "otherNodes".
-   */
-  static bool _contains2(List<AstNode> nodes, List<AstNode> otherNodes) {
-    for (AstNode otherNode in otherNodes) {
-      if (nodes.contains(otherNode)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  CorrectionUtils utils;
-
-  RefactoringStatus _status = new RefactoringStatus();
-
-  StatementAnalyzer.con1(CompilationUnit cunit, SourceRange selection) : this.con2(new CorrectionUtils(cunit), selection);
-
-  StatementAnalyzer.con2(CorrectionUtils utils, SourceRange selection) : super(selection) {
-    this.utils = utils;
-  }
-
-  /**
-   * @return the [RefactoringStatus] result of checking selection.
-   */
-  RefactoringStatus get status => _status;
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) {
-    super.visitCompilationUnit(node);
-    if (!hasSelectedNodes) {
-      return null;
-    }
-    // check that selection does not begin/end in comment
-    {
-      int selectionStart = selection.offset;
-      int selectionEnd = selection.end;
-      List<SourceRange> commentRanges = utils.commentRanges;
-      for (SourceRange commentRange in commentRanges) {
-        if (commentRange.contains(selectionStart)) {
-          invalidSelection("Selection begins inside a comment.");
-        }
-        if (commentRange.containsExclusive(selectionEnd)) {
-          invalidSelection("Selection ends inside a comment.");
-        }
-      }
-    }
-    // more checks
-    if (!_status.hasFatalError) {
-      _checkSelectedNodes(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    super.visitDoStatement(node);
-    List<AstNode> selectedNodes = this.selectedNodes;
-    if (_contains(selectedNodes, node.body)) {
-      invalidSelection("Operation not applicable to a 'do' statement's body and expression.");
-    }
-    return null;
-  }
-
-  @override
-  Object visitForStatement(ForStatement node) {
-    super.visitForStatement(node);
-    List<AstNode> selectedNodes = this.selectedNodes;
-    bool containsInit = _contains(selectedNodes, node.initialization) || _contains(selectedNodes, node.variables);
-    bool containsCondition = _contains(selectedNodes, node.condition);
-    bool containsUpdaters = _contains2(selectedNodes, node.updaters);
-    bool containsBody = _contains(selectedNodes, node.body);
-    if (containsInit && containsCondition) {
-      invalidSelection("Operation not applicable to a 'for' statement's initializer and condition.");
-    } else if (containsCondition && containsUpdaters) {
-      invalidSelection("Operation not applicable to a 'for' statement's condition and updaters.");
-    } else if (containsUpdaters && containsBody) {
-      invalidSelection("Operation not applicable to a 'for' statement's updaters and body.");
-    }
-    return null;
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    super.visitSwitchStatement(node);
-    List<AstNode> selectedNodes = this.selectedNodes;
-    List<SwitchMember> switchMembers = node.members;
-    for (AstNode selectedNode in selectedNodes) {
-      if (switchMembers.contains(selectedNode)) {
-        invalidSelection("Selection must either cover whole switch statement or parts of a single case block.");
-        break;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitTryStatement(TryStatement node) {
-    super.visitTryStatement(node);
-    AstNode firstSelectedNode = this.firstSelectedNode;
-    if (firstSelectedNode != null) {
-      if (identical(firstSelectedNode, node.body) || identical(firstSelectedNode, node.finallyBlock)) {
-        invalidSelection("Selection must either cover whole try statement or parts of try, catch, or finally block.");
-      } else {
-        List<CatchClause> catchClauses = node.catchClauses;
-        for (CatchClause catchClause in catchClauses) {
-          if (identical(firstSelectedNode, catchClause) || identical(firstSelectedNode, catchClause.body) || identical(firstSelectedNode, catchClause.exceptionParameter)) {
-            invalidSelection("Selection must either cover whole try statement or parts of try, catch, or finally block.");
-          }
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    super.visitWhileStatement(node);
-    List<AstNode> selectedNodes = this.selectedNodes;
-    if (_contains(selectedNodes, node.condition) && _contains(selectedNodes, node.body)) {
-      invalidSelection("Operation not applicable to a while statement's expression and body.");
-    }
-    return null;
-  }
-
-  /**
-   * Records fatal error with given message.
-   */
-  void invalidSelection(String message) {
-    invalidSelection2(message, null);
-  }
-
-  /**
-   * Records fatal error with given message and [RefactoringStatusContext].
-   */
-  void invalidSelection2(String message, RefactoringStatusContext context) {
-    _status.addFatalError(message, context);
-    reset();
-  }
-
-  /**
-   * Checks final selected [AstNode]s after processing [CompilationUnit].
-   */
-  void _checkSelectedNodes(CompilationUnit unit) {
-    List<AstNode> nodes = selectedNodes;
-    // some tokens before first selected node
-    {
-      AstNode firstNode = nodes[0];
-      SourceRange rangeBeforeFirstNode = SourceRangeFactory.rangeStartStart(selection, firstNode);
-      if (_hasTokens(rangeBeforeFirstNode)) {
-        invalidSelection2("The beginning of the selection contains characters that do not belong to a statement.", new RefactoringStatusContext.forUnit(unit, rangeBeforeFirstNode));
-      }
-    }
-    // some tokens after last selected node
-    {
-      AstNode lastNode = nodes.last;
-      SourceRange rangeAfterLastNode = SourceRangeFactory.rangeEndEnd(lastNode, selection);
-      if (_hasTokens(rangeAfterLastNode)) {
-        invalidSelection2("The end of the selection contains characters that do not belong to a statement.", new RefactoringStatusContext.forUnit(unit, rangeAfterLastNode));
-      }
-    }
-  }
-
-  /**
-   * @return the [Token]s in given [SourceRange].
-   */
-  List<Token> _getTokens(SourceRange range) {
-    try {
-      String text = utils.getText3(range);
-      return TokenUtils.getTokens(text);
-    } catch (e) {
-      return [];
-    }
-  }
-
-  /**
-   * @return <code>true</code> if there are [Token]s in the given [SourceRange].
-   */
-  bool _hasTokens(SourceRange range) => !_getTokens(range).isEmpty;
-}
-
-/**
  * Utilities to work with [Token]s.
  */
 class TokenUtils {
@@ -2384,54 +1759,3 @@
    */
   static bool hasOnly(List<Token> tokens, TokenType type) => tokens.length == 1 && tokens[0].type == type;
 }
-
-class URIUtils {
-  /**
-   * Computes relative relative path to reference "target" from "base". Uses ".." if needed, in
-   * contrast to [URI#relativize].
-   */
-  static String computeRelativePath(String base, String target) {
-    // convert to URI separator
-    base = base.replaceAll("\\\\", "/");
-    target = target.replaceAll("\\\\", "/");
-    if (base.startsWith("/") && target.startsWith("/")) {
-      base = base.substring(1);
-      target = target.substring(1);
-    }
-    // equal paths - no relative
-    if (base == target) {
-      return null;
-    }
-    // split paths
-    List<String> baseParts = base.split("/");
-    List<String> targetParts = target.split("/");
-    // prepare maximum possible common root length
-    int length = baseParts.length < targetParts.length ? baseParts.length : targetParts.length;
-    // find common root
-    int lastCommonRoot = -1;
-    for (int i = 0; i < length; i++) {
-      if (baseParts[i] == targetParts[i]) {
-        lastCommonRoot = i;
-      } else {
-        break;
-      }
-    }
-    // append ..
-    JavaStringBuilder relativePath = new JavaStringBuilder();
-    for (int i = lastCommonRoot + 1; i < baseParts.length; i++) {
-      if (baseParts[i].length > 0) {
-        relativePath.append("../");
-      }
-    }
-    // append target folder names
-    for (int i = lastCommonRoot + 1; i < targetParts.length - 1; i++) {
-      String p = targetParts[i];
-      relativePath.append(p);
-      relativePath.append("/");
-    }
-    // append target file name
-    relativePath.append(targetParts[targetParts.length - 1]);
-    // done
-    return relativePath.toString();
-  }
-}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart
similarity index 98%
rename from pkg/analysis_services/lib/index/index.dart
rename to pkg/analysis_server/lib/src/services/index/index.dart
index f69b89b..acfc835 100644
--- a/pkg/analysis_services/lib/index/index.dart
+++ b/pkg/analysis_server/lib/src/services/index/index.dart
@@ -305,10 +305,8 @@
 class LocationWithData<D> extends Location {
   final D data;
 
-  LocationWithData(Location location, this.data) : super(
-      location.element,
-      location.offset,
-      location.length);
+  LocationWithData(Location location, this.data)
+      : super(location.element, location.offset, location.length);
 }
 
 
diff --git a/pkg/analysis_services/lib/src/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
similarity index 86%
rename from pkg/analysis_services/lib/src/index/index_contributor.dart
rename to pkg/analysis_server/lib/src/services/index/index_contributor.dart
index 2164a4e..2283bee 100644
--- a/pkg/analysis_services/lib/src/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -6,15 +6,14 @@
 
 import 'dart:collection' show Queue;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/index_store.dart';
+import 'package:analysis_server/src/services/correction/namespace.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/index_store.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/html.dart' as ht;
-import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -319,17 +318,6 @@
 
 
 /**
- * Information about [ImportElement] and place where it is referenced using
- * [PrefixElement].
- */
-class _ImportElementInfo {
-  ImportElement _element;
-
-  int _periodEnd = 0;
-}
-
-
-/**
  * Visits a resolved AST and adds relationships into [IndexStore].
  */
 class _IndexContributor extends GeneralizingAstVisitor<Object> {
@@ -918,13 +906,13 @@
    * with given prefix node.
    */
   void _recordImportElementReferenceWithPrefix(SimpleIdentifier prefixNode) {
-    _ImportElementInfo info = getImportElementInfo(prefixNode);
+    ImportElementInfo info = internal_getImportElementInfo(prefixNode);
     if (info != null) {
       int offset = prefixNode.offset;
-      int length = info._periodEnd - offset;
+      int length = info.periodEnd - offset;
       Location location = _createLocationForOffset(offset, length);
       recordRelationship(
-          info._element,
+          info.element,
           IndexConstants.IS_REFERENCED_BY,
           location);
     }
@@ -943,7 +931,7 @@
     }
     Element element = node.staticElement;
     ImportElement importElement =
-        _internalGetImportElement(_libraryElement, null, element, _importElementsMap);
+        internal_getImportElement(_libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
       Location location = _createLocationForOffset(node.offset, 0);
       recordRelationship(
@@ -1023,60 +1011,6 @@
   }
 
   /**
-   * @return the [ImportElement] that is referenced by this node with [PrefixElement],
-   *         may be `null`.
-   */
-  static ImportElement getImportElement(SimpleIdentifier prefixNode) {
-    _ImportElementInfo info = getImportElementInfo(prefixNode);
-    return info != null ? info._element : null;
-  }
-
-  /**
-   * @return the [ImportElementInfo] with [ImportElement] that is referenced by this
-   *         node with [PrefixElement], may be `null`.
-   */
-  static _ImportElementInfo getImportElementInfo(SimpleIdentifier prefixNode) {
-    _ImportElementInfo info = new _ImportElementInfo();
-    // prepare environment
-    AstNode parent = prefixNode.parent;
-    CompilationUnit unit =
-        prefixNode.getAncestor((node) => node is CompilationUnit);
-    LibraryElement libraryElement = unit.element.library;
-    // prepare used element
-    Element usedElement = null;
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (prefixed.prefix == prefixNode) {
-        usedElement = prefixed.staticElement;
-        info._periodEnd = prefixed.period.end;
-      }
-    }
-    if (parent is MethodInvocation) {
-      MethodInvocation invocation = parent;
-      if (invocation.target == prefixNode) {
-        usedElement = invocation.methodName.staticElement;
-        info._periodEnd = invocation.period.end;
-      }
-    }
-    // we need used Element
-    if (usedElement == null) {
-      return null;
-    }
-    // find ImportElement
-    String prefix = prefixNode.name;
-    Map<ImportElement, Set<Element>> importElementsMap = {};
-    info._element = _internalGetImportElement(
-        libraryElement,
-        prefix,
-        usedElement,
-        importElementsMap);
-    if (info._element == null) {
-      return null;
-    }
-    return info;
-  }
-
-  /**
    * If the given expression has resolved type, returns the new location with this type.
    *
    * [location] - the base location
@@ -1091,81 +1025,6 @@
   }
 
   /**
-   * @return the [ImportElement] that declares given [PrefixElement] and imports library
-   *         with given "usedElement".
-   */
-  static ImportElement _internalGetImportElement(LibraryElement libraryElement,
-      String prefix, Element usedElement, Map<ImportElement,
-      Set<Element>> importElementsMap) {
-    // validate Element
-    if (usedElement == null) {
-      return null;
-    }
-    if (usedElement.enclosingElement is! CompilationUnitElement) {
-      return null;
-    }
-    LibraryElement usedLibrary = usedElement.library;
-    // find ImportElement that imports used library with used prefix
-    List<ImportElement> candidates = null;
-    for (ImportElement importElement in libraryElement.imports) {
-      // required library
-      if (importElement.importedLibrary != usedLibrary) {
-        continue;
-      }
-      // required prefix
-      PrefixElement prefixElement = importElement.prefix;
-      if (prefix == null) {
-        if (prefixElement != null) {
-          continue;
-        }
-      } else {
-        if (prefixElement == null) {
-          continue;
-        }
-        if (prefix != prefixElement.name) {
-          continue;
-        }
-      }
-      // no combinators => only possible candidate
-      if (importElement.combinators.length == 0) {
-        return importElement;
-      }
-      // OK, we have candidate
-      if (candidates == null) {
-        candidates = [];
-      }
-      candidates.add(importElement);
-    }
-    // no candidates, probably element is defined in this library
-    if (candidates == null) {
-      return null;
-    }
-    // one candidate
-    if (candidates.length == 1) {
-      return candidates[0];
-    }
-    // ensure that each ImportElement has set of elements
-    for (ImportElement importElement in candidates) {
-      if (importElementsMap.containsKey(importElement)) {
-        continue;
-      }
-      Namespace namespace =
-          new NamespaceBuilder().createImportNamespaceForDirective(importElement);
-      Set<Element> elements = new Set.from(namespace.definedNames.values);
-      importElementsMap[importElement] = elements;
-    }
-    // use import namespace to choose correct one
-    for (MapEntry<ImportElement, Set<Element>> entry in getMapEntrySet(
-        importElementsMap)) {
-      if (entry.getValue().contains(usedElement)) {
-        return entry.getKey();
-      }
-    }
-    // not found
-    return null;
-  }
-
-  /**
    * @return `true` if given "node" is part of an import [Combinator].
    */
   static bool _isIdentifierInImportCombinator(SimpleIdentifier node) {
diff --git a/pkg/analysis_services/lib/index/index_store.dart b/pkg/analysis_server/lib/src/services/index/index_store.dart
similarity index 98%
rename from pkg/analysis_services/lib/index/index_store.dart
rename to pkg/analysis_server/lib/src/services/index/index_store.dart
index e04c012..a3f1950 100644
--- a/pkg/analysis_services/lib/index/index_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_store.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analysis_server/lib/src/services/index/local_file_index.dart b/pkg/analysis_server/lib/src/services/index/local_file_index.dart
new file mode 100644
index 0000000..b8a701b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/index/local_file_index.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.index.local_file_index;
+
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_index.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/store/temporary_folder_file_manager.dart';
+import 'package:analysis_server/src/services/index/store/split_store.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+
+Index createLocalFileIndex() {
+  var fileManager = new TemporaryFolderFileManager();
+  var stringCodec = new StringCodec();
+  var nodeManager =
+      new FileNodeManager(
+          fileManager,
+          AnalysisEngine.instance.logger,
+          stringCodec,
+          new ContextCodec(),
+          new ElementCodec(stringCodec),
+          new RelationshipCodec(stringCodec));
+  return new LocalIndex(nodeManager);
+}
diff --git a/pkg/analysis_services/lib/src/index/local_index.dart b/pkg/analysis_server/lib/src/services/index/local_index.dart
similarity index 89%
rename from pkg/analysis_services/lib/src/index/local_index.dart
rename to pkg/analysis_server/lib/src/services/index/local_index.dart
index 447cd22..5c95b97 100644
--- a/pkg/analysis_services/lib/src/index/local_index.dart
+++ b/pkg/analysis_server/lib/src/services/index/local_index.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/index_contributor.dart' as contributors;
-import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/index_contributor.dart' as contributors;
+import 'package:analysis_server/src/services/index/store/split_store.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
diff --git a/pkg/analysis_services/lib/index/local_memory_index.dart b/pkg/analysis_server/lib/src/services/index/local_memory_index.dart
similarity index 61%
rename from pkg/analysis_services/lib/index/local_memory_index.dart
rename to pkg/analysis_server/lib/src/services/index/local_memory_index.dart
index cbd73d4..6f4072e 100644
--- a/pkg/analysis_services/lib/index/local_memory_index.dart
+++ b/pkg/analysis_server/lib/src/services/index/local_memory_index.dart
@@ -4,9 +4,9 @@
 
 library services.index.memory_file_index;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/local_index.dart';
-import 'package:analysis_services/src/index/store/memory_node_manager.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_index.dart';
+import 'package:analysis_server/src/services/index/store/memory_node_manager.dart';
 
 
 Index createLocalMemoryIndex() {
diff --git a/pkg/analysis_services/lib/src/index/store/codec.dart b/pkg/analysis_server/lib/src/services/index/store/codec.dart
similarity index 97%
rename from pkg/analysis_services/lib/src/index/store/codec.dart
rename to pkg/analysis_server/lib/src/services/index/store/codec.dart
index ee4e38e..6030134 100644
--- a/pkg/analysis_services/lib/src/index/store/codec.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/codec.dart
@@ -6,8 +6,8 @@
 
 import 'dart:collection';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/store/collection.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/store/collection.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 
diff --git a/pkg/analysis_services/lib/src/index/store/collection.dart b/pkg/analysis_server/lib/src/services/index/store/collection.dart
similarity index 100%
rename from pkg/analysis_services/lib/src/index/store/collection.dart
rename to pkg/analysis_server/lib/src/services/index/store/collection.dart
diff --git a/pkg/analysis_services/lib/src/index/store/memory_node_manager.dart b/pkg/analysis_server/lib/src/services/index/store/memory_node_manager.dart
similarity index 93%
rename from pkg/analysis_services/lib/src/index/store/memory_node_manager.dart
rename to pkg/analysis_server/lib/src/services/index/store/memory_node_manager.dart
index 1de944f..8d43188 100644
--- a/pkg/analysis_services/lib/src/index/store/memory_node_manager.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/memory_node_manager.dart
@@ -7,8 +7,8 @@
 import 'dart:async';
 import 'dart:collection';
 
-import 'package:analysis_services/src/index/store/codec.dart';
-import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/store/split_store.dart';
 import 'package:analyzer/src/generated/engine.dart';
 
 
diff --git a/pkg/analysis_services/lib/src/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
similarity index 98%
rename from pkg/analysis_services/lib/src/index/store/split_store.dart
rename to pkg/analysis_server/lib/src/services/index/store/split_store.dart
index 5a81f59..0ba0702 100644
--- a/pkg/analysis_services/lib/src/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -9,10 +9,10 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/index_store.dart';
-import 'package:analysis_services/src/index/store/codec.dart';
-import 'package:analysis_services/src/index/store/collection.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/index_store.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/store/collection.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
diff --git a/pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart b/pkg/analysis_server/lib/src/services/index/store/temporary_folder_file_manager.dart
similarity index 96%
rename from pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart
rename to pkg/analysis_server/lib/src/services/index/store/temporary_folder_file_manager.dart
index 331da60..ddf915e 100644
--- a/pkg/analysis_services/lib/src/index/store/temporary_folder_file_manager.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/temporary_folder_file_manager.dart
@@ -7,7 +7,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analysis_server/src/services/index/store/split_store.dart';
 import 'package:path/path.dart' as pathos;
 
 
diff --git a/pkg/analysis_services/lib/json.dart b/pkg/analysis_server/lib/src/services/json.dart
similarity index 100%
rename from pkg/analysis_services/lib/json.dart
rename to pkg/analysis_server/lib/src/services/json.dart
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
new file mode 100644
index 0000000..ba189d2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -0,0 +1,537 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.extract_local;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
+import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/search/element_visitors.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+const String _TOKEN_SEPARATOR = "\uFFFF";
+
+
+/**
+ * [ExtractLocalRefactoring] implementation.
+ */
+class ExtractLocalRefactoringImpl extends RefactoringImpl implements
+    ExtractLocalRefactoring {
+  final CompilationUnit unit;
+  final int selectionOffset;
+  final int selectionLength;
+  String file;
+  SourceRange selectionRange;
+  CorrectionUtils utils;
+
+  String name;
+  bool extractAll = true;
+  final List<String> names = <String>[];
+  final List<int> offsets = <int>[];
+  final List<int> lengths = <int>[];
+
+  Expression rootExpression;
+  Expression singleExpression;
+  bool wholeStatementExpression = false;
+  String stringLiteralPart;
+  final List<SourceRange> occurrences = <SourceRange>[];
+  final Set<String> excludedVariableNames = new Set<String>();
+
+  ExtractLocalRefactoringImpl(this.unit, this.selectionOffset,
+      this.selectionLength) {
+    file = unit.element.source.fullName;
+    selectionRange = new SourceRange(selectionOffset, selectionLength);
+    utils = new CorrectionUtils(unit);
+  }
+
+  @override
+  String get refactoringName => 'Extract Local Variable';
+
+  String get _declarationKeyword {
+    if (_isPartOfConstantExpression(rootExpression)) {
+      return "const";
+    } else {
+      return "var";
+    }
+  }
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    if (excludedVariableNames.contains(name)) {
+      result.addWarning(
+          format(
+              "A variable with name '{0}' is already defined in the visible scope.",
+              name));
+    }
+    return new Future.value(result);
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    // selection
+    result.addStatus(_checkSelection());
+    if (result.hasFatalError) {
+      return new Future.value(result);
+    }
+    // occurrences
+    _prepareOccurrences();
+    _prepareOffsetsLengths();
+    // names
+    _prepareExcludedNames();
+    _prepareNames();
+    // done
+    return new Future.value(result);
+  }
+
+  @override
+  RefactoringStatus checkName() {
+    return validateVariableName(name);
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    // prepare occurrences
+    List<SourceRange> occurrences;
+    if (extractAll) {
+      occurrences = this.occurrences;
+    } else {
+      occurrences = [selectionRange];
+    }
+    // If the whole expression of a statement is selected, like '1 + 2',
+    // then convert it into a variable declaration statement.
+    if (wholeStatementExpression && occurrences.length == 1) {
+      String keyword = _declarationKeyword;
+      String declarationSource = '$keyword $name = ';
+      SourceEdit edit =
+          new SourceEdit(singleExpression.offset, 0, declarationSource);
+      change.addEdit(file, edit);
+      return new Future.value(change);
+    }
+    // add variable declaration
+    {
+      String declarationSource;
+      if (stringLiteralPart != null) {
+        declarationSource = "var ${name} = '${stringLiteralPart}';";
+      } else {
+        String keyword = _declarationKeyword;
+        String initializerSource = utils.getRangeText(selectionRange);
+        declarationSource = "${keyword} ${name} = ${initializerSource};";
+      }
+      // prepare location for declaration
+      Statement targetStatement = _findTargetStatement(occurrences);
+      String prefix = utils.getNodePrefix(targetStatement);
+      // insert variable declaration
+      String eol = utils.endOfLine;
+      SourceEdit edit = new SourceEdit(
+          targetStatement.offset,
+          0,
+          '${declarationSource}${eol}${prefix}');
+      change.addEdit(file, edit);
+    }
+    // prepare replacement
+    String occurrenceReplacement = name;
+    if (stringLiteralPart != null) {
+      occurrenceReplacement = "\${$name}";
+    }
+    // replace occurrences with variable reference
+    for (SourceRange range in occurrences) {
+      SourceEdit edit = new SourceEdit.range(range, occurrenceReplacement);
+      change.addEdit(file, edit);
+    }
+    // done
+    return new Future.value(change);
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  /**
+   * Checks if [selectionRange] selects [Expression] which can be extracted, and
+   * location of this [DartExpression] in AST allows extracting.
+   */
+  RefactoringStatus _checkSelection() {
+    _ExtractExpressionAnalyzer _selectionAnalyzer =
+        new _ExtractExpressionAnalyzer(selectionRange);
+    unit.accept(_selectionAnalyzer);
+    AstNode coveringNode = _selectionAnalyzer.coveringNode;
+    // may be fatal error
+    {
+      RefactoringStatus status = _selectionAnalyzer.status;
+      if (status.hasFatalError) {
+        return status;
+      }
+    }
+    // we need enclosing block to add variable declaration statement
+    if (coveringNode == null ||
+        coveringNode.getAncestor((node) => node is Block) == null) {
+      return new RefactoringStatus.fatal(
+          'Expression inside of function must be selected '
+              'to activate this refactoring.');
+    }
+    // part of string literal
+    if (coveringNode is StringLiteral) {
+      stringLiteralPart = utils.getRangeText(selectionRange);
+      if (stringLiteralPart.startsWith("'") ||
+          stringLiteralPart.startsWith('"') ||
+          stringLiteralPart.endsWith("'") ||
+          stringLiteralPart.endsWith('"')) {
+        return new RefactoringStatus.fatal(
+            'Cannot extract only leading or trailing quote of string literal.');
+      }
+      return new RefactoringStatus();
+    }
+    // single node selected
+    if (_selectionAnalyzer.selectedNodes.length == 1 &&
+        !utils.selectionIncludesNonWhitespaceOutsideNode(
+            selectionRange,
+            _selectionAnalyzer.firstSelectedNode)) {
+      AstNode selectedNode = _selectionAnalyzer.firstSelectedNode;
+      if (selectedNode is Expression) {
+        rootExpression = selectedNode;
+        singleExpression = rootExpression;
+        wholeStatementExpression =
+            singleExpression.parent is ExpressionStatement;
+        return new RefactoringStatus();
+      }
+    }
+    // fragment of binary expression selected
+    if (coveringNode is BinaryExpression) {
+      BinaryExpression binaryExpression = coveringNode;
+      if (utils.validateBinaryExpressionRange(
+          binaryExpression,
+          selectionRange)) {
+        rootExpression = binaryExpression;
+        singleExpression = null;
+        return new RefactoringStatus();
+      }
+    }
+    // invalid selection
+    return new RefactoringStatus.fatal(
+        'Expression must be selected to activate this refactoring.');
+  }
+
+  /**
+   * Returns [AstNode]s at the offsets of the given [SourceRange]s.
+   */
+  List<AstNode> _findNodes(List<SourceRange> ranges) {
+    List<AstNode> nodes = <AstNode>[];
+    for (SourceRange range in ranges) {
+      AstNode node = new NodeLocator.con1(range.offset).searchWithin(unit);
+      nodes.add(node);
+    }
+    return nodes;
+  }
+
+  /**
+   * Returns the [Statement] such that variable declaration added before it is
+   * visible at all given occurrences.
+   */
+  Statement _findTargetStatement(List<SourceRange> occurrences) {
+    List<AstNode> nodes = _findNodes(occurrences);
+    List<AstNode> firstParents = getParents(nodes[0]);
+    AstNode commonParent = getNearestCommonAncestor(nodes);
+    if (commonParent is Block) {
+      int commonIndex = firstParents.indexOf(commonParent);
+      return firstParents[commonIndex + 1] as Statement;
+    } else {
+      return commonParent.getAncestor((node) => node is Statement);
+    }
+  }
+
+  /**
+   * Checks if it is OK to extract the node with the given [SourceRange].
+   */
+  bool _isExtractable(SourceRange range) {
+    _ExtractExpressionAnalyzer analyzer = new _ExtractExpressionAnalyzer(range);
+    utils.unit.accept(analyzer);
+    return analyzer.status.isOK;
+  }
+
+  bool _isPartOfConstantExpression(AstNode node) {
+    if (node is TypedLiteral) {
+      return node.constKeyword != null;
+    }
+    if (node is InstanceCreationExpression) {
+      InstanceCreationExpression creation = node;
+      return creation.isConst;
+    }
+    if (node is ArgumentList ||
+        node is ConditionalExpression ||
+        node is BinaryExpression ||
+        node is ParenthesizedExpression ||
+        node is PrefixExpression ||
+        node is Literal ||
+        node is MapLiteralEntry) {
+      return _isPartOfConstantExpression(node.parent);
+    }
+    return false;
+  }
+
+  void _prepareExcludedNames() {
+    excludedVariableNames.clear();
+    AstNode enclosingNode =
+        new NodeLocator.con1(selectionOffset).searchWithin(unit);
+    Block enclosingBlock = enclosingNode.getAncestor((node) => node is Block);
+    if (enclosingBlock != null) {
+      SourceRange newVariableVisibleRange =
+          rangeStartEnd(selectionRange, enclosingBlock.end);
+      ExecutableElement enclosingExecutable =
+          getEnclosingExecutableElement(enclosingNode);
+      if (enclosingExecutable != null) {
+        visitChildren(enclosingExecutable, (Element element) {
+          if (element is LocalElement) {
+            SourceRange elementRange = element.visibleRange;
+            if (elementRange != null &&
+                elementRange.intersects(newVariableVisibleRange)) {
+              excludedVariableNames.add(element.displayName);
+            }
+          }
+          return true;
+        });
+      }
+    }
+  }
+
+  void _prepareNames() {
+    names.clear();
+    if (stringLiteralPart != null) {
+      names.addAll(
+          getVariableNameSuggestionsForText(stringLiteralPart, excludedVariableNames));
+    } else if (singleExpression != null) {
+      names.addAll(
+          getVariableNameSuggestionsForExpression(
+              singleExpression.staticType,
+              singleExpression,
+              excludedVariableNames));
+    }
+  }
+
+  /**
+   * Prepares all occurrences of the source which matches given selection,
+   * sorted by offsets.
+   */
+  void _prepareOccurrences() {
+    occurrences.clear();
+    // prepare selection
+    String selectionSource;
+    {
+      String rawSelectionSource = utils.getRangeText(selectionRange);
+      List<Token> selectionTokens = TokenUtils.getTokens(rawSelectionSource);
+      selectionSource = selectionTokens.join(_TOKEN_SEPARATOR);
+    }
+    // prepare enclosing function
+    AstNode enclosingFunction;
+    {
+      AstNode selectionNode =
+          new NodeLocator.con1(selectionOffset).searchWithin(unit);
+      enclosingFunction = getEnclosingExecutableNode(selectionNode);
+    }
+    // visit function
+    enclosingFunction.accept(
+        new _OccurrencesVisitor(this, occurrences, selectionSource));
+  }
+
+  void _prepareOffsetsLengths() {
+    offsets.clear();
+    lengths.clear();
+    for (SourceRange occurrence in occurrences) {
+      offsets.add(occurrence.offset);
+      lengths.add(occurrence.length);
+    }
+  }
+}
+
+
+/**
+ * [SelectionAnalyzer] for [ExtractLocalRefactoringImpl].
+ */
+class _ExtractExpressionAnalyzer extends SelectionAnalyzer {
+  final RefactoringStatus status = new RefactoringStatus();
+
+  _ExtractExpressionAnalyzer(SourceRange selection) : super(selection);
+
+  /**
+   * Records fatal error with given message.
+   */
+  void invalidSelection(String message) {
+    _invalidSelection(message, null);
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    super.visitAssignmentExpression(node);
+    Expression lhs = node.leftHandSide;
+    if (_isFirstSelectedNode(lhs)) {
+      _invalidSelection(
+          'Cannot extract the left-hand side of an assignment.',
+          new Location.fromNode(lhs));
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    super.visitSimpleIdentifier(node);
+    if (_isFirstSelectedNode(node)) {
+      // name of declaration
+      if (node.inDeclarationContext()) {
+        invalidSelection('Cannot extract the name part of a declaration.');
+      }
+      // method name
+      Element element = node.bestElement;
+      if (element is FunctionElement || element is MethodElement) {
+        invalidSelection('Cannot extract a single method name.');
+      }
+      // name in property access
+      AstNode parent = node.parent;
+      if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
+        invalidSelection('Cannot extract name part of a property access.');
+      }
+      if (parent is PropertyAccess && identical(parent.propertyName, node)) {
+        invalidSelection('Cannot extract name part of a property access.');
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Records fatal error with given message and [Locatiom].
+   */
+  void _invalidSelection(String message, Location location) {
+    status.addFatalError(message, location);
+    reset();
+  }
+
+  bool _isFirstSelectedNode(AstNode node) => node == firstSelectedNode;
+}
+
+
+class _HasStatementVisitor extends GeneralizingAstVisitor {
+  final List<bool> result;
+
+  _HasStatementVisitor(this.result);
+
+  @override
+  visitStatement(Statement node) {
+    result[0] = true;
+  }
+}
+
+
+class _OccurrencesVisitor extends GeneralizingAstVisitor<Object> {
+  final ExtractLocalRefactoringImpl ref;
+  final List<SourceRange> occurrences;
+  final String selectionSource;
+
+  _OccurrencesVisitor(this.ref, this.occurrences, this.selectionSource);
+
+  @override
+  Object visitBinaryExpression(BinaryExpression node) {
+    if (!_hasStatements(node)) {
+      _tryToFindOccurrenceFragment(node);
+      return null;
+    }
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    if (ref._isExtractable(rangeNode(node))) {
+      _tryToFindOccurrence(node);
+    }
+    return super.visitExpression(node);
+  }
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    if (ref.stringLiteralPart != null) {
+      int occuLength = ref.stringLiteralPart.length;
+      String value = node.value;
+      int valueOffset = node.offset + (node.isMultiline ? 3 : 1);
+      int lastIndex = 0;
+      while (true) {
+        int index = value.indexOf(ref.stringLiteralPart, lastIndex);
+        if (index == -1) {
+          break;
+        }
+        lastIndex = index + occuLength;
+        int occuStart = valueOffset + index;
+        SourceRange occuRange = rangeStartLength(occuStart, occuLength);
+        occurrences.add(occuRange);
+      }
+      return null;
+    }
+    return visitExpression(node);
+  }
+
+  void _addOccurrence(SourceRange range) {
+    if (range.intersects(ref.selectionRange)) {
+      occurrences.add(ref.selectionRange);
+    } else {
+      occurrences.add(range);
+    }
+  }
+
+  bool _hasStatements(AstNode root) {
+    List<bool> result = [false];
+    root.accept(new _HasStatementVisitor(result));
+    return result[0];
+  }
+
+  void _tryToFindOccurrence(Expression node) {
+    String nodeSource = ref.utils.getNodeText(node);
+    List<Token> nodeTokens = TokenUtils.getTokens(nodeSource);
+    nodeSource = nodeTokens.join(_TOKEN_SEPARATOR);
+    if (nodeSource == selectionSource) {
+      SourceRange occuRange = rangeNode(node);
+      _addOccurrence(occuRange);
+    }
+  }
+
+  void _tryToFindOccurrenceFragment(Expression node) {
+    int nodeOffset = node.offset;
+    String nodeSource = ref.utils.getNodeText(node);
+    List<Token> nodeTokens = TokenUtils.getTokens(nodeSource);
+    nodeSource = nodeTokens.join(_TOKEN_SEPARATOR);
+    // find "selection" in "node" tokens
+    int lastIndex = 0;
+    while (true) {
+      // find next occurrence
+      int index = nodeSource.indexOf(selectionSource, lastIndex);
+      if (index == -1) {
+        break;
+      }
+      lastIndex = index + selectionSource.length;
+      // find start/end tokens
+      int startTokenIndex =
+          countMatches(nodeSource.substring(0, index), _TOKEN_SEPARATOR);
+      int endTokenIndex =
+          countMatches(nodeSource.substring(0, lastIndex), _TOKEN_SEPARATOR);
+      Token startToken = nodeTokens[startTokenIndex];
+      Token endToken = nodeTokens[endTokenIndex];
+      // add occurrence range
+      int occuStart = nodeOffset + startToken.offset;
+      int occuEnd = nodeOffset + endToken.end;
+      SourceRange occuRange = rangeStartEnd(occuStart, occuEnd);
+      _addOccurrence(occuRange);
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
new file mode 100644
index 0000000..4418916
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -0,0 +1,1059 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.extract_method;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
+import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+const String _TOKEN_SEPARATOR = '\uFFFF';
+
+
+/**
+ * Returns the "normalized" version of the given source, which is reconstructed
+ * from tokens, so ignores all the comments and spaces.
+ */
+String _getNormalizedSource(String src) {
+  List<Token> selectionTokens = TokenUtils.getTokens(src);
+  return StringUtils.join(selectionTokens, _TOKEN_SEPARATOR);
+}
+
+
+/**
+ * Returns the [Map] which maps [map] values to their keys.
+ */
+Map<String, String> _inverseMap(Map map) {
+  Map result = {};
+  map.forEach((key, value) {
+    result[value] = key;
+  });
+  return result;
+}
+
+
+/**
+ * [ExtractMethodRefactoring] implementation.
+ */
+class ExtractMethodRefactoringImpl extends RefactoringImpl implements
+    ExtractMethodRefactoring {
+  final SearchEngine searchEngine;
+  final CompilationUnit unit;
+  final int selectionOffset;
+  final int selectionLength;
+  String file;
+  SourceRange selectionRange;
+  CorrectionUtils utils;
+
+  String returnType;
+  String name;
+  bool extractAll = true;
+  bool createGetter = false;
+  final List<String> names = <String>[];
+  final List<int> offsets = <int>[];
+  final List<int> lengths = <int>[];
+
+  Set<String> _usedNames = new Set<String>();
+  List<RefactoringMethodParameter> _parameters = <RefactoringMethodParameter>[];
+  Map<String, RefactoringMethodParameter> _parametersMap = <String,
+      RefactoringMethodParameter>{};
+  Map<String, List<SourceRange>> _parameterReferencesMap = <String,
+      List<SourceRange>>{};
+  DartType _returnType;
+  String _returnVariableName;
+  AstNode _parentMember;
+  Expression _selectionExpression;
+  FunctionExpression _selectionFunctionExpression;
+  List<Statement> _selectionStatements;
+  List<_Occurrence> _occurrences = [];
+  bool _staticContext = false;
+
+  ExtractMethodRefactoringImpl(this.searchEngine, this.unit,
+      this.selectionOffset, this.selectionLength) {
+    file = unit.element.source.fullName;
+    selectionRange = new SourceRange(selectionOffset, selectionLength);
+    utils = new CorrectionUtils(unit);
+  }
+
+  bool get canCreateGetter {
+    if (!parameters.isEmpty) {
+      return false;
+    }
+    if (_selectionExpression != null) {
+      if (_selectionExpression is AssignmentExpression) {
+        return false;
+      }
+    }
+    if (_selectionStatements != null) {
+      return returnType != null;
+    }
+    return true;
+  }
+
+  @override
+  List<RefactoringMethodParameter> get parameters => _parameters;
+
+  @override
+  void set parameters(List<RefactoringMethodParameter> parameters) {
+    _parameters = parameters.toList();
+  }
+
+  @override
+  String get refactoringName {
+    AstNode node = new NodeLocator.con1(selectionOffset).searchWithin(unit);
+    if (node != null &&
+        node.getAncestor((node) => node is ClassDeclaration) != null) {
+      return 'Extract Method';
+    }
+    return 'Extract Function';
+  }
+
+  String get signature {
+    StringBuffer sb = new StringBuffer();
+    if (createGetter) {
+      sb.write('get ');
+      sb.write(name);
+    } else {
+      sb.write(name);
+      sb.write('(');
+      // add all parameters
+      bool firstParameter = true;
+      for (RefactoringMethodParameter parameter in _parameters) {
+        // may be comma
+        if (firstParameter) {
+          firstParameter = false;
+        } else {
+          sb.write(', ');
+        }
+        // type
+        {
+          String typeSource = parameter.type;
+          if ('dynamic' != typeSource && '' != typeSource) {
+            sb.write(typeSource);
+            sb.write(' ');
+          }
+        }
+        // name
+        sb.write(parameter.name);
+      }
+      sb.write(')');
+    }
+    // done
+    return sb.toString();
+  }
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    result.addStatus(validateMethodName(name));
+    result.addStatus(_checkParameterNames());
+    // TODO: implement checkFinalConditions
+    return _checkPossibleConflicts().then((status) {
+      result.addStatus(status);
+      return result;
+    });
+    return new Future.value(result);
+  }
+
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    // selection
+    result.addStatus(_checkSelection());
+    if (result.hasFatalError) {
+      return new Future.value(result);
+    }
+    // prepare parts
+    result.addStatus(_initializeParameters());
+    _initializeReturnType();
+    _initializeOccurrences();
+    _initializeGetter();
+    // closure cannot have parameters
+    if (_selectionFunctionExpression != null && !_parameters.isEmpty) {
+      String message = format(
+          'Cannot extract closure as method, it references {0} external variable(s).',
+          _parameters.length);
+      RefactoringStatus result = new RefactoringStatus.fatal(message);
+      return new Future.value(result);
+    }
+    return new Future.value(result);
+  }
+
+  @override
+  RefactoringStatus checkName() {
+    return validateMethodName(name);
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    // replace occurrences with method invocation
+    for (_Occurrence occurence in _occurrences) {
+      SourceRange range = occurence.range;
+      // may be replacement of duplicates disabled
+      if (!extractAll && !occurence.isSelection) {
+        continue;
+      }
+      // prepare invocation source
+      String invocationSource;
+      if (_selectionFunctionExpression != null) {
+        invocationSource = name;
+      } else {
+        StringBuffer sb = new StringBuffer();
+        // may be returns value
+        if (returnType != null) {
+          // single variable assignment / return statement
+          if (_returnVariableName != null) {
+            String occurrenceName =
+                occurence._parameterOldToOccurrenceName[_returnVariableName];
+            // may be declare variable
+            if (!_parametersMap.containsKey(_returnVariableName)) {
+              if (returnType.isEmpty) {
+                sb.write('var ');
+              } else {
+                sb.write(returnType);
+                sb.write(' ');
+              }
+            }
+            // assign the return value
+            sb.write(occurrenceName);
+            sb.write(' = ');
+          } else {
+            sb.write('return ');
+          }
+        }
+        // invocation itself
+        sb.write(name);
+        if (!createGetter) {
+          sb.write('(');
+          bool firstParameter = true;
+          for (RefactoringMethodParameter parameter in _parameters) {
+            // may be comma
+            if (firstParameter) {
+              firstParameter = false;
+            } else {
+              sb.write(', ');
+            }
+            // argument name
+            {
+              String argumentName =
+                  occurence._parameterOldToOccurrenceName[parameter.id];
+              sb.write(argumentName);
+            }
+          }
+          sb.write(')');
+        }
+        invocationSource = sb.toString();
+        // statements as extracted with their ";", so add new after invocation
+        if (_selectionStatements != null) {
+          invocationSource += ';';
+        }
+      }
+      // add replace edit
+      SourceEdit edit = new SourceEdit.range(range, invocationSource);
+      change.addEdit(file, edit);
+    }
+    // add method declaration
+    {
+      // prepare environment
+      String prefix = utils.getNodePrefix(_parentMember);
+      String eol = utils.endOfLine;
+      // prepare annotations
+      String annotations = '';
+      {
+        // may be "static"
+        if (_staticContext) {
+          annotations = 'static ';
+        }
+      }
+      // prepare declaration source
+      String declarationSource = null;
+      {
+        String returnExpressionSource = _getMethodBodySource();
+        // closure
+        if (_selectionFunctionExpression != null) {
+          declarationSource = '${name}${returnExpressionSource}';
+          if (_selectionFunctionExpression.body is ExpressionFunctionBody) {
+            declarationSource += ';';
+          }
+        }
+        // expression
+        if (_selectionExpression != null) {
+          // add return type
+          String returnTypeName =
+              utils.getExpressionTypeSource(_selectionExpression);
+          if (returnTypeName != null && returnTypeName != 'dynamic') {
+            annotations += '${returnTypeName} ';
+          }
+          // just return expression
+          declarationSource =
+              '${annotations}${signature} => ${returnExpressionSource};';
+        }
+        // statements
+        if (_selectionStatements != null) {
+          if (returnType != null) {
+            if (returnType.isNotEmpty) {
+              annotations += returnType + ' ';
+            }
+          } else {
+            annotations += 'void ';
+          }
+          declarationSource = '${annotations}${signature} {${eol}';
+          declarationSource += returnExpressionSource;
+          if (_returnVariableName != null) {
+            declarationSource +=
+                '${prefix}  return ${_returnVariableName};$eol';
+          }
+          declarationSource += '${prefix}}';
+        }
+      }
+      // insert declaration
+      if (declarationSource != null) {
+        int offset = _parentMember.end;
+        SourceEdit edit =
+            new SourceEdit(offset, 0, '${eol}${eol}${prefix}${declarationSource}');
+        change.addEdit(file, edit);
+      }
+    }
+    // done
+    return new Future.value(change);
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  /**
+   * Adds a new reference to the parameter with the given name.
+   */
+  void _addParameterReference(String name, SourceRange range) {
+    List<SourceRange> references = _parameterReferencesMap[name];
+    if (references == null) {
+      references = [];
+      _parameterReferencesMap[name] = references;
+    }
+    references.add(range);
+  }
+
+  RefactoringStatus _checkParameterNames() {
+    RefactoringStatus result = new RefactoringStatus();
+    for (RefactoringMethodParameter parameter in _parameters) {
+      result.addStatus(validateParameterName(parameter.name));
+      for (RefactoringMethodParameter other in _parameters) {
+        if (!identical(parameter, other) && other.name == parameter.name) {
+          result.addError(
+              format("Parameter '{0}' already exists", parameter.name));
+          return result;
+        }
+      }
+      if (_usedNames.contains(parameter.name)) {
+        result.addError(
+            format("'{0}' is already used as a name in the selected code", parameter.name));
+        return result;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Checks if created method will shadow or will be shadowed by other elements.
+   */
+  Future<RefactoringStatus> _checkPossibleConflicts() {
+    RefactoringStatus result = new RefactoringStatus();
+    AstNode parent = _parentMember.parent;
+    // top-level function
+    if (parent is CompilationUnit) {
+      LibraryElement libraryElement = parent.element.library;
+      return validateCreateFunction(searchEngine, libraryElement, name);
+    }
+    // method of class
+    if (parent is ClassDeclaration) {
+      ClassElement classElement = parent.element;
+      return validateCreateMethod(searchEngine, classElement, name);
+    }
+    // OK
+    return new Future.value(result);
+  }
+
+  /**
+   * Checks if [selectionRange] selects [Expression] which can be extracted, and
+   * location of this [DartExpression] in AST allows extracting.
+   */
+  RefactoringStatus _checkSelection() {
+    _ExtractMethodAnalyzer selectionAnalyzer =
+        new _ExtractMethodAnalyzer(unit, selectionRange);
+    unit.accept(selectionAnalyzer);
+    // may be fatal error
+    {
+      RefactoringStatus status = selectionAnalyzer.status;
+      if (status.hasFatalError) {
+        return status;
+      }
+    }
+    // check selected nodes
+    List<AstNode> selectedNodes = selectionAnalyzer.selectedNodes;
+    if (!selectedNodes.isEmpty) {
+      AstNode coveringNode = selectionAnalyzer.coveringNode;
+      _parentMember = getEnclosingClassOrUnitMember(coveringNode);
+      // single expression selected
+      if (selectedNodes.length == 1 &&
+          !utils.selectionIncludesNonWhitespaceOutsideNode(
+              selectionRange,
+              selectionAnalyzer.firstSelectedNode)) {
+        AstNode selectedNode = selectionAnalyzer.firstSelectedNode;
+        if (selectedNode is Expression) {
+          _selectionExpression = selectedNode;
+          // additional check for closure
+          if (_selectionExpression is FunctionExpression) {
+            _selectionFunctionExpression =
+                _selectionExpression as FunctionExpression;
+            _selectionExpression = null;
+          }
+          // OK
+          return new RefactoringStatus();
+        }
+      }
+      // statements selected
+      {
+        List<Statement> selectedStatements = [];
+        for (AstNode selectedNode in selectedNodes) {
+          if (selectedNode is Statement) {
+            selectedStatements.add(selectedNode);
+          }
+        }
+        if (selectedStatements.length == selectedNodes.length) {
+          _selectionStatements = selectedStatements;
+          return new RefactoringStatus();
+        }
+      }
+    }
+    // invalid selection
+    return new RefactoringStatus.fatal(
+        'Can only extract a single expression or a set of statements.');
+  }
+
+  /**
+   * @return the selected [DartExpression] source, with applying new parameter names.
+   */
+  String _getMethodBodySource() {
+    String source = utils.getRangeText(selectionRange);
+    // prepare operations to replace variables with parameters
+    List<SourceEdit> replaceEdits = [];
+    for (RefactoringMethodParameter parameter in _parametersMap.values) {
+      List<SourceRange> ranges = _parameterReferencesMap[parameter.id];
+      if (ranges != null) {
+        for (SourceRange range in ranges) {
+          replaceEdits.add(
+              new SourceEdit(
+                  range.offset - selectionRange.offset,
+                  range.length,
+                  parameter.name));
+        }
+      }
+    }
+    replaceEdits.sort((a, b) => b.offset - a.offset);
+    // apply replacements
+    source = SourceEdit.applySequence(source, replaceEdits);
+    // change indentation
+    if (_selectionFunctionExpression != null) {
+      AstNode baseNode =
+          _selectionFunctionExpression.getAncestor((node) => node is Statement);
+      if (baseNode != null) {
+        String baseIndent = utils.getNodePrefix(baseNode);
+        String targetIndent = utils.getNodePrefix(_parentMember);
+        source = utils.replaceSourceIndent(source, baseIndent, targetIndent);
+        source = source.trim();
+      }
+    }
+    if (_selectionStatements != null) {
+      String selectionIndent = utils.getNodePrefix(_selectionStatements[0]);
+      String targetIndent = utils.getNodePrefix(_parentMember) + '  ';
+      source = utils.replaceSourceIndent(source, selectionIndent, targetIndent);
+    }
+    // done
+    return source;
+  }
+
+  _SourcePattern _getSourcePattern(SourceRange range) {
+    String originalSource = utils.getText(range.offset, range.length);
+    _SourcePattern pattern = new _SourcePattern();
+    List<SourceEdit> replaceEdits = <SourceEdit>[];
+    unit.accept(new _GetSourcePatternVisitor(range, pattern, replaceEdits));
+    replaceEdits = replaceEdits.reversed.toList();
+    pattern.patternSource =
+        SourceEdit.applySequence(originalSource, replaceEdits);
+    return pattern;
+  }
+
+  /**
+   * Initializes [createGetter] flag.
+   */
+  void _initializeGetter() {
+    createGetter = false;
+    // maybe we cannot at all
+    if (!canCreateGetter) {
+      return;
+    }
+    // OK, just expression
+    if (_selectionExpression != null) {
+      createGetter = !_hasMethodInvocation(_selectionExpression);
+      return;
+    }
+    // allow code blocks without cycles
+    if (_selectionStatements != null) {
+      createGetter = true;
+      for (Statement statement in _selectionStatements) {
+        // method invocation is something heavy,
+        // so we don't want to extract it as a part of a getter
+        if (_hasMethodInvocation(statement)) {
+          createGetter = false;
+          return;
+        }
+        // don't allow cycles
+        statement.accept(new _ResetCanCreateGetterVisitor(this));
+      }
+    }
+  }
+
+  /**
+   * Fills [_occurrences] field.
+   */
+  void _initializeOccurrences() {
+    _occurrences.clear();
+    // prepare selection
+    _SourcePattern selectionPattern = _getSourcePattern(selectionRange);
+    String selectionSource =
+        _getNormalizedSource(selectionPattern.patternSource);
+    Map<String, String> patternToSelectionName =
+        _inverseMap(selectionPattern.originalToPatternNames);
+    // prepare an enclosing parent - class or unit
+    AstNode enclosingMemberParent = _parentMember.parent;
+    // visit nodes which will able to access extracted method
+    enclosingMemberParent.accept(
+        new _InitializeOccurrencesVisitor(
+            this,
+            selectionSource,
+            patternToSelectionName));
+  }
+
+  /**
+   * Prepares information about used variables, which should be turned into
+   * parameters.
+   */
+  RefactoringStatus _initializeParameters() {
+    _parameters.clear();
+    _parametersMap.clear();
+    _parameterReferencesMap.clear();
+    RefactoringStatus result = new RefactoringStatus();
+    List<VariableElement> assignedUsedVariables = [];
+    unit.accept(new _InitializeParametersVisitor(this, assignedUsedVariables));
+    // may be ends with "return" statement
+    if (_selectionStatements != null) {
+      Statement lastStatement =
+          _selectionStatements[_selectionStatements.length - 1];
+      if (lastStatement is ReturnStatement) {
+        Expression expression = lastStatement.expression;
+        if (expression != null) {
+          _returnType = expression.bestType;
+        }
+      }
+    }
+    // may be single variable to return
+    if (assignedUsedVariables.length == 1) {
+      // we cannot both return variable and have explicit return statement
+      if (_returnType != null) {
+        result.addFatalError(
+            'Ambiguous return value: Selected block contains assignment(s) to '
+                'local variables and return statement.');
+        return result;
+      }
+      // prepare to return an assigned variable
+      VariableElement returnVariable = assignedUsedVariables[0];
+      _returnType = returnVariable.type;
+      _returnVariableName = returnVariable.displayName;
+    }
+    // fatal, if multiple variables assigned and used after selection
+    if (assignedUsedVariables.length > 1) {
+      StringBuffer sb = new StringBuffer();
+      for (VariableElement variable in assignedUsedVariables) {
+        sb.write(variable.displayName);
+        sb.write('\n');
+      }
+      result.addFatalError(
+          format(
+              'Ambiguous return value: Selected block contains more than one '
+                  'assignment to local variables. Affected variables are:\n\n{0}',
+              sb.toString().trim()));
+    }
+    // done
+    return result;
+  }
+
+  void _initializeReturnType() {
+    if (_returnType == null) {
+      returnType = null;
+    } else {
+      returnType = utils.getTypeSource(_returnType);
+      if (returnType == 'dynamic') {
+        returnType = '';
+      }
+    }
+  }
+
+  /**
+   * Checks if the given [VariableElement] is declared in [selectionRange].
+   */
+  bool _isDeclaredInSelection(VariableElement element) {
+    return selectionRange.contains(element.nameOffset);
+  }
+
+  /**
+   * Checks if it is OK to extract the node with the given [SourceRange].
+   */
+  bool _isExtractable(SourceRange range) {
+    _ExtractMethodAnalyzer analyzer = new _ExtractMethodAnalyzer(unit, range);
+    utils.unit.accept(analyzer);
+    return analyzer.status.isOK;
+  }
+
+  /**
+   * Checks if [element] is referenced after [selectionRange].
+   */
+  bool _isUsedAfterSelection(VariableElement element) {
+    var visitor = new _IsUsedAfterSelectionVisitor(this, element);
+    _parentMember.accept(visitor);
+    return visitor.result;
+  }
+
+  /**
+   * Checks if [node] has a [MethodInvocation].
+   */
+  static bool _hasMethodInvocation(AstNode node) {
+    var visitor = new _HasMethodInvocationVisitor();
+    node.accept(visitor);
+    return visitor.result;
+  }
+}
+
+
+/**
+ * [SelectionAnalyzer] for [ExtractMethodRefactoringImpl].
+ */
+class _ExtractMethodAnalyzer extends StatementAnalyzer {
+  _ExtractMethodAnalyzer(CompilationUnit unit, SourceRange selection)
+      : super(unit, selection);
+
+  @override
+  void handleNextSelectedNode(AstNode node) {
+    super.handleNextSelectedNode(node);
+    _checkParent(node);
+  }
+
+  @override
+  void handleSelectionEndsIn(AstNode node) {
+    super.handleSelectionEndsIn(node);
+    invalidSelection(
+        'The selection does not cover a set of statements or an expression. '
+            'Extend selection to a valid range.');
+  }
+
+  @override
+  Object visitAssignmentExpression(AssignmentExpression node) {
+    super.visitAssignmentExpression(node);
+    Expression lhs = node.leftHandSide;
+    if (_isFirstSelectedNode(lhs)) {
+      invalidSelection(
+          'Cannot extract the left-hand side of an assignment.',
+          new Location.fromNode(lhs));
+    }
+    return null;
+  }
+
+  @override
+  Object visitConstructorInitializer(ConstructorInitializer node) {
+    super.visitConstructorInitializer(node);
+    if (_isFirstSelectedNode(node)) {
+      invalidSelection(
+          'Cannot extract a constructor initializer. '
+              'Select expression part of initializer.',
+          new Location.fromNode(node));
+    }
+    return null;
+  }
+
+  @override
+  Object visitForStatement(ForStatement node) {
+    super.visitForStatement(node);
+    if (identical(node.variables, firstSelectedNode)) {
+      invalidSelection(
+          "Cannot extract initialization part of a 'for' statement.");
+    } else if (node.updaters.contains(lastSelectedNode)) {
+      invalidSelection("Cannot extract increment part of a 'for' statement.");
+    }
+    return null;
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    super.visitSimpleIdentifier(node);
+    if (_isFirstSelectedNode(node)) {
+      // name of declaration
+      if (node.inDeclarationContext()) {
+        invalidSelection('Cannot extract the name part of a declaration.');
+      }
+      // method name
+      Element element = node.bestElement;
+      if (element is FunctionElement || element is MethodElement) {
+        invalidSelection('Cannot extract a single method name.');
+      }
+      // name in property access
+      if (node.parent is PrefixedIdentifier &&
+          (node.parent as PrefixedIdentifier).identifier == node) {
+        invalidSelection('Can not extract name part of a property access.');
+      }
+    }
+    return null;
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    super.visitTypeName(node);
+    if (_isFirstSelectedNode(node)) {
+      invalidSelection('Cannot extract a single type reference.');
+    }
+    return null;
+  }
+
+  @override
+  Object visitVariableDeclaration(VariableDeclaration node) {
+    super.visitVariableDeclaration(node);
+    if (_isFirstSelectedNode(node)) {
+      invalidSelection(
+          'Cannot extract a variable declaration fragment. '
+              'Select whole declaration statement.',
+          new Location.fromNode(node));
+    }
+    return null;
+  }
+
+  void _checkParent(AstNode node) {
+    AstNode firstParent = firstSelectedNode.parent;
+    do {
+      node = node.parent;
+      if (identical(node, firstParent)) {
+        return;
+      }
+    } while (node != null);
+    invalidSelection(
+        'Not all selected statements are enclosed by the same parent statement.');
+  }
+
+  bool _isFirstSelectedNode(AstNode node) => identical(firstSelectedNode, node);
+}
+
+
+class _GetSourcePatternVisitor extends GeneralizingAstVisitor {
+  final SourceRange partRange;
+  final _SourcePattern pattern;
+  final List<SourceEdit> replaceEdits;
+
+  _GetSourcePatternVisitor(this.partRange, this.pattern, this.replaceEdits);
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    SourceRange nodeRange = rangeNode(node);
+    if (partRange.covers(nodeRange)) {
+      VariableElement variableElement =
+          getLocalOrParameterVariableElement(node);
+      if (variableElement != null) {
+        // name of a named expression
+        if (isNamedExpressionName(node)) {
+          return;
+        }
+        // continue
+        String originalName = variableElement.displayName;
+        String patternName = pattern.originalToPatternNames[originalName];
+        if (patternName == null) {
+          patternName = '__refVar${pattern.originalToPatternNames.length}';
+          pattern.originalToPatternNames[originalName] = patternName;
+        }
+        replaceEdits.add(
+            new SourceEdit(
+                nodeRange.offset - partRange.offset,
+                nodeRange.length,
+                patternName));
+      }
+    }
+  }
+}
+
+
+
+class _HasMethodInvocationVisitor extends RecursiveAstVisitor {
+  bool result = false;
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    result = true;
+  }
+}
+
+
+class _InitializeOccurrencesVisitor extends GeneralizingAstVisitor<Object> {
+  final ExtractMethodRefactoringImpl ref;
+  final String selectionSource;
+  final Map<String, String> patternToSelectionName;
+
+  bool forceStatic = false;
+
+  _InitializeOccurrencesVisitor(this.ref, this.selectionSource,
+      this.patternToSelectionName);
+
+  @override
+  Object visitBlock(Block node) {
+    if (ref._selectionStatements != null) {
+      _visitStatements(node.statements);
+    }
+    return super.visitBlock(node);
+  }
+
+  @override
+  Object visitConstructorInitializer(ConstructorInitializer node) {
+    forceStatic = true;
+    try {
+      return super.visitConstructorInitializer(node);
+    } finally {
+      forceStatic = false;
+    }
+  }
+
+  @override
+  Object visitExpression(Expression node) {
+    if (ref._selectionFunctionExpression != null ||
+        ref._selectionExpression != null &&
+            node.runtimeType == ref._selectionExpression.runtimeType) {
+      SourceRange nodeRange = rangeNode(node);
+      _tryToFindOccurrence(nodeRange);
+    }
+    return super.visitExpression(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    forceStatic = node.isStatic;
+    try {
+      return super.visitMethodDeclaration(node);
+    } finally {
+      forceStatic = false;
+    }
+  }
+
+  @override
+  Object visitSwitchMember(SwitchMember node) {
+    if (ref._selectionStatements != null) {
+      _visitStatements(node.statements);
+    }
+    return super.visitSwitchMember(node);
+  }
+
+  /**
+   * Checks if given [SourceRange] matched selection source and adds [_Occurrence].
+   */
+  bool _tryToFindOccurrence(SourceRange nodeRange) {
+    // check if can be extracted
+    if (!ref._isExtractable(nodeRange)) {
+      return false;
+    }
+    // prepare normalized node source
+    _SourcePattern nodePattern = ref._getSourcePattern(nodeRange);
+    String nodeSource = _getNormalizedSource(nodePattern.patternSource);
+    // if matches normalized node source, then add as occurrence
+    if (nodeSource == selectionSource) {
+      _Occurrence occurrence =
+          new _Occurrence(nodeRange, ref.selectionRange.intersects(nodeRange));
+      ref._occurrences.add(occurrence);
+      // prepare mapping of parameter names to the occurrence variables
+      for (MapEntry<String, String> entry in getMapEntrySet(
+          nodePattern.originalToPatternNames)) {
+        String patternName = entry.getValue();
+        String originalName = entry.getKey();
+        String selectionName = patternToSelectionName[patternName];
+        occurrence._parameterOldToOccurrenceName[selectionName] = originalName;
+      }
+      // update static
+      if (forceStatic) {
+        ref._staticContext = true;
+      }
+      // we have match
+      return true;
+    }
+    // no match
+    return false;
+  }
+
+  void _visitStatements(List<Statement> statements) {
+    int beginStatementIndex = 0;
+    int selectionCount = ref._selectionStatements.length;
+    while (beginStatementIndex + selectionCount <= statements.length) {
+      SourceRange nodeRange = rangeStartEnd(
+          statements[beginStatementIndex],
+          statements[beginStatementIndex + selectionCount - 1]);
+      bool found = _tryToFindOccurrence(nodeRange);
+      // next statement
+      if (found) {
+        beginStatementIndex += selectionCount;
+      } else {
+        beginStatementIndex++;
+      }
+    }
+  }
+}
+
+
+class _InitializeParametersVisitor extends GeneralizingAstVisitor<Object> {
+  final ExtractMethodRefactoringImpl ref;
+  final List<VariableElement> assignedUsedVariables;
+
+  _InitializeParametersVisitor(this.ref, this.assignedUsedVariables);
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    SourceRange nodeRange = rangeNode(node);
+    if (ref.selectionRange.covers(nodeRange)) {
+      // analyze local variable
+      VariableElement variableElement =
+          getLocalOrParameterVariableElement(node);
+      if (variableElement != null) {
+        // name of the named expression
+        if (isNamedExpressionName(node)) {
+          return null;
+        }
+        // if declared outside, add parameter
+        if (!ref._isDeclaredInSelection(variableElement)) {
+          String variableName = variableElement.displayName;
+          // add parameter
+          RefactoringMethodParameter parameter =
+              ref._parametersMap[variableName];
+          if (parameter == null) {
+            DartType parameterType = node.bestType;
+            String parameterTypeName = ref.utils.getTypeSource(parameterType);
+            parameter = new RefactoringMethodParameter(
+                RefactoringMethodParameterKind.REQUIRED,
+                parameterTypeName,
+                variableName,
+                id: variableName);
+            ref._parameters.add(parameter);
+            ref._parametersMap[variableName] = parameter;
+          }
+          // add reference to parameter
+          ref._addParameterReference(variableName, nodeRange);
+        }
+        // remember, if assigned and used after selection
+        if (isLeftHandOfAssignment(node) &&
+            ref._isUsedAfterSelection(variableElement)) {
+          if (!assignedUsedVariables.contains(variableElement)) {
+            assignedUsedVariables.add(variableElement);
+          }
+        }
+      }
+      // remember declaration names
+      if (node.inDeclarationContext()) {
+        ref._usedNames.add(node.name);
+      }
+    }
+    return null;
+  }
+}
+
+class _IsUsedAfterSelectionVisitor extends GeneralizingAstVisitor {
+  final ExtractMethodRefactoringImpl ref;
+  final VariableElement element;
+  bool result = false;
+
+  _IsUsedAfterSelectionVisitor(this.ref, this.element);
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    VariableElement nodeElement = getLocalVariableElement(node);
+    if (identical(nodeElement, element)) {
+      int nodeOffset = node.offset;
+      if (nodeOffset > ref.selectionRange.end) {
+        result = true;
+      }
+    }
+  }
+}
+
+
+/**
+ * Description of a single occurrence of the selected expression or set of
+ * statements.
+ */
+class _Occurrence {
+  final SourceRange range;
+  final bool isSelection;
+
+  Map<String, String> _parameterOldToOccurrenceName = <String, String>{};
+
+  _Occurrence(this.range, this.isSelection);
+}
+
+
+class _ResetCanCreateGetterVisitor extends RecursiveAstVisitor {
+  final ExtractMethodRefactoringImpl ref;
+
+  _ResetCanCreateGetterVisitor(this.ref);
+
+  @override
+  visitDoStatement(DoStatement node) {
+    ref.createGetter = false;
+    super.visitDoStatement(node);
+  }
+
+  @override
+  visitForEachStatement(ForEachStatement node) {
+    ref.createGetter = false;
+    super.visitForEachStatement(node);
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    ref.createGetter = false;
+    super.visitForStatement(node);
+  }
+
+  @override
+  visitWhileStatement(WhileStatement node) {
+    ref.createGetter = false;
+    super.visitWhileStatement(node);
+  }
+}
+
+
+/**
+ * Generalized version of some source, in which references to the specific
+ * variables are replaced with pattern variables, with back mapping from the
+ * pattern to the original variable names.
+ */
+class _SourcePattern {
+  String patternSource;
+  Map<String, String> originalToPatternNames = {};
+}
diff --git a/pkg/analysis_services/lib/src/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
similarity index 93%
rename from pkg/analysis_services/lib/src/refactoring/naming_conventions.dart
rename to pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index b65ecf6..2e815fa 100644
--- a/pkg/analysis_services/lib/src/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -4,8 +4,8 @@
 
 library services.src.refactoring.naming_conventions;
 
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/src/correction/strings.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
 
 
 /**
@@ -27,7 +27,7 @@
 RefactoringStatus validateConstantName(String name) {
   // null
   if (name == null) {
-    return new RefactoringStatus.error("Constant name must not be null.");
+    return new RefactoringStatus.fatal("Constant name must not be null.");
   }
   // is not identifier
   RefactoringStatus status =
@@ -117,11 +117,11 @@
 RefactoringStatus validateLibraryName(String name) {
   // null
   if (name == null) {
-    return new RefactoringStatus.error("Library name must not be null.");
+    return new RefactoringStatus.fatal("Library name must not be null.");
   }
   // blank
   if (isBlank(name)) {
-    return new RefactoringStatus.error("Library name must not be blank.");
+    return new RefactoringStatus.fatal("Library name must not be blank.");
   }
   // check identifiers
   List<String> identifiers = name.split('.');
@@ -190,7 +190,7 @@
   int length = identifier.length;
   if (length == 0) {
     String message = "$desc must not be empty.";
-    return new RefactoringStatus.error(message);
+    return new RefactoringStatus.fatal(message);
   }
   int currentChar = identifier.codeUnitAt(0);
   if (!isLetter(currentChar) &&
@@ -220,7 +220,7 @@
   // null
   if (identifier == null) {
     String message = "$desc must not be null.";
-    return new RefactoringStatus.error(message);
+    return new RefactoringStatus.fatal(message);
   }
   // is not identifier
   RefactoringStatus status =
@@ -253,7 +253,7 @@
   // null
   if (identifier == null) {
     String message = "$desc must not be null.";
-    return new RefactoringStatus.error(message);
+    return new RefactoringStatus.fatal(message);
   }
   // is not identifier
   RefactoringStatus status =
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
new file mode 100644
index 0000000..cae43c5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -0,0 +1,287 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.refactoring;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' show
+    RefactoringMethodParameter, SourceChange;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/extract_local.dart';
+import 'package:analysis_server/src/services/refactoring/extract_method.dart';
+import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
+import 'package:analysis_server/src/services/refactoring/rename_constructor.dart';
+import 'package:analysis_server/src/services/refactoring/rename_import.dart';
+import 'package:analysis_server/src/services/refactoring/rename_library.dart';
+import 'package:analysis_server/src/services/refactoring/rename_local.dart';
+import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+
+/**
+ * [Refactoring] to extract an expression into a local variable declaration.
+ */
+abstract class ExtractLocalRefactoring implements Refactoring {
+  /**
+   * Returns a new [ExtractLocalRefactoring] instance.
+   */
+  factory ExtractLocalRefactoring(CompilationUnit unit, int selectionOffset,
+      int selectionLength) {
+    return new ExtractLocalRefactoringImpl(
+        unit,
+        selectionOffset,
+        selectionLength);
+  }
+
+  /**
+   * True if all occurrences of the expression within the scope in which the
+   * variable will be defined should be replaced by a reference to the local
+   * variable. The expression used to initiate the refactoring will always be
+   * replaced.
+   */
+  void set extractAll(bool extractAll);
+
+  /**
+   * The lengths of the expressions that would be replaced by a reference to the
+   * variable. The lengths correspond to the offsets. In other words, for a
+   * given expression, if the offset of that expression is offsets[i], then the
+   * length of that expression is lengths[i].
+   */
+  List<int> get lengths;
+
+  /**
+   * The name that the local variable should be given.
+   */
+  void set name(String name);
+
+  /**
+   * The proposed names for the local variable.
+   *
+   * The first proposal should be used as the "best guess" (if it exists).
+   */
+  List<String> get names;
+
+  /**
+   * The offsets of the expressions that would be replaced by a reference to
+   * the variable.
+   */
+  List<int> get offsets;
+
+  /**
+   * Validates that the [name] is a valid identifier and is appropriate for
+   * local variable.
+   *
+   * It does not perform all the checks (such as checking for conflicts with any
+   * existing names in any of the scopes containing the current name), as many
+   * of these checkes require search engine. Use [checkFinalConditions] for this
+   * level of checking.
+   */
+  RefactoringStatus checkName();
+}
+
+
+/**
+ * [Refactoring] to extract an [Expression] or [Statement]s into a new method.
+ */
+abstract class ExtractMethodRefactoring implements Refactoring {
+  /**
+   * Returns a new [ExtractMethodRefactoring] instance.
+   */
+  factory ExtractMethodRefactoring(SearchEngine searchEngine,
+      CompilationUnit unit, int selectionOffset, int selectionLength) {
+    return new ExtractMethodRefactoringImpl(
+        searchEngine,
+        unit,
+        selectionOffset,
+        selectionLength);
+  }
+
+  /**
+   * True if a getter could be created rather than a method.
+   */
+  bool get canCreateGetter;
+
+  /**
+   * True if a getter should be created rather than a method.
+   */
+  void set createGetter(bool createGetter);
+
+  /**
+   * True if all occurrences of the expression or statements should be replaced
+   * by an invocation of the method. The expression or statements used to
+   * initiate the refactoring will always be replaced.
+   */
+  void set extractAll(bool extractAll);
+
+  /**
+   * The lengths of the expressions or statements that would be replaced by an
+   * invocation of the method. The lengths correspond to the offsets.
+   * In other words, for a given expression (or block of statements), if the
+   * offset of that expression is offsets[i], then the length of that expression
+   * is lengths[i].
+   */
+  List<int> get lengths;
+
+  /**
+   * The name that the method should be given.
+   */
+  void set name(String name);
+
+  /**
+   * The proposed names for the method.
+   *
+   * The first proposal should be used as the "best guess" (if it exists).
+   */
+  List<String> get names;
+
+  /**
+   * The offsets of the expressions or statements that would be replaced by an
+   * invocation of the method.
+   */
+  List<int> get offsets;
+
+  /**
+   * The proposed parameters for the method.
+   */
+  List<RefactoringMethodParameter> get parameters;
+
+  /**
+   * The parameters that should be defined for the method.
+   */
+  void set parameters(List<RefactoringMethodParameter> parameters);
+
+  /**
+   * The proposed return type for the method.
+   */
+  String get returnType;
+
+  /**
+   * The return type that should be defined for the method.
+   */
+  void set returnType(String returnType);
+
+  /**
+   * Validates that the [name] is a valid identifier and is appropriate for a
+   * method.
+   *
+   * It does not perform all the checks (such as checking for conflicts with any
+   * existing names in any of the scopes containing the current name), as many
+   * of these checkes require search engine. Use [checkFinalConditions] for this
+   * level of checking.
+   */
+  RefactoringStatus checkName();
+}
+
+
+/**
+ * Abstract interface for all refactorings.
+ */
+abstract class Refactoring {
+  /**
+   * The ids of source edits that are not known to be valid.
+   *
+   * An edit is not known to be valid if there was insufficient type information
+   * for the server to be able to determine whether or not the code needs to be
+   * modified, such as when a member is being renamed and there is a reference
+   * to a member from an unknown type. This field will be omitted if the change
+   * field is omitted or if there are no potential edits for the refactoring.
+   */
+  List<String> get potentialEditIds;
+
+  /**
+   * Returns the human readable name of this [Refactoring].
+   */
+  String get refactoringName;
+
+  /**
+   * Checks all conditions - [checkInitialConditions] and
+   * [checkFinalConditions] to decide if refactoring can be performed.
+   */
+  Future<RefactoringStatus> checkAllConditions();
+
+  /**
+   * Validates environment to check if this refactoring can be performed.
+   *
+   * This check may be slow, because many refactorings use search engine.
+   */
+  Future<RefactoringStatus> checkFinalConditions();
+
+  /**
+   * Validates arguments to check if this refactoring can be performed.
+   *
+   * This check should be quick because it is used often as arguments change.
+   */
+  Future<RefactoringStatus> checkInitialConditions();
+
+  /**
+   * Returns the [Change] to apply to perform this refactoring.
+   */
+  Future<SourceChange> createChange();
+
+  /**
+   * Returs `true` if the [Change] created by refactoring may be unsafe,
+   * so we want user to review the [Change] to ensure that he understands it.
+   */
+  bool requiresPreview();
+}
+
+
+/**
+ * Abstract [Refactoring] for renaming some [Element].
+ */
+abstract class RenameRefactoring implements Refactoring {
+  /**
+   * Returns a new [RenameRefactoring] instance for renaming [element],
+   * maybe `null` if there is no support for renaming [Element]s of the given
+   * type.
+   */
+  factory RenameRefactoring(SearchEngine searchEngine, Element element) {
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element.enclosingElement is CompilationUnitElement) {
+      return new RenameUnitMemberRefactoringImpl(searchEngine, element);
+    }
+    if (element is ConstructorElement) {
+      return new RenameConstructorRefactoringImpl(searchEngine, element);
+    }
+    if (element is ImportElement) {
+      return new RenameImportRefactoringImpl(searchEngine, element);
+    }
+    if (element is LibraryElement) {
+      return new RenameLibraryRefactoringImpl(searchEngine, element);
+    }
+    if (element is LocalElement) {
+      return new RenameLocalRefactoringImpl(searchEngine, element);
+    }
+    if (element.enclosingElement is ClassElement) {
+      return new RenameClassMemberRefactoringImpl(searchEngine, element);
+    }
+    return null;
+  }
+
+  /**
+   * Sets the new name for the [Element].
+   */
+  void set newName(String newName);
+
+  /**
+   * Returns the old name of the [Element] being renamed.
+   */
+  String get oldName;
+
+  /**
+   * Validates that the [newName] is a valid identifier and is appropriate for
+   * the type of the [Element] being renamed.
+   *
+   * It does not perform all the checks (such as checking for conflicts with any
+   * existing names in any of the scopes containing the current name), as many
+   * of these checkes require search engine. Use [checkFinalConditions] for this
+   * level of checking.
+   */
+  RefactoringStatus checkNewName();
+}
diff --git a/pkg/analysis_services/lib/src/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
similarity index 79%
rename from pkg/analysis_services/lib/src/refactoring/refactoring.dart
rename to pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index 4ef7137..3276418 100644
--- a/pkg/analysis_services/lib/src/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -6,14 +6,16 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 
 
 /**
  * Abstract implementation of [Refactoring].
  */
 abstract class RefactoringImpl implements Refactoring {
+  final List<String> potentialEditIds = <String>[];
+
   @override
   Future<RefactoringStatus> checkAllConditions() {
     RefactoringStatus result = new RefactoringStatus();
diff --git a/pkg/analysis_services/lib/src/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
similarity index 82%
rename from pkg/analysis_services/lib/src/refactoring/rename.dart
rename to pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 48f8db6..f8d6e14 100644
--- a/pkg/analysis_services/lib/src/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -7,12 +7,12 @@
 import 'dart:async';
 import 'dart:collection';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_services/src/refactoring/refactoring.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -21,8 +21,9 @@
 /**
  * Returns the [Edit] to replace the given [SearchMatch] reference.
  */
-Edit createReferenceEdit(SourceReference reference, String newText) {
-  return new Edit.range(reference.range, newText);
+SourceEdit createReferenceEdit(SourceReference reference, String newText,
+    {String id}) {
+  return new SourceEdit.range(reference.range, newText, id: id);
 }
 
 
@@ -43,10 +44,10 @@
   var uniqueReferences = new HashMap<SourceReference, SourceReference>();
   for (SearchMatch match in matches) {
     Element element = match.element;
-    MatchKind kind = match.kind;
     String file = getElementFile(element);
     SourceRange range = match.sourceRange;
-    SourceReference newReference = new SourceReference(kind, file, range);
+    SourceReference newReference =
+        new SourceReference(file, range, element, match.isResolved, match.isQualified);
     SourceReference oldReference = uniqueReferences[newReference];
     if (oldReference == null) {
       uniqueReferences[newReference] = newReference;
@@ -165,17 +166,19 @@
   /**
    * Adds the "Update declaration" [Edit] to [change].
    */
-  void addDeclarationEdit(Change change, Element element) {
-    String file = getElementFile(element);
-    Edit edit = new Edit.range(rangeElementName(element), newName);
-    change.addEdit(file, edit);
+  void addDeclarationEdit(SourceChange change, Element element) {
+    if (element != null) {
+      String file = getElementFile(element);
+      SourceEdit edit = new SourceEdit.range(rangeElementName(element), newName);
+      change.addEdit(file, edit);
+    }
   }
 
   /**
    * Adds an "Update reference" [Edit] to [change].
    */
-  void addReferenceEdit(Change change, SourceReference reference) {
-    Edit edit = createReferenceEdit(reference, newName);
+  void addReferenceEdit(SourceChange change, SourceReference reference) {
+    SourceEdit edit = createReferenceEdit(reference, newName);
     change.addEdit(reference.file, edit);
   }
 
@@ -216,11 +219,14 @@
  * The [SourceRange] in some [Source].
  */
 class SourceReference {
-  final MatchKind kind;
   final String file;
   final SourceRange range;
+  final Element element;
+  final bool isResolved;
+  final bool isQualified;
 
-  SourceReference(this.kind, this.file, this.range);
+  SourceReference(this.file, this.range, this.element, this.isResolved,
+      this.isQualified);
 
   @override
   int get hashCode {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
new file mode 100644
index 0000000..a2a143d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -0,0 +1,265 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.rename_class_member;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+
+
+/**
+ * Checks if creating a method with the given [name] in [classElement] will
+ * cause any conflicts.
+ */
+Future<RefactoringStatus> validateCreateMethod(SearchEngine searchEngine,
+    ClassElement classElement, String name) {
+  return new _ClassMemberValidator.forCreate(
+      searchEngine,
+      classElement,
+      name).validate();
+}
+
+
+/**
+ * A [Refactoring] for renaming class member [Element]s.
+ */
+class RenameClassMemberRefactoringImpl extends RenameRefactoringImpl {
+  _ClassMemberValidator _validator;
+
+  RenameClassMemberRefactoringImpl(SearchEngine searchEngine, Element element)
+      : super(searchEngine, element);
+
+  @override
+  String get refactoringName {
+    if (element is TypeParameterElement) {
+      return "Rename Type Parameter";
+    }
+    if (element is FieldElement) {
+      return "Rename Field";
+    }
+    return "Rename Method";
+  }
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    _validator =
+        new _ClassMemberValidator.forRename(searchEngine, element, newName);
+    return _validator.validate();
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    if (element is MethodElement && (element as MethodElement).isOperator) {
+      result.addFatalError('Cannot rename operator.');
+    }
+    return new Future.value(result);
+  }
+
+  @override
+  RefactoringStatus checkNewName() {
+    RefactoringStatus result = super.checkNewName();
+    if (element is FieldElement) {
+      FieldElement fieldElement = element as FieldElement;
+      if (fieldElement.isStatic && fieldElement.isConst) {
+        result.addStatus(validateConstantName(newName));
+      } else {
+        result.addStatus(validateFieldName(newName));
+      }
+    }
+    if (element is MethodElement) {
+      result.addStatus(validateMethodName(newName));
+    }
+    return result;
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    // update declarations
+    for (Element renameElement in _validator.elements) {
+      if (renameElement.isSynthetic && renameElement is FieldElement) {
+        addDeclarationEdit(change, renameElement.getter);
+        addDeclarationEdit(change, renameElement.setter);
+      } else {
+        addDeclarationEdit(change, renameElement);
+      }
+    }
+    // update references
+    List<SourceReference> references =
+        getSourceReferences(_validator.references);
+    for (SourceReference reference in references) {
+      addReferenceEdit(change, reference);
+    }
+    // potential matches
+    return searchEngine.searchMemberReferences(oldName).then((nameMatches) {
+      List<SourceReference> nameRefs = getSourceReferences(nameMatches);
+      for (SourceReference reference in nameRefs) {
+        // ignore resolved reference, we have already updated it
+        if (reference.isResolved) {
+          continue;
+        }
+        // check the element being renamed is accessible
+        {
+          LibraryElement whereLibrary = reference.element.library;
+          if (!element.isAccessibleIn(whereLibrary)) {
+            continue;
+          }
+        }
+        // add edit
+        SourceEdit edit =
+            createReferenceEdit(reference, newName, id: _newPotentialId());
+        change.addEdit(reference.file, edit);
+      }
+    }).then((_) => change);
+  }
+
+  String _newPotentialId() {
+    String id = potentialEditIds.length.toString();
+    potentialEditIds.add(id);
+    return id;
+  }
+}
+
+
+/**
+ * Helper to check if the created or renamed [Element] will cause any conflicts.
+ */
+class _ClassMemberValidator {
+  final SearchEngine searchEngine;
+  final Element element;
+  final ClassElement elementClass;
+  final ElementKind elementKind;
+  final String name;
+  final bool isRename;
+
+  Set<Element> elements = new Set<Element>();
+  List<SearchMatch> references = <SearchMatch>[];
+
+  _ClassMemberValidator.forCreate(this.searchEngine, this.elementClass,
+      this.name)
+      : isRename = false,
+        element = null,
+        elementKind = ElementKind.METHOD;
+
+  _ClassMemberValidator.forRename(this.searchEngine, Element element, this.name)
+      : isRename = true,
+        element = element,
+        elementClass = element.enclosingElement,
+        elementKind = element.kind;
+
+  Future<RefactoringStatus> validate() {
+    RefactoringStatus result = new RefactoringStatus();
+    // check if there is a member with "newName" in the same ClassElement
+    for (Element newNameMember in getChildren(elementClass, name)) {
+      result.addError(
+          format(
+              "Class '{0}' already declares {1} with name '{2}'.",
+              elementClass.displayName,
+              getElementKindName(newNameMember),
+              name),
+          new Location.fromElement(newNameMember));
+    }
+    // do chained computations
+    Set<ClassElement> superClasses = getSuperClasses(elementClass);
+    Set<ClassElement> subClasses;
+    return _prepareReferences().then((_) {
+      return getSubClasses(searchEngine, elementClass).then((_subs) {
+        subClasses = _subs;
+      });
+    }).then((_) {
+      // check shadowing in hierarchy
+      return searchEngine.searchElementDeclarations(name).then((decls) {
+        for (SearchMatch decl in decls) {
+          Element nameElement = getSyntheticAccessorVariable(decl.element);
+          Element nameClass = nameElement.enclosingElement;
+          // renamed Element shadows member of superclass
+          if (superClasses.contains(nameClass)) {
+            result.addError(
+                format(
+                    isRename ?
+                        "Renamed {0} will shadow {1} '{2}'." :
+                        "Created {0} will shadow {1} '{2}'.",
+                    elementKind.displayName,
+                    getElementKindName(nameElement),
+                    getElementQualifiedName(nameElement)),
+                new Location.fromElement(nameElement));
+          }
+          // renamed Element is shadowed by member of subclass
+          if (isRename && subClasses.contains(nameClass)) {
+            result.addError(
+                format(
+                    "Renamed {0} will be shadowed by {1} '{2}'.",
+                    elementKind.displayName,
+                    getElementKindName(nameElement),
+                    getElementQualifiedName(nameElement)),
+                new Location.fromElement(nameElement));
+          }
+          // renamed Element is shadowed by local
+          if (nameElement is LocalElement) {
+            LocalElement localElement = nameElement;
+            ClassElement enclosingClass =
+                nameElement.getAncestor((element) => element is ClassElement);
+            if (enclosingClass == elementClass ||
+                subClasses.contains(enclosingClass)) {
+              for (SearchMatch reference in references) {
+                if (isReferenceInLocalRange(localElement, reference)) {
+                  result.addError(
+                      format(
+                          "Usage of renamed {0} will be shadowed by {1} '{2}'.",
+                          elementKind.displayName,
+                          getElementKindName(localElement),
+                          localElement.displayName),
+                      new Location.fromMatch(reference));
+                }
+              }
+            }
+          }
+        }
+      });
+    }).then((_) => result);
+  }
+
+  /**
+   * Fills [elements] with [Element]s to rename.
+   */
+  Future _prepareElements() {
+    if (element is ClassMemberElement) {
+      return getHierarchyMembers(
+          searchEngine,
+          element).then((Set<Element> elements) {
+        this.elements = elements;
+      });
+    } else {
+      elements = new Set.from([element]);
+      return new Future.value();
+    }
+  }
+
+  /**
+   * Fills [references] with all references to [elements].
+   */
+  Future _prepareReferences() {
+    if (!isRename) {
+      return new Future.value();
+    }
+    return _prepareElements().then((_) {
+      return Future.forEach(elements, (Element element) {
+        return searchEngine.searchReferences(element).then((references) {
+          this.references.addAll(references);
+        });
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
new file mode 100644
index 0000000..bb521f1
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.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 services.src.refactoring.rename_constructor;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+
+
+/**
+ * A [Refactoring] for renaming [ConstructorElement]s.
+ */
+class RenameConstructorRefactoringImpl extends RenameRefactoringImpl {
+  RenameConstructorRefactoringImpl(SearchEngine searchEngine,
+      ConstructorElement element)
+      : super(searchEngine, element);
+
+  @override
+  ConstructorElement get element => super.element as ConstructorElement;
+
+  @override
+  String get refactoringName {
+    return "Rename Constructor";
+  }
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    _analyzePossibleConflicts(result);
+    return new Future.value(result);
+  }
+
+  @override
+  RefactoringStatus checkNewName() {
+    RefactoringStatus result = super.checkNewName();
+    result.addStatus(validateConstructorName(newName));
+    return result;
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    String replacement = newName.isEmpty ? '' : '.${newName}';
+    // update references
+    return searchEngine.searchReferences(element).then((refMatches) {
+      List<SourceReference> references = getSourceReferences(refMatches);
+      if (!element.isSynthetic) {
+        for (SourceReference reference in references) {
+          SourceEdit edit = createReferenceEdit(reference, replacement);
+          change.addEdit(reference.file, edit);
+        }
+      }
+      return change;
+    });
+  }
+
+  void _analyzePossibleConflicts(RefactoringStatus result) {
+    // check if there are members with "newName" in the same ClassElement
+    ClassElement parentClass = element.enclosingElement;
+    for (Element newNameMember in getChildren(parentClass, newName)) {
+      String message =
+          format(
+              "Class '{0}' already declares {1} with name '{2}'.",
+              parentClass.displayName,
+              getElementKindName(newNameMember),
+              newName);
+      result.addError(
+          message,
+          new Location.fromElement(newNameMember));
+    }
+  }
+}
diff --git a/pkg/analysis_services/lib/src/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
similarity index 73%
rename from pkg/analysis_services/lib/src/refactoring/rename_import.dart
rename to pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index fc38c80..b30fab2 100644
--- a/pkg/analysis_services/lib/src/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_services/src/refactoring/naming_conventions.dart';
-import 'package:analysis_services/src/refactoring/rename.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -46,27 +46,27 @@
   }
 
   @override
-  Future<Change> createChange() {
-    Change change = new Change(refactoringName);
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
     // update declaration
     {
       String file = getElementFile(element);
       PrefixElement prefix = element.prefix;
-      Edit edit = null;
+      SourceEdit edit = null;
       if (newName.isEmpty) {
         int uriEnd = element.uriEnd;
         int prefixEnd = element.prefixOffset + prefix.displayName.length;
         SourceRange range = rangeStartEnd(uriEnd, prefixEnd);
-        edit = new Edit.range(range, "");
+        edit = new SourceEdit.range(range, "");
       } else {
         if (prefix == null) {
           SourceRange range = rangeStartLength(element.uriEnd, 0);
-          edit = new Edit.range(range, " as ${newName}");
+          edit = new SourceEdit.range(range, " as ${newName}");
         } else {
           int offset = element.prefixOffset;
           int length = prefix.displayName.length;
           SourceRange range = rangeStartLength(offset, length);
-          edit = new Edit.range(range, newName);
+          edit = new SourceEdit.range(range, newName);
         }
       }
       if (edit != null) {
@@ -77,7 +77,7 @@
     return searchEngine.searchReferences(element).then((refMatches) {
       List<SourceReference> references = getSourceReferences(refMatches);
       for (SourceReference reference in references) {
-        Edit edit;
+        SourceEdit edit;
         if (newName.isEmpty) {
           edit = createReferenceEdit(reference, newName);
         } else {
diff --git a/pkg/analysis_services/lib/src/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
similarity index 73%
rename from pkg/analysis_services/lib/src/refactoring/rename_library.dart
rename to pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index f4235b1..09f13ec 100644
--- a/pkg/analysis_services/lib/src/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -6,12 +6,12 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/refactoring/naming_conventions.dart';
-import 'package:analysis_services/src/refactoring/rename.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 
@@ -45,8 +45,8 @@
   }
 
   @override
-  Future<Change> createChange() {
-    Change change = new Change(refactoringName);
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
     // update declaration
     addDeclarationEdit(change, element);
     // update references
diff --git a/pkg/analysis_services/lib/src/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
similarity index 83%
rename from pkg/analysis_services/lib/src/refactoring/rename_local.dart
rename to pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 0ce9b47..906a700 100644
--- a/pkg/analysis_services/lib/src/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -6,14 +6,14 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/util.dart';
-import 'package:analysis_services/src/refactoring/naming_conventions.dart';
-import 'package:analysis_services/src/refactoring/rename.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -23,10 +23,8 @@
  * A [Refactoring] for renaming [LocalElement]s.
  */
 class RenameLocalRefactoringImpl extends RenameRefactoringImpl {
-  RenameLocalRefactoringImpl(SearchEngine searchEngine, LocalElement element) :
-      super(
-      searchEngine,
-      element);
+  RenameLocalRefactoringImpl(SearchEngine searchEngine, LocalElement element)
+      : super(searchEngine, element);
 
   @override
   LocalElement get element => super.element as LocalElement;
@@ -73,8 +71,8 @@
   }
 
   @override
-  Future<Change> createChange() {
-    Change change = new Change(refactoringName);
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
     // update declaration
     addDeclarationEdit(change, element);
     // update references
@@ -121,9 +119,7 @@
       if (haveIntersectingRanges(refactoring.element, nodeElement)) {
         String nodeKind = nodeElement.kind.displayName;
         String message = "Duplicate ${nodeKind} '$newName'.";
-        result.addError(
-            message,
-            new RefactoringStatusContext.forElement(nodeElement));
+        result.addError(message, new Location.fromElement(nodeElement));
         return null;
       }
       // shadowing referenced element
@@ -136,7 +132,7 @@
         String message =
             'Usage of $nodeKind "$nodeName" declared in '
                 '"$nameElementSourceName" will be shadowed by renamed $refKind.';
-        result.addError(message, new RefactoringStatusContext.forNode(node));
+        result.addError(message, new Location.fromNode(node));
       }
     }
     return null;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
new file mode 100644
index 0000000..3688f59
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -0,0 +1,276 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.rename_unit_member;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' show Location, SourceChange;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/element_visitors.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+
+
+/**
+ * Checks if creating a top-level function with the given [name] in [library]
+ * will cause any conflicts.
+ */
+Future<RefactoringStatus> validateCreateFunction(SearchEngine searchEngine,
+    LibraryElement library, String name) {
+  return new _RenameUnitMemberValidator.forCreate(
+      searchEngine,
+      library,
+      ElementKind.FUNCTION,
+      name).validate();
+}
+
+
+/**
+ * Checks if creating a top-level function with the given [name] in [element]
+ * will cause any conflicts.
+ */
+Future<RefactoringStatus> validateRenameTopLevel(SearchEngine searchEngine,
+    Element element, String name) {
+  return new _RenameUnitMemberValidator.forRename(
+      searchEngine,
+      element,
+      name).validate();
+}
+
+
+/**
+ * A [Refactoring] for renaming compilation unit member [Element]s.
+ */
+class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
+  RenameUnitMemberRefactoringImpl(SearchEngine searchEngine, Element element)
+      : super(searchEngine, element);
+
+  @override
+  String get refactoringName {
+    if (element is FunctionElement) {
+      return "Rename Top-Level Function";
+    }
+    if (element is FunctionTypeAliasElement) {
+      return "Rename Function Type Alias";
+    }
+    if (element is TopLevelVariableElement) {
+      return "Rename Top-Level Variable";
+    }
+    return "Rename Class";
+  }
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    return validateRenameTopLevel(searchEngine, element, newName);
+  }
+
+  @override
+  RefactoringStatus checkNewName() {
+    RefactoringStatus result = super.checkNewName();
+    if (element is TopLevelVariableElement) {
+      TopLevelVariableElement variable = element as TopLevelVariableElement;
+      if (variable.isConst) {
+        result.addStatus(validateConstantName(newName));
+      } else {
+        result.addStatus(validateVariableName(newName));
+      }
+    }
+    if (element is FunctionElement) {
+      result.addStatus(validateFunctionName(newName));
+    }
+    if (element is FunctionTypeAliasElement) {
+      result.addStatus(validateFunctionTypeAliasName(newName));
+    }
+    if (element is ClassElement) {
+      result.addStatus(validateClassName(newName));
+    }
+    return result;
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    SourceChange change = new SourceChange(refactoringName);
+    // prepare elements
+    List<Element> elements = [];
+    if (element is PropertyInducingElement && element.isSynthetic) {
+      PropertyInducingElement property = element as PropertyInducingElement;
+      PropertyAccessorElement getter = property.getter;
+      PropertyAccessorElement setter = property.setter;
+      if (getter != null) {
+        elements.add(getter);
+      }
+      if (setter != null) {
+        elements.add(setter);
+      }
+    } else {
+      elements.add(element);
+    }
+    // update each element
+    return Future.forEach(elements, (Element element) {
+      // update declaration
+      addDeclarationEdit(change, element);
+      // schedule updating references
+      return searchEngine.searchReferences(element).then((refMatches) {
+        List<SourceReference> references = getSourceReferences(refMatches);
+        for (SourceReference reference in references) {
+          addReferenceEdit(change, reference);
+        }
+      });
+    }).then((_) {
+      return change;
+    });
+  }
+}
+
+
+/**
+ * Helper to check if the created or renamed [Element] will cause any conflicts.
+ */
+class _RenameUnitMemberValidator {
+  final SearchEngine searchEngine;
+  LibraryElement library;
+  Element element;
+  ElementKind elementKind;
+  final String name;
+  final bool isRename;
+
+  final RefactoringStatus result = new RefactoringStatus();
+
+  _RenameUnitMemberValidator.forCreate(this.searchEngine, this.library,
+      this.elementKind, this.name)
+      : isRename = false;
+
+  _RenameUnitMemberValidator.forRename(this.searchEngine, this.element,
+      this.name)
+      : isRename = true {
+    library = element.getAncestor((e) => e is LibraryElement);
+    elementKind = element.kind;
+  }
+
+  Future<RefactoringStatus> validate() {
+    _validateWillConflict();
+    List<Future> futures = <Future>[];
+    if (isRename) {
+      futures.add(_validateWillBeShadowed());
+    }
+    futures.add(_validateWillShadow());
+    return Future.wait(futures).then((_) {
+      return result;
+    });
+  }
+
+  /**
+   * Returns `true` if [element] is visible at the given [SearchMatch].
+   */
+  bool _isVisibleAt(Element element, SearchMatch at) {
+    LibraryElement atLibrary = at.element.library;
+    // may be the same library
+    if (library == atLibrary) {
+      return true;
+    }
+    // check imports
+    for (ImportElement importElement in atLibrary.imports) {
+      // ignore if imported with prefix
+      if (importElement.prefix != null) {
+        continue;
+      }
+      // check imported elements
+      if (getImportNamespace(importElement).containsValue(element)) {
+        return true;
+      }
+    }
+    // no, it is not visible
+    return false;
+  }
+
+  /**
+   * Validates if any usage of [element] renamed to [name] will be shadowed.
+   */
+  Future _validateWillBeShadowed() {
+    if (!isRename) {
+      return new Future.value();
+    }
+    return searchEngine.searchReferences(element).then((references) {
+      for (SearchMatch reference in references) {
+        Element refElement = reference.element;
+        ClassElement refClass =
+            refElement.getAncestor((e) => e is ClassElement);
+        if (refClass != null) {
+          visitChildren(refClass, (shadow) {
+            if (hasDisplayName(shadow, name)) {
+              String message = format(
+                  "Reference to renamed {0} will be shadowed by {1} '{2}'.",
+                  getElementKindName(element),
+                  getElementKindName(shadow),
+                  getElementQualifiedName(shadow));
+              result.addError(message, new Location.fromElement(shadow));
+            }
+          });
+        }
+      }
+    });
+  }
+
+  /**
+   * Validates if [element] renamed to [name] will conflict with another
+   * top-level [Element] in the same library.
+   */
+  void _validateWillConflict() {
+    visitLibraryTopLevelElements(library, (element) {
+      if (hasDisplayName(element, name)) {
+        String message = format(
+            "Library already declares {0} with name '{1}'.",
+            getElementKindName(element),
+            name);
+        result.addError(message, new Location.fromElement(element));
+      }
+    });
+  }
+
+  /**
+   * Validates if renamed [element] will shadow any [Element] named [name].
+   */
+  Future _validateWillShadow() {
+    return searchEngine.searchMemberDeclarations(name).then((declarations) {
+      return Future.forEach(declarations, (SearchMatch declaration) {
+        Element member = declaration.element;
+        ClassElement declaringClass = member.enclosingElement;
+        return searchEngine.searchReferences(member).then((memberReferences) {
+          for (SearchMatch memberReference in memberReferences) {
+            Element refElement = memberReference.element;
+            // cannot be shadowed if qualified
+            if (memberReference.isQualified) {
+              continue;
+            }
+            // cannot be shadowed if declared in the same class as reference
+            ClassElement refClass =
+                refElement.getAncestor((e) => e is ClassElement);
+            if (refClass == declaringClass) {
+              continue;
+            }
+            // ignore if not visible
+            if (!_isVisibleAt(element, memberReference)) {
+              continue;
+            }
+            // OK, reference will be shadowed be the element being renamed
+            String message = format(
+                isRename ?
+                    "Renamed {0} will shadow {1} '{2}'." :
+                    "Created {0} will shadow {1} '{2}'.",
+                elementKind.displayName,
+                getElementKindName(member),
+                getElementQualifiedName(member));
+            result.addError(message, new Location.fromMatch(memberReference));
+          }
+        });
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/search/element_visitors.dart b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
new file mode 100644
index 0000000..6490cae
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.search.element_visitors;
+
+import 'package:analyzer/src/generated/element.dart';
+
+
+/**
+ * Uses [processor] to visit all of the children of [element].
+ * If [processor] returns `true`, then children of a child are visited too.
+ */
+void visitChildren(Element element, ElementProcessor processor) {
+  element.visitChildren(new _ElementVisitorAdapter(processor));
+}
+
+
+/**
+ * Uses [processor] to visit all of the top-level elements of [library].
+ */
+void visitLibraryTopLevelElements(LibraryElement library,
+    ElementProcessor processor) {
+  library.visitChildren(new _TopLevelElementsVisitor(processor));
+}
+
+
+/**
+ * An [Element] processor function type.
+ * If `true` is returned, children of [element] will be visited.
+ */
+typedef bool ElementProcessor(Element element);
+
+
+/**
+ * A [GeneralizingElementVisitor] adapter for [ElementProcessor].
+ */
+class _ElementVisitorAdapter extends GeneralizingElementVisitor {
+  final ElementProcessor processor;
+
+  _ElementVisitorAdapter(this.processor);
+
+  @override
+  void visitElement(Element element) {
+    bool visitChildren = processor(element);
+    if (visitChildren == true) {
+      element.visitChildren(this);
+    }
+  }
+}
+
+
+/**
+ * A [GeneralizingElementVisitor] for visiting top-level elements.
+ */
+class _TopLevelElementsVisitor extends GeneralizingElementVisitor {
+  final ElementProcessor processor;
+
+  _TopLevelElementsVisitor(this.processor);
+
+  @override
+  void visitElement(Element element) {
+    if (element is CompilationUnitElement) {
+      element.visitChildren(this);
+    } else {
+      processor(element);
+    }
+  }
+}
diff --git a/pkg/analysis_services/lib/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
similarity index 90%
rename from pkg/analysis_services/lib/search/hierarchy.dart
rename to pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 1b304db..bcc8092 100644
--- a/pkg/analysis_services/lib/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -7,7 +7,8 @@
 import 'dart:async';
 import 'dart:collection';
 
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/services/search/element_visitors.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 
@@ -16,11 +17,11 @@
  */
 List<Element> getChildren(Element parent, [String name]) {
   List<Element> children = <Element>[];
-  parent.visitChildren(new _ElementVisitorAdapter((Element element) {
+  visitChildren(parent, (Element element) {
     if (name == null || element.displayName == name) {
       children.add(element);
     }
-  }));
+  });
   return children;
 }
 
@@ -33,7 +34,7 @@
  */
 List<Element> getClassMembers(ClassElement clazz, [String name]) {
   List<Element> members = <Element>[];
-  clazz.visitChildren(new _ElementVisitorAdapter((Element element) {
+  visitChildren(clazz, (Element element) {
     if (element.isSynthetic) {
       return;
     }
@@ -49,7 +50,7 @@
     if (element is FieldElement) {
       members.add(element);
     }
-  }));
+  });
   return members;
 }
 
@@ -208,20 +209,3 @@
   }
   return element;
 }
-
-
-typedef void _ElementProcessor(Element element);
-
-/**
- * A [GeneralizingElementVisitor] adapter for [_ElementProcessor].
- */
-class _ElementVisitorAdapter extends GeneralizingElementVisitor {
-  final _ElementProcessor processor;
-
-  _ElementVisitorAdapter(this.processor);
-
-  @override
-  void visitElement(Element element) {
-    processor(element);
-  }
-}
diff --git a/pkg/analysis_services/lib/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
similarity index 93%
rename from pkg/analysis_services/lib/search/search_engine.dart
rename to pkg/analysis_server/lib/src/services/search/search_engine.dart
index 2ec2c95..9073be8 100644
--- a/pkg/analysis_services/lib/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -83,6 +83,13 @@
  */
 abstract class SearchEngine {
   /**
+   * Returns declarations of elements with the given name.
+   *
+   * [name] - the name being declared by the found matches.
+   */
+  Future<List<SearchMatch>> searchElementDeclarations(String name);
+
+  /**
    * Returns declarations of class members with the given name.
    *
    * [name] - the name being declared by the found matches.
diff --git a/pkg/analysis_services/lib/src/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
similarity index 95%
rename from pkg/analysis_services/lib/src/search/search_engine.dart
rename to pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 043d45a..bc49db0 100644
--- a/pkg/analysis_services/lib/src/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -21,14 +21,19 @@
   SearchEngineImpl(this._index);
 
   @override
-  Future<List<SearchMatch>> searchMemberDeclarations(String name) {
+  Future<List<SearchMatch>> searchElementDeclarations(String name) {
     NameElement element = new NameElement(name);
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
         element,
         IndexConstants.NAME_IS_DEFINED_BY,
         MatchKind.DECLARATION);
-    return requestor.merge().then((matches) {
+    return requestor.merge();
+  }
+
+  @override
+  Future<List<SearchMatch>> searchMemberDeclarations(String name) {
+    return searchElementDeclarations(name).then((matches) {
       return matches.where((match) {
         return match.element.enclosingElement is ClassElement;
       }).toList();
@@ -39,10 +44,7 @@
   Future<List<SearchMatch>> searchMemberReferences(String name) {
     NameElement element = new NameElement(name);
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        element,
-        IndexConstants.IS_INVOKED_BY,
-        MatchKind.INVOCATION);
+    requestor.add(element, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     requestor.add(element, IndexConstants.IS_READ_BY, MatchKind.READ);
     requestor.add(
         element,
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 3be880a..9623ae4 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -15,8 +15,8 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_file_index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_file_index.dart';
 
 
 /**
@@ -53,9 +53,9 @@
   void createAnalysisServer(ServerCommunicationChannel serverChannel) {
     if (analysisServer != null) {
       RequestError error = new RequestError.serverAlreadyStarted();
-      serverChannel.sendResponse(new Response('', error));
+      serverChannel.sendResponse(new Response('', error: error));
       serverChannel.listen((Request request) {
-        serverChannel.sendResponse(new Response(request.id, error));
+        serverChannel.sendResponse(new Response(request.id, error: error));
       });
       return;
     }
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index abab51a..cf25aa5 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,6 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analysis_services: '>=0.4.0 <0.5.0'
   analyzer: '>=0.22.0-dev <0.23.0'
   args: any
   logging: any
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 9e2365a..cc9224c 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -6,11 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:unittest/unittest.dart';
@@ -77,8 +74,8 @@
       expect(errors, hasLength(1));
       {
         AnalysisError error = errors[0];
-        expect(error.severity, 'ERROR');
-        expect(error.type, 'SYNTACTIC_ERROR');
+        expect(error.severity, ErrorSeverity.ERROR);
+        expect(error.type, ErrorType.SYNTACTIC_ERROR);
         expect(error.location.file, testFile);
         expect(error.location.startLine, 2);
       }
@@ -112,7 +109,8 @@
     }
     // wait for an error response
     return serverChannel.waitForResponse(request).then((Response response) {
-      expect(response.getResult(ERRORS), isEmpty);
+      var result = new AnalysisGetErrorsResult.fromResponse(response);
+      expect(result.errors, isEmpty);
       RequestError error = response.error;
       expect(error, isNotNull);
       expect(error.code, 'GET_ERRORS_ERROR');
@@ -120,16 +118,13 @@
   }
 
   Request _createGetErrorsRequest() {
-    Request request = new Request(requestId, ANALYSIS_GET_ERRORS);
-    request.setParameter(FILE, testFile);
-    return request;
+    return new AnalysisGetErrorsParams(testFile).toRequest(requestId);
   }
 
   Future<List<AnalysisError>> _getErrors(String file) {
     Request request = _createGetErrorsRequest();
     return serverChannel.sendRequest(request).then((Response response) {
-      List errorsJsons = response.getResult(ERRORS);
-      return errorsJsons.map(AnalysisError.fromJson).toList();
+      return new AnalysisGetErrorsResult.fromResponse(response).errors;
     });
   }
 }
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index b7260aa..3fc6bb2 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -4,11 +4,9 @@
 
 library test.analysis.notification_errors;
 
-import 'package:analysis_server/src/computer/error.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -27,9 +25,8 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_ERRORS) {
-      String file = notification.getParameter(FILE);
-      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
-      filesErrors[file] = errorMaps.map(AnalysisError.fromJson).toList();
+      var decoded = new AnalysisErrorsParams.fromNotification(notification);
+      filesErrors[decoded.file] = decoded.errors;
     }
   }
 
@@ -49,8 +46,8 @@
       expect(error.location.file, '/project/bin/test.dart');
       expect(error.location.offset, isPositive);
       expect(error.location.length, isNonNegative);
-      expect(error.severity, 'ERROR');
-      expect(error.type, 'SYNTACTIC_ERROR');
+      expect(error.severity, ErrorSeverity.ERROR);
+      expect(error.type, ErrorType.SYNTACTIC_ERROR);
       expect(error.message, isNotNull);
     });
   }
@@ -66,8 +63,8 @@
       List<AnalysisError> errors = filesErrors[testFile];
       expect(errors, hasLength(1));
       AnalysisError error = errors[0];
-      expect(error.severity, 'WARNING');
-      expect(error.type, 'STATIC_WARNING');
+      expect(error.severity, ErrorSeverity.WARNING);
+      expect(error.type, ErrorType.STATIC_WARNING);
     });
   }
 
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index ad4e769..df195fe 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -7,11 +7,9 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_testing/mock_sdk.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -46,7 +44,7 @@
   AnalysisServer server;
   RequestHandler handler;
 
-  Map<String, List<String>> analysisSubscriptions = {};
+  Map<AnalysisService, List<String>> analysisSubscriptions = {};
 
   String projectPath = '/project';
   String testFolder = '/project/bin/';
@@ -63,15 +61,15 @@
 
   void addAnalysisSubscription(AnalysisService service, String file) {
     // add file to subscription
-    var files = analysisSubscriptions[service.name];
+    var files = analysisSubscriptions[service];
     if (files == null) {
       files = <String>[];
-      analysisSubscriptions[service.name] = files;
+      analysisSubscriptions[service] = files;
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
-    request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
+    Request request = new AnalysisSetSubscriptionsParams(
+        analysisSubscriptions).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
@@ -95,9 +93,8 @@
    */
   void createProject() {
     resourceProvider.newFolder(projectPath);
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, [projectPath]);
-    request.setParameter(EXCLUDED, []);
+    Request request = new AnalysisSetAnalysisRootsParams([projectPath],
+        []).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
@@ -216,9 +213,8 @@
 //    this.testCode = _getCodeString(code);
 //    resourceProvider.newFolder('/project');
 //    resourceProvider.newFile(testFile, testCode);
-//    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
-//    request.setParameter(INCLUDED, ['/project']);
-//    request.setParameter(EXCLUDED, []);
+//    Request request = new AnalysisSetAnalysisRootsParams(['/project'],
+//        []).toRequest('0');
 //    handleSuccessfulRequest(request);
 //  }
 
diff --git a/pkg/analysis_server/test/analysis_hover_test.dart b/pkg/analysis_server/test/analysis_hover_test.dart
index 5a3f28d..64e1761 100644
--- a/pkg/analysis_server/test/analysis_hover_test.dart
+++ b/pkg/analysis_server/test/analysis_hover_test.dart
@@ -6,10 +6,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/computer_hover.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -24,21 +21,18 @@
 
 @ReflectiveTestCase()
 class AnalysisHoverTest extends AbstractAnalysisTest {
-  Future<Hover> prepareHover(String search) {
+  Future<HoverInformation> prepareHover(String search) {
     int offset = findOffset(search);
     return prepareHoverAt(offset);
   }
 
-  Future<Hover> prepareHoverAt(int offset) {
+  Future<HoverInformation> prepareHoverAt(int offset) {
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', ANALYSIS_GET_HOVER);
-      request.setParameter(FILE, testFile);
-      request.setParameter(OFFSET, offset);
+      Request request = new AnalysisGetHoverParams(testFile,
+          offset).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      List<Map<String, Object>> hoverJsons = response.getResult(HOVERS);
-      List<Hover> hovers = hoverJsons.map((json) {
-        return new Hover.fromJson(json);
-      }).toList();
+      var result = new AnalysisGetHoverResult.fromResponse(response);
+      List<HoverInformation> hovers = result.hovers;
       return hovers.isNotEmpty ? hovers.first : null;
     });
   }
@@ -49,7 +43,7 @@
     createProject();
   }
 
-  test_dartDoc_clunky() {
+  test_dartdoc_clunky() {
     addTestFile('''
 library my.library;
 /**
@@ -59,12 +53,12 @@
 main() {
 }
 ''');
-    return prepareHover('main() {').then((Hover hover) {
-      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+    return prepareHover('main() {').then((HoverInformation hover) {
+      expect(hover.dartdoc, '''doc aaa\ndoc bbb''');
     });
   }
 
-  test_dartDoc_elegant() {
+  test_dartdoc_elegant() {
     addTestFile('''
 library my.library;
 /// doc aaa
@@ -72,8 +66,8 @@
 main() {
 }
 ''');
-    return prepareHover('main() {').then((Hover hover) {
-      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+    return prepareHover('main() {').then((HoverInformation hover) {
+      expect(hover.dartdoc, '''doc aaa\ndoc bbb''');
     });
   }
 
@@ -85,11 +79,11 @@
 List<String> fff(int a, String b) {
 }
 ''');
-    return prepareHover('fff(int a').then((Hover hover) {
+    return prepareHover('fff(int a').then((HoverInformation hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
-      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.dartdoc, '''doc aaa\ndoc bbb''');
       expect(hover.elementDescription, 'fff(int a, String b) → List<String>');
       expect(hover.elementKind, 'function');
       // types
@@ -107,7 +101,7 @@
 }
 foo(Object myParameter) {}
 ''');
-    return prepareHover('123').then((Hover hover) {
+    return prepareHover('123').then((HoverInformation hover) {
       // literal, no Element
       expect(hover.elementDescription, isNull);
       expect(hover.elementKind, isNull);
@@ -129,11 +123,11 @@
   }
 }
 ''');
-    return prepareHover('mmm(int a').then((Hover hover) {
+    return prepareHover('mmm(int a').then((HoverInformation hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
-      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.dartdoc, '''doc aaa\ndoc bbb''');
       expect(hover.elementDescription, 'A.mmm(int a, String b) → List<String>');
       expect(hover.elementKind, 'method');
       // types
@@ -155,7 +149,7 @@
   a.mmm(42, 'foo');
 }
 ''');
-    return prepareHover('mm(42, ').then((Hover hover) {
+    return prepareHover('mm(42, ').then((HoverInformation hover) {
       // range
       expect(hover.offset, findOffset('mmm(42, '));
       expect(hover.length, 'mmm'.length);
@@ -184,11 +178,11 @@
   print(a.fff);
 }
 ''');
-    return prepareHover('fff);').then((Hover hover) {
+    return prepareHover('fff);').then((HoverInformation hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
-      expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
+      expect(hover.dartdoc, '''doc aaa\ndoc bbb''');
       expect(hover.elementDescription, 'String fff');
       expect(hover.elementKind, 'field');
       // types
@@ -205,11 +199,11 @@
   print(vvv);
 }
 ''');
-    return prepareHover('vvv);').then((Hover hover) {
+    return prepareHover('vvv);').then((HoverInformation hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
-      expect(hover.dartDoc, isNull);
+      expect(hover.dartdoc, isNull);
       expect(hover.elementDescription, 'dynamic vvv');
       expect(hover.elementKind, 'local variable');
       // types
@@ -225,7 +219,7 @@
   // nothing
 }
 ''');
-    return prepareHover('nothing').then((Hover hover) {
+    return prepareHover('nothing').then((HoverInformation hover) {
       expect(hover, isNull);
     });
   }
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
index c71601c..b5619e2 100644
--- a/pkg/analysis_server/test/analysis_notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -6,11 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -27,7 +24,7 @@
 class AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
   List<HighlightRegion> regions;
 
-  void assertHasRawRegion(HighlightType type, int offset, int length) {
+  void assertHasRawRegion(HighlightRegionType type, int offset, int length) {
     for (HighlightRegion region in regions) {
       if (region.offset == offset &&
           region.length == length &&
@@ -40,19 +37,19 @@
             '${regions.join('\n')}');
   }
 
-  void assertHasRegion(HighlightType type, String search, [int length = -1]) {
+  void assertHasRegion(HighlightRegionType type, String search, [int length = -1]) {
     int offset = findOffset(search);
     length = findRegionLength(search, length);
     assertHasRawRegion(type, offset, length);
   }
 
-  void assertHasStringRegion(HighlightType type, String str) {
+  void assertHasStringRegion(HighlightRegionType type, String str) {
     int offset = findOffset(str);
     int length = str.length;
     assertHasRawRegion(type, offset, length);
   }
 
-  void assertNoRawRegion(HighlightType type, int offset, int length) {
+  void assertNoRawRegion(HighlightRegionType type, int offset, int length) {
     for (HighlightRegion region in regions) {
       if (region.offset == offset &&
           region.length == length &&
@@ -65,7 +62,7 @@
   }
 
 
-  void assertNoRegion(HighlightType type, String search, [int length = -1]) {
+  void assertNoRegion(HighlightRegionType type, String search, [int length = -1]) {
     int offset = findOffset(search);
     length = findRegionLength(search, length);
     assertNoRawRegion(type, offset, length);
@@ -98,14 +95,9 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_HIGHLIGHTS) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        regions = [];
-        List<Map<String, Object>> regionsJson =
-            notification.getParameter(REGIONS);
-        for (Map<String, Object> regionJson in regionsJson) {
-          regions.add(new HighlightRegion.fromJson(regionJson));
-        }
+      var params = new AnalysisHighlightsParams.fromNotification(notification);
+      if (params.file == testFile) {
+        regions = params.regions;
       }
     }
   }
@@ -124,8 +116,8 @@
 @AAA(1, 2, 3) main() {}
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
-      assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
+      assertHasRegion(HighlightRegionType.ANNOTATION, '@AAA(', '@AAA('.length);
+      assertHasRegion(HighlightRegionType.ANNOTATION, ') main', ')'.length);
     });
   }
 
@@ -135,7 +127,7 @@
 @AAA main() {}
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.ANNOTATION, '@AAA');
+      assertHasRegion(HighlightRegionType.ANNOTATION, '@AAA');
     });
   }
 
@@ -146,8 +138,8 @@
   var abstract = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
-      assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'abstract class');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'abstract = 42');
     });
   }
 
@@ -159,9 +151,9 @@
   var as = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'as math');
-      assertHasRegion(HighlightType.BUILT_IN, 'as int');
-      assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'as math');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'as int');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'as = 42');
     });
   }
 
@@ -172,8 +164,8 @@
   var deferred = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
-      assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'deferred as math');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'deferred = 42');
     });
   }
 
@@ -184,8 +176,8 @@
   var export = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
-      assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'export "dart:');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'export = 42');
     });
   }
 
@@ -199,10 +191,10 @@
   var external = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'external A()');
-      assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
-      assertHasRegion(HighlightType.BUILT_IN, 'external main()');
-      assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'external A()');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'external aaa()');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'external main()');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'external = 42');
     });
   }
 
@@ -215,8 +207,8 @@
   var factory = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
-      assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'factory A()');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'factory = 42');
     });
   }
 
@@ -230,9 +222,9 @@
   var get = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
-      assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
-      assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'get aaa =>');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'get bbb =>');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'get = 42');
     });
   }
 
@@ -243,8 +235,8 @@
   var hide = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
-      assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'hide Foo');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'hide = 42');
     });
   }
 
@@ -256,8 +248,8 @@
   var implements = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
-      assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'implements A {}');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'implements = 42');
     });
   }
 
@@ -268,8 +260,8 @@
   var import = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'import "');
-      assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'import "');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'import = 42');
     });
   }
 
@@ -280,8 +272,8 @@
   var library = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
-      assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'library lib;');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'library = 42');
     });
   }
 
@@ -295,9 +287,9 @@
   var native = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
-      assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
-      assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'native "A_');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'native "bbb_');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'native = 42');
     });
   }
 
@@ -310,8 +302,8 @@
   var on = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'on int');
-      assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'on int');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'on = 42');
     });
   }
 
@@ -324,8 +316,8 @@
   var operator = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
-      assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'operator +(');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'operator = 42');
     });
   }
 
@@ -337,8 +329,8 @@
 }''');
     addFile('/project/bin/my_part.dart', 'part of lib;');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
-      assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'part "my_');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 42');
     });
   }
 
@@ -351,9 +343,9 @@
 }''');
     _addLibraryForTestPart();
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
-      assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
-      assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'part of', 'part of'.length);
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'part = 1');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'of = 2');
     });
   }
 
@@ -367,9 +359,9 @@
   var set = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
-      assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
-      assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'set aaa(');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'set bbb(');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'set = 42');
     });
   }
 
@@ -380,8 +372,8 @@
   var show = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
-      assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'show Foo');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'show = 42');
     });
   }
 
@@ -395,9 +387,9 @@
   var static = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
-      assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
-      assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'static aaa;');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'static bbb()');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'static = 42');
     });
   }
 
@@ -408,8 +400,8 @@
   var typedef = 42;
 }''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
-      assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'typedef A();');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'typedef = 42');
     });
   }
 
@@ -419,8 +411,8 @@
 AAA aaa;
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.CLASS, 'AAA {}');
-      assertHasRegion(HighlightType.CLASS, 'AAA aaa');
+      assertHasRegion(HighlightRegionType.CLASS, 'AAA {}');
+      assertHasRegion(HighlightRegionType.CLASS, 'AAA aaa');
     });
   }
 
@@ -429,7 +421,7 @@
 dynamic f() {}
 ''');
     return prepareHighlights().then((_) {
-      assertNoRegion(HighlightType.CLASS, 'dynamic f()');
+      assertNoRegion(HighlightRegionType.CLASS, 'dynamic f()');
     });
   }
 
@@ -438,7 +430,7 @@
 void f() {}
 ''');
     return prepareHighlights().then((_) {
-      assertNoRegion(HighlightType.CLASS, 'void f()');
+      assertNoRegion(HighlightRegionType.CLASS, 'void f()');
     });
   }
 
@@ -457,9 +449,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.COMMENT_DOCUMENTATION, '/**', 32);
-      assertHasRegion(HighlightType.COMMENT_END_OF_LINE, '//', 22);
-      assertHasRegion(HighlightType.COMMENT_BLOCK, '/* b', 19);
+      assertHasRegion(HighlightRegionType.COMMENT_DOCUMENTATION, '/**', 32);
+      assertHasRegion(HighlightRegionType.COMMENT_END_OF_LINE, '//', 22);
+      assertHasRegion(HighlightRegionType.COMMENT_BLOCK, '/* b', 19);
     });
   }
 
@@ -475,10 +467,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
-      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
-      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
-      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
+      assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(p)');
+      assertHasRegion(HighlightRegionType.CONSTRUCTOR, 'name(42)');
+      assertNoRegion(HighlightRegionType.CONSTRUCTOR, 'AAA() {}');
+      assertNoRegion(HighlightRegionType.CONSTRUCTOR, 'AAA();');
     });
   }
 
@@ -490,10 +482,10 @@
 part 'part.dart';
 ''');
     return prepareHighlights().then((_) {
-      assertHasStringRegion(HighlightType.DIRECTIVE, "library lib;");
-      assertHasStringRegion(HighlightType.DIRECTIVE, "import 'dart:math';");
-      assertHasStringRegion(HighlightType.DIRECTIVE, "export 'dart:math';");
-      assertHasStringRegion(HighlightType.DIRECTIVE, "part 'part.dart';");
+      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "library lib;");
+      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "import 'dart:math';");
+      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "export 'dart:math';");
+      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part 'part.dart';");
     });
   }
 
@@ -503,7 +495,7 @@
 ''');
     _addLibraryForTestPart();
     return prepareHighlights().then((_) {
-      assertHasStringRegion(HighlightType.DIRECTIVE, "part of lib;");
+      assertHasStringRegion(HighlightRegionType.DIRECTIVE, "part of lib;");
     });
   }
 
@@ -518,10 +510,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
-      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
-      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
-      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
+      assertHasRegion(HighlightRegionType.DYNAMIC_TYPE, 'p)');
+      assertHasRegion(HighlightRegionType.DYNAMIC_TYPE, 'v1 =');
+      assertNoRegion(HighlightRegionType.DYNAMIC_TYPE, 'v2;');
+      assertNoRegion(HighlightRegionType.DYNAMIC_TYPE, 'v3 =');
     });
   }
 
@@ -538,11 +530,11 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.FIELD, 'aaa = 1');
-      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
-      assertHasRegion(HighlightType.FIELD, 'bbb = 3');
-      assertHasRegion(HighlightType.FIELD, 'aaa = 4');
-      assertHasRegion(HighlightType.FIELD, 'bbb = 5');
+      assertHasRegion(HighlightRegionType.FIELD, 'aaa = 1');
+      assertHasRegion(HighlightRegionType.FIELD, 'bbb = 2');
+      assertHasRegion(HighlightRegionType.FIELD, 'bbb = 3');
+      assertHasRegion(HighlightRegionType.FIELD, 'aaa = 4');
+      assertHasRegion(HighlightRegionType.FIELD, 'bbb = 5');
     });
   }
 
@@ -560,10 +552,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
-      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
-      assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
-      assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
+      assertHasRegion(HighlightRegionType.FIELD_STATIC, 'aaa = 1');
+      assertHasRegion(HighlightRegionType.FIELD_STATIC, 'aaa = 2');
+      assertHasRegion(HighlightRegionType.FIELD_STATIC, 'bbb;');
+      assertHasRegion(HighlightRegionType.FIELD_STATIC, 'ccc = 3');
     });
   }
 
@@ -575,8 +567,8 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
-      assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
+      assertHasRegion(HighlightRegionType.FUNCTION_DECLARATION, 'fff(p) {}');
+      assertHasRegion(HighlightRegionType.FUNCTION, 'fff(42)');
     });
   }
 
@@ -587,8 +579,8 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
-      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
+      assertHasRegion(HighlightRegionType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
+      assertHasRegion(HighlightRegionType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
     });
   }
 
@@ -604,10 +596,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
-      assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'aaa;');
-      assertHasRegion(HighlightType.FIELD, 'bbb;');
+      assertHasRegion(HighlightRegionType.GETTER_DECLARATION, 'aaa => null');
+      assertHasRegion(HighlightRegionType.GETTER_DECLARATION, 'bbb => null');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'aaa;');
+      assertHasRegion(HighlightRegionType.FIELD, 'bbb;');
     });
   }
 
@@ -620,9 +612,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
-      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
-      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
+      assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'aaa = 42');
+      assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'bbb(84)');
+      assertHasRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'CCC ccc');
     });
   }
 
@@ -634,8 +626,8 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
-      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
+      assertHasRegion(HighlightRegionType.IMPORT_PREFIX, 'ma;');
+      assertHasRegion(HighlightRegionType.IMPORT_PREFIX, 'ma.max');
     });
   }
 
@@ -673,34 +665,34 @@
 class C = Object with A;
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.KEYWORD, 'assert(true)');
-      assertHasRegion(HighlightType.KEYWORD, 'for (;;)');
-      assertHasRegion(HighlightType.KEYWORD, 'for (var v4 in');
-      assertHasRegion(HighlightType.KEYWORD, 'break;');
-      assertHasRegion(HighlightType.KEYWORD, 'case 0:');
-      assertHasRegion(HighlightType.KEYWORD, 'catch (e) {}');
-      assertHasRegion(HighlightType.KEYWORD, 'class A {}');
-      assertHasRegion(HighlightType.KEYWORD, 'const v1');
-      assertHasRegion(HighlightType.KEYWORD, 'continue;');
-      assertHasRegion(HighlightType.KEYWORD, 'default:');
-      assertHasRegion(HighlightType.KEYWORD, 'do {} while');
-      assertHasRegion(HighlightType.KEYWORD, 'if (true)');
-      assertHasRegion(HighlightType.KEYWORD, 'false;');
-      assertHasRegion(HighlightType.KEYWORD, 'final v3 =');
-      assertHasRegion(HighlightType.KEYWORD, 'finally {}');
-      assertHasRegion(HighlightType.KEYWORD, 'in []');
-      assertHasRegion(HighlightType.KEYWORD, 'is int');
-      assertHasRegion(HighlightType.KEYWORD, 'new A();');
-      assertHasRegion(HighlightType.KEYWORD, 'rethrow;');
-      assertHasRegion(HighlightType.KEYWORD, 'return this');
-      assertHasRegion(HighlightType.KEYWORD, 'super();');
-      assertHasRegion(HighlightType.KEYWORD, 'switch (0)');
-      assertHasRegion(HighlightType.KEYWORD, 'this;');
-      assertHasRegion(HighlightType.KEYWORD, 'true;');
-      assertHasRegion(HighlightType.KEYWORD, 'try {');
-      assertHasRegion(HighlightType.KEYWORD, 'while (true) {}');
-      assertHasRegion(HighlightType.KEYWORD, 'while (true);');
-      assertHasRegion(HighlightType.KEYWORD, 'with A;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'assert(true)');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'for (;;)');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'for (var v4 in');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'break;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'case 0:');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'catch (e) {}');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'class A {}');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'const v1');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'continue;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'default:');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'do {} while');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'if (true)');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'false;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'final v3 =');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'finally {}');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'in []');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'is int');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'new A();');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'rethrow;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'return this');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'super();');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'switch (0)');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'this;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'true;');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'try {');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'while (true) {}');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'while (true);');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'with A;');
     });
   }
 
@@ -710,35 +702,35 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.KEYWORD, 'void main()');
+      assertHasRegion(HighlightRegionType.KEYWORD, 'void main()');
     });
   }
 
   test_LITERAL_BOOLEAN() {
     addTestFile('var V = true;');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
+      assertHasRegion(HighlightRegionType.LITERAL_BOOLEAN, 'true;');
     });
   }
 
   test_LITERAL_DOUBLE() {
     addTestFile('var V = 4.2;');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
+      assertHasRegion(HighlightRegionType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
     });
   }
 
   test_LITERAL_INTEGER() {
     addTestFile('var V = 42;');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
+      assertHasRegion(HighlightRegionType.LITERAL_INTEGER, '42;');
     });
   }
 
   test_LITERAL_LIST() {
     addTestFile('var V = <int>[1, 2, 3];');
     return prepareHighlights().then((_) {
-      assertHasStringRegion(HighlightType.LITERAL_LIST, '<int>[1, 2, 3]');
+      assertHasStringRegion(HighlightRegionType.LITERAL_LIST, '<int>[1, 2, 3]');
     });
   }
 
@@ -746,7 +738,7 @@
     addTestFile("var V = const <int, String>{1: 'a', 2: 'b', 3: 'c'};");
     return prepareHighlights().then((_) {
       assertHasStringRegion(
-          HighlightType.LITERAL_MAP,
+          HighlightRegionType.LITERAL_MAP,
           "const <int, String>{1: 'a', 2: 'b', 3: 'c'}");
     });
   }
@@ -754,7 +746,7 @@
   test_LITERAL_STRING() {
     addTestFile('var V = "abc";');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
+      assertHasRegion(HighlightRegionType.LITERAL_STRING, '"abc";', '"abc"'.length);
     });
   }
 
@@ -767,9 +759,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
-      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
-      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
+      assertHasRegion(HighlightRegionType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
+      assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv;');
+      assertHasRegion(HighlightRegionType.LOCAL_VARIABLE, 'vvv = 1;');
     });
   }
 
@@ -787,12 +779,12 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
-      assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
-      assertHasRegion(HighlightType.METHOD, 'aaa();');
-      assertHasRegion(HighlightType.METHOD, 'aaa;');
-      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
-      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
+      assertHasRegion(HighlightRegionType.METHOD_DECLARATION, 'aaa() {}');
+      assertHasRegion(HighlightRegionType.METHOD_DECLARATION_STATIC, 'bbb() {}');
+      assertHasRegion(HighlightRegionType.METHOD, 'aaa();');
+      assertHasRegion(HighlightRegionType.METHOD, 'aaa;');
+      assertHasRegion(HighlightRegionType.METHOD_STATIC, 'bbb();');
+      assertHasRegion(HighlightRegionType.METHOD_STATIC, 'bbb;');
     });
   }
 
@@ -805,7 +797,7 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.METHOD, 'add(null)');
+      assertHasRegion(HighlightRegionType.METHOD, 'add(null)');
     });
   }
 
@@ -817,9 +809,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.PARAMETER, 'p) {');
-      assertHasRegion(HighlightType.PARAMETER, 'p;');
-      assertHasRegion(HighlightType.PARAMETER, 'p = 42');
+      assertHasRegion(HighlightRegionType.PARAMETER, 'p) {');
+      assertHasRegion(HighlightRegionType.PARAMETER, 'p;');
+      assertHasRegion(HighlightRegionType.PARAMETER, 'p = 42');
     });
   }
 
@@ -835,10 +827,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
-      assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'aaa = 1');
-      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+      assertHasRegion(HighlightRegionType.SETTER_DECLARATION, 'aaa(x)');
+      assertHasRegion(HighlightRegionType.SETTER_DECLARATION, 'bbb(x)');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'aaa = 1');
+      assertHasRegion(HighlightRegionType.FIELD, 'bbb = 2');
     });
   }
 
@@ -852,10 +844,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV // annotation');
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV);');
-      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 1');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 0');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV // annotation');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV);');
+      assertHasRegion(HighlightRegionType.TOP_LEVEL_VARIABLE, 'VVV = 1');
     });
   }
 
@@ -866,9 +858,9 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
-      assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
-      assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
+      assertHasRegion(HighlightRegionType.TYPE_NAME_DYNAMIC, 'dynamic main()');
+      assertNoRegion(HighlightRegionType.IDENTIFIER_DEFAULT, 'dynamic main()');
+      assertNoRegion(HighlightRegionType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
     });
   }
 
@@ -880,10 +872,10 @@
 }
 ''');
     return prepareHighlights().then((_) {
-      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
-      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
-      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
-      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
+      assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T> {');
+      assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T fff;');
+      assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T mmm(');
+      assertHasRegion(HighlightRegionType.TYPE_PARAMETER, 'T p)');
     });
   }
 
@@ -899,18 +891,18 @@
 @ReflectiveTestCase()
 class HighlightTypeTest {
   void test_toString() {
-    expect(HighlightType.CLASS.toString(), HighlightType.CLASS.name);
+    expect(HighlightRegionType.CLASS.toString(), 'HighlightRegionType.CLASS');
   }
 
-  void test_valueOf() {
+  void test_constructor() {
     expect(
-        HighlightType.CLASS,
-        HighlightType.valueOf(HighlightType.CLASS.name));
+        HighlightRegionType.CLASS,
+        new HighlightRegionType(HighlightRegionType.CLASS.name));
   }
 
   void test_valueOf_unknown() {
     expect(() {
-      HighlightType.valueOf('no-such-type');
+      new HighlightRegionType('no-such-type');
     }, throws);
   }
 }
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index b14b8da..0ea9303 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -6,11 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -164,22 +161,9 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_NAVIGATION) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        regions = <NavigationRegion>[];
-        List<Map<String, Object>> regionsJson =
-            notification.getParameter(REGIONS);
-        for (Map<String, Object> regionJson in regionsJson) {
-          var regionOffset = regionJson[OFFSET];
-          var regionLength = regionJson[LENGTH];
-          List<Element> targets = <Element>[];
-          for (Map<String, Object> targetJson in regionJson[TARGETS]) {
-            targets.add(new Element.fromJson(targetJson));
-          }
-          var region =
-              new NavigationRegion(regionOffset, regionLength, targets);
-          regions.add(region);
-        }
+      var params = new AnalysisNavigationParams.fromNotification(notification);
+      if (params.file == testFile) {
+        regions = params.regions;
       }
     }
   }
@@ -494,17 +478,3 @@
     });
   }
 }
-
-
-class NavigationRegion {
-  final int offset;
-  final int length;
-  final List<Element> targets;
-
-  NavigationRegion(this.offset, this.length, this.targets);
-
-  @override
-  String toString() {
-    return 'NavigationRegion(offset=$offset; length=$length; targets=$targets';
-  }
-}
diff --git a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
index 3f2ed6a..9685598 100644
--- a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
@@ -6,12 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/computer_occurrences.dart';
-import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -89,14 +85,9 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_OCCURRENCES) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        occurrencesList = <Occurrences>[];
-        List<Map<String, Object>> jsonList =
-            notification.getParameter(OCCURRENCES);
-        for (Map<String, Object> json in jsonList) {
-          occurrencesList.add(new Occurrences.fromJson(json));
-        }
+      var params = new AnalysisOccurrencesParams.fromNotification(notification);
+      if (params.file == testFile) {
+        occurrencesList = params.occurrences;
       }
     }
   }
diff --git a/pkg/analysis_server/test/analysis_notification_outline_test.dart b/pkg/analysis_server/test/analysis_notification_outline_test.dart
index a2bf49e..c722d83 100644
--- a/pkg/analysis_server/test/analysis_notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_outline_test.dart
@@ -6,12 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/computer_outline.dart';
-import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -34,10 +30,9 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_OUTLINE) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        Map<String, Object> json = notification.getParameter(OUTLINE);
-        outline = new Outline.fromJson(json);
+      var params = new AnalysisOutlineParams.fromNotification(notification);
+      if (params.file == testFile) {
+        outline = params.outline;
       }
     }
   }
diff --git a/pkg/analysis_server/test/analysis_notification_overrides_test.dart b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
index 873c16e..b6c37ac 100644
--- a/pkg/analysis_server/test/analysis_notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
@@ -6,11 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/computer_overrides.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -72,7 +69,7 @@
    * Asserts that there are no overridden members from interfaces.
    */
   void assertNoInterfaceMembers() {
-    expect(override.interfaceMembers, isNull);
+    expect(override.interfaceMembers, isEmpty);
   }
 
   /**
@@ -116,11 +113,9 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_OVERRIDES) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        List<Map<String, Object>> jsonList =
-            notification.getParameter(OVERRIDES);
-        overridesList = jsonList.map(Override.fromJson).toList();
+      var params = new AnalysisOverridesParams.fromNotification(notification);
+      if (params.file == testFile) {
+        overridesList = params.overrides;
       }
     }
   }
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 1d93a5f..36e8fcc 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -44,15 +44,15 @@
         // expect at least one notification indicating analysis is in progress
         expect(notifications.any((Notification notification) {
           if (notification.event == SERVER_STATUS) {
-            Map analysisStatus = notification.params['analysis'];
-            return analysisStatus['analyzing'];
+            var params = new ServerStatusParams.fromNotification(notification);
+            return params.analysis.isAnalyzing;
           }
           return false;
         }), isTrue);
         // the last notification should indicate that analysis is complete
         Notification notification = notifications[notifications.length - 1];
-        Map analysisStatus = notification.params['analysis'];
-        expect(analysisStatus['analyzing'], isFalse);
+        var params = new ServerStatusParams.fromNotification(notification);
+        expect(params.analysis.isAnalyzing, isFalse);
       });
     });
 
@@ -121,9 +121,7 @@
   @override
   Response handleRequest(Request request) {
     if (request.method == 'echo') {
-      var response = new Response(request.id);
-      response.setResult('echo', true);
-      return response;
+      return new Response(request.id, result: {'echo': true});
     }
     return null;
   }
diff --git a/pkg/analysis_server/test/channel_test.dart b/pkg/analysis_server/test/channel_test.dart
index 95e9cc6..e1909ae 100644
--- a/pkg/analysis_server/test/channel_test.dart
+++ b/pkg/analysis_server/test/channel_test.dart
@@ -9,7 +9,7 @@
 import 'dart:io';
 
 import 'package:analysis_server/src/channel.dart';
-import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/protocol.dart' hide Error;
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
@@ -250,7 +250,7 @@
     int assertCount = 0;
     Request request = new Request('72', 'foo.bar');
     outputLineStream.first
-        .then((line) => new JsonDecoder().convert(line))
+        .then((line) => JSON.decode(line))
         .then((json) {
           expect(json[Request.ID], equals('72'));
           expect(json[Request.METHOD], equals('foo.bar'));
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
index 8a71396..686c80d 100644
--- a/pkg/analysis_server/test/computer/element_test.dart
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -4,8 +4,7 @@
 
 library test.computer.element;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_services/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_testing/abstract_context.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -25,101 +24,102 @@
 
 class ElementKindTest {
   void test_toString() {
-    expect(ElementKind.CLASS.toString(), 'CLASS');
-    expect(ElementKind.COMPILATION_UNIT.toString(), 'COMPILATION_UNIT');
+    expect(ElementKind.CLASS.toString(), 'ElementKind.CLASS');
+    expect(ElementKind.COMPILATION_UNIT.toString(),
+        'ElementKind.COMPILATION_UNIT');
   }
 
-  void test_valueOf() {
-    expect(ElementKind.valueOf(ElementKind.CLASS.name), ElementKind.CLASS);
+  void test_string_constructor() {
+    expect(new ElementKind(ElementKind.CLASS.name), ElementKind.CLASS);
     expect(
-        ElementKind.valueOf(ElementKind.CLASS_TYPE_ALIAS.name),
+        new ElementKind(ElementKind.CLASS_TYPE_ALIAS.name),
         ElementKind.CLASS_TYPE_ALIAS);
     expect(
-        ElementKind.valueOf(ElementKind.COMPILATION_UNIT.name),
+        new ElementKind(ElementKind.COMPILATION_UNIT.name),
         ElementKind.COMPILATION_UNIT);
     expect(
-        ElementKind.valueOf(ElementKind.CONSTRUCTOR.name),
+        new ElementKind(ElementKind.CONSTRUCTOR.name),
         ElementKind.CONSTRUCTOR);
-    expect(ElementKind.valueOf(ElementKind.FIELD.name), ElementKind.FIELD);
+    expect(new ElementKind(ElementKind.FIELD.name), ElementKind.FIELD);
     expect(
-        ElementKind.valueOf(ElementKind.FUNCTION.name),
+        new ElementKind(ElementKind.FUNCTION.name),
         ElementKind.FUNCTION);
     expect(
-        ElementKind.valueOf(ElementKind.FUNCTION_TYPE_ALIAS.name),
+        new ElementKind(ElementKind.FUNCTION_TYPE_ALIAS.name),
         ElementKind.FUNCTION_TYPE_ALIAS);
-    expect(ElementKind.valueOf(ElementKind.GETTER.name), ElementKind.GETTER);
-    expect(ElementKind.valueOf(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
+    expect(new ElementKind(ElementKind.GETTER.name), ElementKind.GETTER);
+    expect(new ElementKind(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
     expect(
-        ElementKind.valueOf(ElementKind.LOCAL_VARIABLE.name),
+        new ElementKind(ElementKind.LOCAL_VARIABLE.name),
         ElementKind.LOCAL_VARIABLE);
-    expect(ElementKind.valueOf(ElementKind.METHOD.name), ElementKind.METHOD);
+    expect(new ElementKind(ElementKind.METHOD.name), ElementKind.METHOD);
     expect(
-        ElementKind.valueOf(ElementKind.PARAMETER.name),
+        new ElementKind(ElementKind.PARAMETER.name),
         ElementKind.PARAMETER);
-    expect(ElementKind.valueOf(ElementKind.SETTER.name), ElementKind.SETTER);
+    expect(new ElementKind(ElementKind.SETTER.name), ElementKind.SETTER);
     expect(
-        ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
+        new ElementKind(ElementKind.TOP_LEVEL_VARIABLE.name),
         ElementKind.TOP_LEVEL_VARIABLE);
     expect(
-        ElementKind.valueOf(ElementKind.TYPE_PARAMETER.name),
+        new ElementKind(ElementKind.TYPE_PARAMETER.name),
         ElementKind.TYPE_PARAMETER);
     expect(
-        ElementKind.valueOf(ElementKind.UNIT_TEST_CASE.name),
-        ElementKind.UNIT_TEST_CASE);
+        new ElementKind(ElementKind.UNIT_TEST_TEST.name),
+        ElementKind.UNIT_TEST_TEST);
     expect(
-        ElementKind.valueOf(ElementKind.UNIT_TEST_GROUP.name),
+        new ElementKind(ElementKind.UNIT_TEST_GROUP.name),
         ElementKind.UNIT_TEST_GROUP);
-    expect(ElementKind.valueOf(ElementKind.UNKNOWN.name), ElementKind.UNKNOWN);
+    expect(new ElementKind(ElementKind.UNKNOWN.name), ElementKind.UNKNOWN);
     expect(() {
-      ElementKind.valueOf('no-such-kind');
+      new ElementKind('no-such-kind');
     }, throws);
   }
 
-  void test_valueOfEngine() {
+  void test_fromEngine() {
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.CLASS),
+        new ElementKind.fromEngine(engine.ElementKind.CLASS),
         ElementKind.CLASS);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.COMPILATION_UNIT),
+        new ElementKind.fromEngine(engine.ElementKind.COMPILATION_UNIT),
         ElementKind.COMPILATION_UNIT);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.CONSTRUCTOR),
+        new ElementKind.fromEngine(engine.ElementKind.CONSTRUCTOR),
         ElementKind.CONSTRUCTOR);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.FIELD),
+        new ElementKind.fromEngine(engine.ElementKind.FIELD),
         ElementKind.FIELD);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.FUNCTION),
+        new ElementKind.fromEngine(engine.ElementKind.FUNCTION),
         ElementKind.FUNCTION);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
+        new ElementKind.fromEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
         ElementKind.FUNCTION_TYPE_ALIAS);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.GETTER),
+        new ElementKind.fromEngine(engine.ElementKind.GETTER),
         ElementKind.GETTER);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
+        new ElementKind.fromEngine(engine.ElementKind.LIBRARY),
         ElementKind.LIBRARY);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.LOCAL_VARIABLE),
+        new ElementKind.fromEngine(engine.ElementKind.LOCAL_VARIABLE),
         ElementKind.LOCAL_VARIABLE);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.METHOD),
+        new ElementKind.fromEngine(engine.ElementKind.METHOD),
         ElementKind.METHOD);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.PARAMETER),
+        new ElementKind.fromEngine(engine.ElementKind.PARAMETER),
         ElementKind.PARAMETER);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.SETTER),
+        new ElementKind.fromEngine(engine.ElementKind.SETTER),
         ElementKind.SETTER);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
+        new ElementKind.fromEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
         ElementKind.TOP_LEVEL_VARIABLE);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.TYPE_PARAMETER),
+        new ElementKind.fromEngine(engine.ElementKind.TYPE_PARAMETER),
         ElementKind.TYPE_PARAMETER);
     expect(
-        ElementKind.valueOfEngine(engine.ElementKind.ANGULAR_COMPONENT),
+        new ElementKind.fromEngine(engine.ElementKind.ANGULAR_COMPONENT),
         ElementKind.UNKNOWN);
   }
 }
@@ -254,64 +254,4 @@
     expect(element.returnType, 'List<String>');
     expect(element.flags, Element.FLAG_STATIC);
   }
-
-  void test_fromJson() {
-    var flags =
-        Element.FLAG_DEPRECATED |
-        Element.FLAG_PRIVATE |
-        Element.FLAG_STATIC;
-    var json = {
-      KIND: 'METHOD',
-      NAME: 'my name',
-      LOCATION: {
-        FILE: '/project/file.dart',
-        OFFSET: 1,
-        LENGTH: 2,
-        START_LINE: 3,
-        START_COLUMN: 4,
-      },
-      FLAGS: flags,
-      PARAMETERS: '(int a, String b)',
-      RETURN_TYPE: 'List<String>'
-    };
-    Element element = new Element.fromJson(json);
-    expect(element.kind, ElementKind.METHOD);
-    expect(element.name, 'my name');
-    {
-      Location location = element.location;
-      expect(location.file, '/project/file.dart');
-      expect(location.offset, 1);
-      expect(location.length, 2);
-      expect(location.startLine, 3);
-      expect(location.startColumn, 4);
-    }
-    expect(element.flags, flags);
-    expect(element.isAbstract, isFalse);
-    expect(element.isConst, isFalse);
-    expect(element.isDeprecated, isTrue);
-    expect(element.isFinal, isFalse);
-    expect(element.isPrivate, isTrue);
-    expect(element.isStatic, isTrue);
-  }
-
-  void test_toJson() {
-    var json = {
-      KIND: 'METHOD',
-      NAME: 'my name',
-      LOCATION: {
-        FILE: '/project/file.dart',
-        OFFSET: 1,
-        LENGTH: 2,
-        START_LINE: 3,
-        START_COLUMN: 4,
-      },
-      FLAGS: Element.FLAG_DEPRECATED |
-          Element.FLAG_PRIVATE |
-          Element.FLAG_STATIC,
-      PARAMETERS: '(int a, String b)',
-      RETURN_TYPE: 'List<String>'
-    };
-    Element element = new Element.fromJson(json);
-    expect(element.toJson(), equals(json));
-  }
 }
diff --git a/pkg/analysis_server/test/computer/error_test.dart b/pkg/analysis_server/test/computer/error_test.dart
index 57fa21f..61bc96a 100644
--- a/pkg/analysis_server/test/computer/error_test.dart
+++ b/pkg/analysis_server/test/computer/error_test.dart
@@ -4,9 +4,9 @@
 
 library test.computer.error;
 
-import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_services/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_testing/mocks.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/error.dart' as engine;
@@ -104,35 +104,6 @@
     });
   }
 
-  void test_fromJson() {
-    var json = {
-      SEVERITY: 'ERROR',
-      TYPE: 'SYNTACTIC_ERROR',
-      LOCATION: {
-        FILE: '/test.dart',
-        OFFSET: 19,
-        LENGTH: 1,
-        START_LINE: 2,
-        START_COLUMN: 11
-      },
-      MESSAGE: 'Expected to find \';\'',
-      CORRECTION: 'my correction'
-    };
-    AnalysisError error = AnalysisError.fromJson(json);
-    {
-      Location location = error.location;
-      expect(location.file, '/test.dart');
-      expect(location.offset, 19);
-      expect(location.length, 1);
-      expect(location.startLine, 2);
-      expect(location.startColumn, 11);
-    }
-    expect(error.message, "Expected to find ';'");
-    expect(error.severity, 'ERROR');
-    expect(error.type, 'SYNTACTIC_ERROR');
-    expect(error.correction, "my correction");
-  }
-
   void test_engineErrorsToJson() {
     var json = engineErrorsToJson(lineInfo, [engineError]);
     expect(json, unorderedEquals([{
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index a8c7250..7c3fbf5 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -7,15 +7,12 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computer/error.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/mock_sdk.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
@@ -50,13 +47,12 @@
 
   group('AnalysisDomainHandler', () {
     group('setAnalysisRoots', () {
-      Request request;
-
-      setUp(() {
-        request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-        request.setParameter(INCLUDED, []);
-        request.setParameter(EXCLUDED, []);
-      });
+      Response testSetAnalysisRoots(List<String> included,
+          List<String> excluded) {
+        Request request = new AnalysisSetAnalysisRootsParams(included,
+            excluded).toRequest('0');
+        return handler.handleRequest(request);
+      }
 
       group('excluded', () {
         test('excluded folder', () {
@@ -66,9 +62,7 @@
           resourceProvider.newFolder(project);
           resourceProvider.newFile(fileA, '// a');
           resourceProvider.newFile(fileB, '// b');
-          request.setParameter(INCLUDED, [project]);
-          request.setParameter(EXCLUDED, ['/project/bbb']);
-          var response = handler.handleRequest(request);
+          var response = testSetAnalysisRoots([project], ['/project/bbb']);
           var serverRef = server;
           expect(response, isResponseSuccess('0'));
           // unit "a" is resolved eventually
@@ -85,8 +79,7 @@
           resourceProvider.newFolder('/project');
           resourceProvider.newFile('/project/pubspec.yaml', 'name: project');
           resourceProvider.newFile('/project/bin/test.dart', 'main() {}');
-          request.setParameter(INCLUDED, ['/project']);
-          var response = handler.handleRequest(request);
+          var response = testSetAnalysisRoots(['/project'], []);
           var serverRef = server;
           expect(response, isResponseSuccess('0'));
           // verify that unit is resolved eventually
@@ -101,8 +94,10 @@
 
     group('setPriorityFiles', () {
       test('invalid', () {
-        var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
-        request.setParameter(FILES, ['/project/lib.dart']);
+        // TODO(paulberry): under the "eventual consistency" model this request
+        // should not be invalid.
+        var request = new AnalysisSetPriorityFilesParams(
+            ['/project/lib.dart']).toRequest('0');
         var response = handler.handleRequest(request);
         expect(response, isResponseFailure('0'));
       });
@@ -114,15 +109,14 @@
         resourceProvider.newFile('/p2/b.dart', 'library b;');
         resourceProvider.newFile('/p2/c.dart', 'library c;');
 
-        var setRootsRequest = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-        setRootsRequest.setParameter(INCLUDED, ['/p1', '/p2']);
-        setRootsRequest.setParameter(EXCLUDED, []);
+        var setRootsRequest = new AnalysisSetAnalysisRootsParams(
+            ['/p1', '/p2'], []).toRequest('0');
         var setRootsResponse = handler.handleRequest(setRootsRequest);
         expect(setRootsResponse, isResponseSuccess('0'));
 
         void setPriorityFiles(List<String> fileList) {
-          var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
-          request.setParameter(FILES, fileList);
+          var request = new AnalysisSetPriorityFilesParams(
+              fileList).toRequest('0');
           var response = handler.handleRequest(request);
           expect(response, isResponseSuccess('0'));
           // TODO(brianwilkerson) Enable the line below after getPriorityFiles
@@ -138,29 +132,34 @@
 
     group('updateOptions', () {
       test('invalid', () {
-        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
-        request.setParameter(OPTIONS, {
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS, {OPTIONS: {
           'not-an-option': true
-        });
+        }});
         var response = handler.handleRequest(request);
-        expect(response, isResponseFailure('0'));
+        // Invalid options should be silently ignored.
+        expect(response, isResponseSuccess('0'));
       });
 
-      test('valid', () {
-        AnalysisOptions options = server.contextDirectoryManager.defaultOptions;
-        bool analyzeAngular = !options.analyzeAngular;
-        bool enableDeferredLoading = options.enableDeferredLoading;
-        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
-        request.setParameter(OPTIONS, {
-          'analyzeAngular': analyzeAngular,
-          'enableDeferredLoading': enableDeferredLoading,
-          'enableEnums': false
-        });
+      test('null', () {
+        // null is allowed as a synonym for {}.
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS, {OPTIONS: null});
         var response = handler.handleRequest(request);
         expect(response, isResponseSuccess('0'));
-        expect(options.analyzeAngular, equals(analyzeAngular));
-        expect(options.enableDeferredLoading, equals(enableDeferredLoading));
       });
+
+      // TODO(paulberry): disabled because analyzeAngular is currently not in the API.
+//      test('valid', () {
+//        engine.AnalysisOptions oldOptions = server.contextDirectoryManager.defaultOptions;
+//        bool analyzeAngular = !oldOptions.analyzeAngular;
+//        bool enableDeferredLoading = oldOptions.enableDeferredLoading;
+//        var newOptions = new AnalysisOptions(analyzeAngular: analyzeAngular,
+//            enableDeferredLoading: enableDeferredLoading, enableEnums: false);
+//        var request = new AnalysisUpdateOptionsParams(newOptions).toRequest('0');
+//        var response = handler.handleRequest(request);
+//        expect(response, isResponseSuccess('0'));
+//        expect(oldOptions.analyzeAngular, equals(analyzeAngular));
+//        expect(oldOptions.enableDeferredLoading, equals(enableDeferredLoading));
+//      });
     });
   });
 }
@@ -171,10 +170,11 @@
     AnalysisTestHelper helper = new AnalysisTestHelper();
     helper.createSingleFileProject('// empty');
     return helper.waitForOperationsFinished().then((_) {
-      Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
-      request.setParameter('files', {
-        helper.testFile: {
-          TYPE: 'foo',
+      Request request = new Request('0', ANALYSIS_UPDATE_CONTENT, {
+        'files': {
+          helper.testFile: {
+            TYPE: 'foo',
+          }
         }
       });
       Response response = helper.handler.handleRequest(request);
@@ -190,10 +190,7 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
-      helper.sendContentChange({
-        TYPE: ADD,
-        CONTENT: 'library lib'
-      });
+      helper.sendContentChange(new AddContentOverlay('library lib'));
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -211,17 +208,10 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // Add the file to the cache
-      helper.sendContentChange({
-        TYPE: ADD,
-        CONTENT: initialContent
-      });
+      helper.sendContentChange(new AddContentOverlay(initialContent));
       // update code
-      helper.sendContentChange({
-        TYPE: CHANGE,
-        REPLACEMENT: 'lib',
-        OFFSET: 'library '.length,
-        LENGTH: 'A;'.length,
-      });
+      helper.sendContentChange(new ChangeContentOverlay([
+          new SourceEdit('library '.length, 'A;'.length, 'lib')]));
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -252,10 +242,7 @@
     helper.createSingleFileProject('library A;');
     return helper.waitForOperationsFinished().then((_) {
       // update code
-      helper.sendContentChange({
-        TYPE: ADD,
-        CONTENT: 'library B;'
-      });
+      helper.sendContentChange(new AddContentOverlay('library B;'));
       // There should be no errors
       return helper.waitForOperationsFinished().then((_) {
         expect(helper.getTestErrors(), hasLength(0));
@@ -266,9 +253,7 @@
           expect(helper.getTestErrors(), hasLength(0));
           // Send a content change with a null content param--file should be
           // reread from disk.
-          helper.sendContentChange({
-            TYPE: REMOVE
-          });
+          helper.sendContentChange(new RemoveContentOverlay());
           // There should be errors now.
           return helper.waitForOperationsFinished().then((_) {
             expect(helper.getTestErrors(), hasLength(1));
@@ -359,9 +344,8 @@
 
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_ERRORS) {
-      String file = notification.getParameter(FILE);
-      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
-      filesErrors[file] = errorMaps.map(AnalysisError.fromJson).toList();
+      var decoded = new AnalysisErrorsParams.fromNotification(notification);
+      filesErrors[decoded.file] = decoded.errors;
     }
   }
 
@@ -433,11 +417,11 @@
   AnalysisServer server;
   AnalysisDomainHandler handler;
 
-  Map<String, List<String>> analysisSubscriptions = {};
+  Map<AnalysisService, List<String>> analysisSubscriptions = {};
 
   Map<String, List<AnalysisError>> filesErrors = {};
-  Map<String, List<Map<String, Object>>> filesHighlights = {};
-  Map<String, List<Map<String, Object>>> filesNavigation = {};
+  Map<String, List<HighlightRegion>> filesHighlights = {};
+  Map<String, List<NavigationRegion>> filesNavigation = {};
 
   String testFile = '/project/bin/test.dart';
   String testCode;
@@ -457,32 +441,31 @@
         serverChannel.notificationController.stream;
     notificationStream.listen((Notification notification) {
       if (notification.event == ANALYSIS_ERRORS) {
-        String file = notification.getParameter(FILE);
-        List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
-        filesErrors[file] = errorMaps.map(AnalysisError.fromJson).toList();
+        var decoded = new AnalysisErrorsParams.fromNotification(notification);
+        filesErrors[decoded.file] = decoded.errors;
       }
       if (notification.event == ANALYSIS_HIGHLIGHTS) {
-        String file = notification.getParameter(FILE);
-        filesHighlights[file] = notification.getParameter(REGIONS);
+        var params = new AnalysisHighlightsParams.fromNotification(notification);
+        filesHighlights[params.file] = params.regions;
       }
       if (notification.event == ANALYSIS_NAVIGATION) {
-        String file = notification.getParameter(FILE);
-        filesNavigation[file] = notification.getParameter(REGIONS);
+        var params = new AnalysisNavigationParams.fromNotification(notification);
+        filesNavigation[params.file] = params.regions;
       }
     });
   }
 
   void addAnalysisSubscription(AnalysisService service, String file) {
     // add file to subscription
-    var files = analysisSubscriptions[service.name];
+    var files = analysisSubscriptions[service];
     if (files == null) {
       files = <String>[];
-      analysisSubscriptions[service.name] = files;
+      analysisSubscriptions[service] = files;
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
-    request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
+    Request request = new AnalysisSetSubscriptionsParams(
+        analysisSubscriptions).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
@@ -499,9 +482,8 @@
    */
   void createEmptyProject() {
     resourceProvider.newFolder('/project');
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, ['/project']);
-    request.setParameter(EXCLUDED, []);
+    Request request = new AnalysisSetAnalysisRootsParams(['/project'],
+        []).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
@@ -513,9 +495,8 @@
     this.testCode = _getCodeString(code);
     resourceProvider.newFolder('/project');
     resourceProvider.newFile(testFile, testCode);
-    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
-    request.setParameter(INCLUDED, ['/project']);
-    request.setParameter(EXCLUDED, []);
+    Request request = new AnalysisSetAnalysisRootsParams(['/project'],
+        []).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
@@ -545,8 +526,8 @@
    * Returns highlights recorded for the given [file].
    * May be empty, but not `null`.
    */
-  List<Map<String, Object>> getHighlights(String file) {
-    List<Map<String, Object>> highlights = filesHighlights[file];
+  List<HighlightRegion> getHighlights(String file) {
+    List<HighlightRegion> highlights = filesHighlights[file];
     if (highlights != null) {
       return highlights;
     }
@@ -557,8 +538,8 @@
    * Returns navigation regions recorded for the given [file].
    * May be empty, but not `null`.
    */
-  List<Map<String, Object>> getNavigation(String file) {
-    List<Map<String, Object>> navigation = filesNavigation[file];
+  List<NavigationRegion> getNavigation(String file) {
+    List<NavigationRegion> navigation = filesNavigation[file];
     if (navigation != null) {
       return navigation;
     }
@@ -577,7 +558,7 @@
    * Returns highlights recorded for the given [testFile].
    * May be empty, but not `null`.
    */
-  List<Map<String, Object>> getTestHighlights() {
+  List<HighlightRegion> getTestHighlights() {
     return getHighlights(testFile);
   }
 
@@ -585,7 +566,7 @@
    * Returns navigation information recorded for the given [testFile].
    * May be empty, but not `null`.
    */
-  List<Map<String, Object>> getTestNavigation() {
+  List<NavigationRegion> getTestNavigation() {
     return getNavigation(testFile);
   }
 
@@ -600,11 +581,9 @@
   /**
    * Send an `updateContent` request for [testFile].
    */
-  void sendContentChange(Map contentChange) {
-    Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
-    request.setParameter('files', {
-      testFile: contentChange
-    });
+  void sendContentChange(dynamic contentChange) {
+    Request request = new AnalysisUpdateContentParams({
+      testFile: contentChange}).toRequest('0');
     handleSuccessfulRequest(request);
   }
 
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index c64fa6f..4284706 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -9,10 +9,8 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart' show Index;
-import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/index/index.dart' show Index;
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -86,11 +84,11 @@
 
   Future getSuggestions() {
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', COMPLETION_GET_SUGGESTIONS);
-      request.setParameter(FILE, testFile);
-      request.setParameter(OFFSET, completionOffset);
+      Request request = new CompletionGetSuggestionsParams(testFile,
+          completionOffset).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      completionId = response.getResult(ID);
+      var result = new CompletionGetSuggestionsResult.fromResponse(response);
+      completionId = response.id;
       assertValidId(completionId);
       return pumpEventQueue().then((_) {
         expect(suggestionsDone, isTrue);
@@ -100,19 +98,16 @@
 
   void processNotification(Notification notification) {
     if (notification.event == COMPLETION_RESULTS) {
-      String id = notification.getParameter(ID);
+      var params = new CompletionResultsParams.fromNotification(notification);
+      String id = params.id;
       assertValidId(id);
       if (id == completionId) {
         expect(suggestionsDone, isFalse);
-        replacementOffset = notification.getParameter(REPLACEMENT_OFFSET);
-        replacementLength = notification.getParameter(REPLACEMENT_LENGTH);
-        suggestionsDone = notification.getParameter(LAST);
+        replacementOffset = params.replacementOffset;
+        replacementLength = params.replacementLength;
+        suggestionsDone = params.isLast;
         expect(suggestionsDone, isNotNull);
-        suggestions = [];
-        for (Map<String, Object> json in notification.getParameter(RESULTS)) {
-          expect(json, isNotNull);
-          suggestions.add(new CompletionSuggestion.fromJson(json));
-        }
+        suggestions = params.results;
       }
     }
   }
@@ -165,6 +160,17 @@
     });
   }
 
+  test_keyword() {
+    addTestFile('^');
+    return getSuggestions().then((_) {
+      expect(replacementOffset, equals(completionOffset));
+      expect(replacementLength, equals(0));
+      assertHasResult(CompletionSuggestionKind.KEYWORD, 'library');
+      assertHasResult(CompletionSuggestionKind.KEYWORD, 'import');
+      assertHasResult(CompletionSuggestionKind.KEYWORD, 'class');
+    });
+  }
+
   test_locals() {
     addTestFile('class A {var a; x() {var b;^}}');
     return getSuggestions().then((_) {
@@ -177,6 +183,15 @@
     });
   }
 
+  test_invocation() {
+    addTestFile('class A {b() {}} main() {A a; a.^}');
+    return getSuggestions().then((_) {
+      expect(replacementOffset, equals(completionOffset));
+      expect(replacementLength, equals(0));
+      assertHasResult(CompletionSuggestionKind.METHOD, 'b');
+    });
+  }
+
   test_topLevel() {
     addTestFile('''
       typedef foo();
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 71088dd..32ee9d7 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -9,7 +9,6 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/mock_sdk.dart';
 import 'package:unittest/unittest.dart';
 
@@ -30,7 +29,7 @@
 
   group('ServerDomainHandler', () {
     test('getVersion', () {
-      var request = new Request('0', SERVER_GET_VERSION);
+      var request = new ServerGetVersionParams().toRequest('0');
       var response = handler.handleRequest(request);
       expect(response.toJson(), equals({
         Response.ID: '0',
@@ -41,15 +40,10 @@
     });
 
     group('setSubscriptions', () {
-      Request request;
-      setUp(() {
-        request = new Request('0', SERVER_SET_SUBSCRIPTIONS);
-      });
-
       test('invalid service name', () {
-        request.setParameter(
-            SUBSCRIPTIONS,
-            ['noSuchService']);
+        Request request = new Request('0', SERVER_SET_SUBSCRIPTIONS, {
+          SUBSCRIPTIONS: ['noSuchService']
+        });
         var response = handler.handleRequest(request);
         expect(response, isResponseFailure('0'));
       });
@@ -57,9 +51,8 @@
       test('success', () {
         expect(server.serverServices, isEmpty);
         // send request
-        request.setParameter(
-            SUBSCRIPTIONS,
-            [ServerService.STATUS.name]);
+        Request request = new ServerSetSubscriptionsParams(
+            [ServerService.STATUS]).toRequest('0');
         var response = handler.handleRequest(request);
         expect(response, isResponseSuccess('0'));
         // set of services has been changed
@@ -70,7 +63,7 @@
     test('shutdown', () {
       expect(server.running, isTrue);
       // send request
-      var request = new Request('0', SERVER_SHUTDOWN);
+      var request = new ServerShutdownParams().toRequest('0');
       var response = handler.handleRequest(request);
       expect(response, isResponseSuccess('0'));
       // server is down
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
new file mode 100644
index 0000000..f773808
--- /dev/null
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.edit.assists;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart' hide ERROR;
+
+import '../analysis_abstract.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(AssistsTest);
+}
+
+
+@ReflectiveTestCase()
+class AssistsTest extends AbstractAnalysisTest {
+  List<SourceChange> changes;
+
+  void prepareAssists(String search, [int length = 0]) {
+    int offset = findOffset(search);
+    prepareAssistsAt(offset, length);
+  }
+
+  void prepareAssistsAt(int offset, int length) {
+    Request request = new EditGetAssistsParams(testFile, offset,
+        length).toRequest('0');
+    Response response = handleSuccessfulRequest(request);
+    var result = new EditGetAssistsResult.fromResponse(response);
+    List<SourceChange> sourceChangeList = result.assists;
+    // TODO(scheglov) consider using generated classes and decoders
+    changes = sourceChangeList.map((SourceChange sourceChange) {
+      SourceChange change = new SourceChange(sourceChange.message);
+      sourceChange.edits.forEach((SourceFileEdit sourceFileEdit) {
+        SourceFileEdit fileEdit = new SourceFileEdit(sourceFileEdit.file);
+        change.edits.add(fileEdit);
+        fileEdit.edits.addAll(sourceFileEdit.edits);
+      });
+      return change;
+    }).toList();
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+    handler = new EditDomainHandler(server);
+  }
+
+  Future test_removeTypeAnnotation() {
+    addTestFile('''
+main() {
+  int v = 1;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      prepareAssists('v =');
+      _assertHasChange('Remove type annotation', '''
+main() {
+  var v = 1;
+}
+''');
+    });
+  }
+
+  Future test_splitVariableDeclaration() {
+    addTestFile('''
+main() {
+  int v = 1;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      prepareAssists('v =');
+      _assertHasChange('Split variable declaration', '''
+main() {
+  int v;
+  v = 1;
+}
+''');
+    });
+  }
+
+  Future test_surroundWithIf() {
+    addTestFile('''
+main() {
+  print(1);
+  print(2);
+}
+''');
+    return waitForTasksFinished().then((_) {
+      int offset = findOffset('  print(1)');
+      int length = findOffset('}') - offset;
+      prepareAssistsAt(offset, length);
+      _assertHasChange("Surround with 'if'", '''
+main() {
+  if (condition) {
+    print(1);
+    print(2);
+  }
+}
+''');
+    });
+  }
+
+  void _assertHasChange(String message, String expectedCode) {
+    for (SourceChange change in changes) {
+      if (change.message == message) {
+        String resultCode =
+            SourceEdit.applySequence(testCode, change.edits[0].edits);
+        expect(resultCode, expectedCode);
+        return;
+      }
+    }
+    fail("Expected to find |$message| in\n" + changes.join('\n'));
+  }
+}
diff --git a/pkg/analysis_server/test/edit/edit_domain_test.dart b/pkg/analysis_server/test/edit/edit_domain_test.dart
deleted file mode 100644
index 6e0b421..0000000
--- a/pkg/analysis_server/test/edit/edit_domain_test.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.domain.edit;
-
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/edit/edit_domain.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_testing/mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:unittest/unittest.dart';
-
-import '../mocks.dart';
-
-main() {
-  groupSep = ' | ';
-
-  MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
-  AnalysisServer server;
-  EditDomainHandler handler;
-
-  setUp(() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(
-        serverChannel, resourceProvider, new MockPackageMapProvider(), null,
-        new MockSdk());
-    handler = new EditDomainHandler(server);
-  });
-
-  group('EditDomainHandler', () {
-    test('applyRefactoring', () {
-      var request = new Request('0', EDIT_APPLY_REFACTORING);
-      request.setParameter(ID, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('createRefactoring', () {
-      var request = new Request('0', EDIT_CREATE_REFACTORING);
-      request.setParameter(KIND, null);
-      request.setParameter(FILE, null);
-      request.setParameter(OFFSET, null);
-      request.setParameter(LENGTH, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('deleteRefactoring', () {
-      var request = new Request('0', EDIT_DELETE_REFACTORING);
-      request.setParameter(ID, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('getAssists', () {
-      var request = new Request('0', EDIT_GET_ASSISTS);
-      request.setParameter(FILE, null);
-      request.setParameter(OFFSET, null);
-      request.setParameter(LENGTH, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('getFixes', () {
-      var request = new Request('0', EDIT_GET_FIXES);
-      request.setParameter(ERRORS, []);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('getRefactorings', () {
-      var request = new Request('0', EDIT_GET_REFACTORINGS);
-      request.setParameter(FILE, 'test.dart');
-      request.setParameter(OFFSET, 10);
-      request.setParameter(LENGTH, 20);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('setRefactoringOptions', () {
-      var request = new Request('0', EDIT_SET_REFACTORING_OPTIONS);
-      request.setParameter(ID, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-  });
-}
diff --git a/pkg/analysis_server/test/edit/fix_test.dart b/pkg/analysis_server/test/edit/fix_test.dart
deleted file mode 100644
index d3fd7a4..0000000
--- a/pkg/analysis_server/test/edit/fix_test.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.edit.fix;
-
-import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_server/src/edit/fix.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/correction/fix.dart' as services;
-import 'package:analysis_services/index/index.dart' hide Location;
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
-import 'package:analysis_testing/abstract_single_unit.dart';
-import 'package:analysis_testing/reflective_tests.dart';
-import 'package:analyzer/src/generated/element.dart' as engine;
-import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer/src/generated/error.dart' as engine;
-import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
-import 'package:unittest/unittest.dart' hide ERROR;
-
-
-
-main() {
-  groupSep = ' | ';
-  runReflectiveTests(ErrorFixesTest);
-}
-
-
-@ReflectiveTestCase()
-class ErrorFixesTest extends AbstractSingleUnitTest {
-  Index index;
-  SearchEngineImpl searchEngine;
-
-  void setUp() {
-    super.setUp();
-    index = createLocalMemoryIndex();
-    searchEngine = new SearchEngineImpl(index);
-    verifyNoTestUnitErrors = false;
-  }
-
-  void test_fromService() {
-    verifyNoTestUnitErrors = false;
-    resolveTestUnit('''
-main() {
-  print(42)
-}
-''');
-    engine.AnalysisErrorInfo errors = context.getErrors(testSource);
-    engine.AnalysisError engineError = errors.errors[0];
-    List<services.Fix> servicesFixes =
-        services.computeFixes(searchEngine, testUnit, engineError);
-    AnalysisError error =
-        new AnalysisError.fromEngine(errors.lineInfo, engineError);
-    ErrorFixes fixes = new ErrorFixes(error);
-    servicesFixes.forEach((fix) => fixes.addFix(fix));
-    expect(fixes.toJson(), {
-      ERROR: {
-        SEVERITY: 'ERROR',
-        TYPE: 'SYNTACTIC_ERROR',
-        LOCATION: {
-          FILE: '/test.dart',
-          OFFSET: 19,
-          LENGTH: 1,
-          START_LINE: 2,
-          START_COLUMN: 11
-        },
-        MESSAGE: 'Expected to find \';\''
-      },
-      FIXES: [{
-          MESSAGE: 'Insert \';\'',
-          EDITS: [{
-              FILE: '/test.dart',
-              EDITS: [{
-                  OFFSET: 20,
-                  LENGTH: 0,
-                  REPLACEMENT: ';'
-                }]
-            }],
-          LINKED_EDIT_GROUPS: []
-        }]
-    });
-  }
-}
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index 5170038..be02307 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -6,10 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
@@ -33,24 +31,47 @@
 
   Future test_hasFixes() {
     addTestFile('''
-main() {
-  print(42)
+foo() {
+  print(1)
+}
+bar() {
+  print(10) print(20)
 }
 ''');
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', EDIT_GET_FIXES);
-      request.setParameter(FILE, testFile);
-      request.setParameter(OFFSET, findOffset('print'));
-      Response response = handleSuccessfulRequest(request);
-      List<Map<String, Object>> errorFixesJsonList = response.getResult(FIXES);
-      expect(errorFixesJsonList, hasLength(1));
+      // print(1)
       {
-        Map<String, Object> fixes = errorFixesJsonList[0];
-        Map<String, Object> error = fixes[ERROR];
-        expect(error[SEVERITY], 'ERROR');
-        expect(error[TYPE], 'SYNTACTIC_ERROR');
-        expect(fixes[FIXES], hasLength(1));
+        List<ErrorFixes> errorFixes = _getFixesAt('print(1)');
+        expect(errorFixes, hasLength(1));
+        _isSyntacticErrorWithSingleFix(errorFixes[0]);
+      }
+      // print(10)
+      {
+        List<ErrorFixes> errorFixes = _getFixesAt('print(10)');
+        expect(errorFixes, hasLength(2));
+        _isSyntacticErrorWithSingleFix(errorFixes[0]);
+        _isSyntacticErrorWithSingleFix(errorFixes[1]);
       }
     });
   }
+
+  void _isSyntacticErrorWithSingleFix(ErrorFixes fixes) {
+    AnalysisError error = fixes.error;
+    expect(error.severity, ErrorSeverity.ERROR);
+    expect(error.type, ErrorType.SYNTACTIC_ERROR);
+    expect(fixes.fixes, hasLength(1));
+  }
+
+  List<ErrorFixes> _getFixesAt(String search) {
+    int offset = findOffset(search);
+    return _getFixes(offset);
+  }
+
+
+  List<ErrorFixes> _getFixes(int offset) {
+    Request request = new EditGetFixesParams(testFile, offset).toRequest('0');
+    Response response = handleSuccessfulRequest(request);
+    var result = new EditGetFixesResult.fromResponse(response);
+    return result.fixes;
+  }
 }
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
new file mode 100644
index 0000000..c35f386
--- /dev/null
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -0,0 +1,583 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.edit.refactoring;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart' hide ERROR;
+
+import '../analysis_abstract.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(GetAvailableRefactoringsTest);
+  runReflectiveTests(GetRefactoring_Rename_Test);
+}
+
+
+@ReflectiveTestCase()
+class GetAvailableRefactoringsTest extends AbstractAnalysisTest {
+  /**
+   * Tests that there is a RENAME refactoring available at the [search] offset.
+   */
+  Future assertHasRenameRefactoring(String code, String search) {
+    addTestFile(code);
+    return waitForTasksFinished().then((_) {
+      List<RefactoringKind> kinds = getRefactoringsAtString(search);
+      expect(kinds, contains(RefactoringKind.RENAME));
+    });
+  }
+
+  /**
+   * Returns the list of available refactorings for the given [offset] and
+   * [length].
+   */
+  List<RefactoringKind> getRefactorings(int offset, int length) {
+    Request request = new EditGetAvailableRefactoringsParams(
+        testFile,
+        offset,
+        length).toRequest('0');
+    Response response = handleSuccessfulRequest(request);
+    var result = new EditGetAvailableRefactoringsResult.fromResponse(response);
+    return result.kinds;
+  }
+
+  /**
+   * Returns the list of available refactorings at the offset of [search].
+   */
+  List<RefactoringKind> getRefactoringsAtString(String search) {
+    int offset = findOffset(search);
+    return getRefactorings(offset, 0);
+  }
+
+  List<RefactoringKind> getRefactoringsForString(String search) {
+    int offset = findOffset(search);
+    return getRefactorings(offset, search.length);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+    handler = new EditDomainHandler(server);
+  }
+
+  Future test_extractLocal() {
+    addTestFile('''
+main() {
+  var a = 1 + 2;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      var search = '1 + 2';
+      List<RefactoringKind> kinds = getRefactoringsForString(search);
+      expect(kinds, contains(RefactoringKind.EXTRACT_LOCAL_VARIABLE));
+      expect(kinds, contains(RefactoringKind.EXTRACT_METHOD));
+    });
+  }
+
+  Future test_rename_hasElement_class() {
+    return assertHasRenameRefactoring('''
+class Test {}
+main() {
+  Test v;
+}
+''', 'Test v');
+  }
+
+  Future test_rename_hasElement_constructor() {
+    return assertHasRenameRefactoring('''
+class A {
+  A.test() {}
+}
+main() {
+  new A.test();
+}
+''', 'test();');
+  }
+
+  Future test_rename_hasElement_function() {
+    return assertHasRenameRefactoring('''
+main() {
+  test();
+}
+test() {}
+''', 'test();');
+  }
+
+  Future test_rename_hasElement_importElement_directive() {
+    return assertHasRenameRefactoring('''
+import 'dart:math' as math;
+main() {
+  math.PI;
+}
+''', 'import ');
+  }
+
+  Future test_rename_hasElement_importElement_prefixDecl() {
+    return assertHasRenameRefactoring('''
+import 'dart:math' as math;
+main() {
+  math.PI;
+}
+''', 'math;');
+  }
+
+  Future test_rename_hasElement_importElement_prefixRef() {
+    return assertHasRenameRefactoring('''
+import 'dart:async' as test;
+import 'dart:math' as test;
+main() {
+  test.PI;
+}
+''', 'test.PI;');
+  }
+
+  Future test_rename_hasElement_instanceGetter() {
+    return assertHasRenameRefactoring('''
+class A {
+  get test => 0;
+}
+main(A a) {
+  a.test;
+}
+''', 'test;');
+  }
+
+  Future test_rename_hasElement_instanceSetter() {
+    return assertHasRenameRefactoring('''
+class A {
+  set test(x) {}
+}
+main(A a) {
+  a.test = 2;
+}
+''', 'test = 2;');
+  }
+
+  Future test_rename_hasElement_library() {
+    return assertHasRenameRefactoring('''
+library my.lib;
+''', 'library ');
+  }
+
+  Future test_rename_hasElement_localVariable() {
+    return assertHasRenameRefactoring('''
+main() {
+  int test = 0;
+  print(test);
+}
+''', 'test = 0;');
+  }
+
+  Future test_rename_hasElement_method() {
+    return assertHasRenameRefactoring('''
+class A {
+  test() {}
+}
+main(A a) {
+  a.test();
+}
+''', 'test();');
+  }
+
+  Future test_rename_noElement() {
+    addTestFile('''
+main() {
+  // not an element
+}
+''');
+    return waitForTasksFinished().then((_) {
+      List<RefactoringKind> kinds =
+          getRefactoringsAtString('// not an element');
+      expect(kinds, isNot(contains(RefactoringKind.RENAME)));
+    });
+  }
+}
+
+
+@ReflectiveTestCase()
+class GetRefactoring_Rename_Test extends _AbstractGetRefactoring_Test {
+  test_class() {
+    addTestFile('''
+class Test {}
+main() {
+  Test v;
+}
+''');
+    String search = 'Test {}';
+    String newName = 'NewName';
+    return assertSuccessfulRefactoring(search, newName, '''
+class NewName {}
+main() {
+  NewName v;
+}
+''');
+  }
+
+  test_classMember_field() {
+    addTestFile('''
+class A {
+  var test = 0;
+  main() {
+    print(test);
+  }
+}
+''');
+    String search = 'test = 0';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+class A {
+  var newName = 0;
+  main() {
+    print(newName);
+  }
+}
+''');
+  }
+
+  test_classMember_getter() {
+    addTestFile('''
+class A {
+  get test => 0;
+  main() {
+    print(test);
+  }
+}
+''');
+    String search = 'test =>';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+class A {
+  get newName => 0;
+  main() {
+    print(newName);
+  }
+}
+''');
+  }
+
+  test_classMember_setter() {
+    addTestFile('''
+class A {
+  set test(x) {}
+  main() {
+    test = 0;
+  }
+}
+''');
+    String search = 'test = 0';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+class A {
+  set newName(x) {}
+  main() {
+    newName = 0;
+  }
+}
+''');
+  }
+
+  test_class_options_fatalError() {
+    addTestFile('''
+class Test {}
+main() {
+  Test v;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      String search = 'Test {}';
+      return sendRenameRequest(search, '').then((Response response) {
+        var result = new EditGetRefactoringResult.fromResponse(response);
+        assertResultProblemsFatal(result, 'Class name must not be empty.');
+        // ...there is no any change
+        expect(result.change, isNull);
+      });
+    });
+  }
+
+  test_class_validateOnly() {
+    addTestFile('''
+class Test {}
+main() {
+  Test v;
+}
+''');
+    String search = 'Test {}';
+    String newName = 'NewName';
+    return getRefactoringResult(
+        search,
+        newName,
+        validateOnly: true).then((result) {
+      assertResultProblemsOK(result);
+      expect(result.change, isNull);
+    });
+  }
+
+  test_class_warning() {
+    addTestFile('''
+class Test {}
+main() {
+  Test v;
+}
+''');
+    return waitForTasksFinished().then((_) {
+      String search = 'Test {}';
+      return sendRenameRequest(search, 'newName').then((Response response) {
+        var result = new EditGetRefactoringResult.fromResponse(response);
+        assertResultProblemsWarning(
+            result,
+            'Class name should start with an uppercase letter.');
+        // ...but there is still a change
+        assertTestRefactoringResult(result, '''
+class newName {}
+main() {
+  newName v;
+}
+''');
+      }).then((_) {
+        return sendRenameRequest(search, 'NewName').then((Response response) {
+          var result = new EditGetRefactoringResult.fromResponse(response);
+          // OK
+          assertResultProblemsOK(result);
+        });
+      });
+    });
+  }
+
+  test_constructor() {
+    addTestFile('''
+class A {
+  A.test() {}
+}
+main() {
+  new A.test();
+}
+''');
+    String search = 'test();';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+class A {
+  A.newName() {}
+}
+main() {
+  new A.newName();
+}
+''');
+  }
+
+  test_feedback() {
+    addTestFile('''
+class Test {}
+main() {
+  Test v;
+}
+''');
+    String search = 'st v;';
+    String newName = 'NewName';
+    return getRefactoringResult(search, newName).then((result) {
+      RenameFeedback feedback = result.feedback;
+      expect(feedback, isNotNull);
+      expect(feedback.offset, findOffset('Test v;'));
+      expect(feedback.length, 'Test'.length);
+    });
+  }
+
+  test_function() {
+    addTestFile('''
+test() {}
+main() {
+  test();
+  print(test);
+}
+''');
+    String search = 'test() {}';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+newName() {}
+main() {
+  newName();
+  print(newName);
+}
+''');
+  }
+
+  test_init_fatalError_noElement() {
+    addTestFile('// nothing to rename');
+    String search = '// nothing';
+    return getRefactoringResult(search, null).then((result) {
+      assertResultProblemsFatal(result, 'Unable to create a refactoring');
+      // ...there is no any change
+      expect(result.change, isNull);
+    });
+  }
+
+  test_localVariable() {
+    addTestFile('''
+main() {
+  int test = 0;
+  test = 1;
+  test += 2;
+  print(test);
+}
+''');
+    String search = 'test = 1';
+    String newName = 'newName';
+    return assertSuccessfulRefactoring(search, newName, '''
+main() {
+  int newName = 0;
+  newName = 1;
+  newName += 2;
+  print(newName);
+}
+''');
+  }
+
+  test_localVariable_finalCheck_shadowError() {
+    addTestFile('''
+main() {
+  var newName;
+  int test = 0;
+  print(test);
+}
+''');
+    String search = 'test = 0';
+    String newName = 'newName';
+    return getRefactoringResult(search, newName).then((result) {
+      assertResultProblemsError(result, "Duplicate local variable 'newName'.");
+    });
+  }
+}
+
+
+@ReflectiveTestCase()
+class _AbstractGetRefactoring_Test extends AbstractAnalysisTest {
+  /**
+   * Asserts that [result] has a single ERROR problem.
+   */
+  void assertResultProblemsError(EditGetRefactoringResult result,
+      [String message]) {
+    List<RefactoringProblem> problems = result.problems;
+    RefactoringProblem problem = problems[0];
+    expect(problems, hasLength(1));
+    expect(
+        problem.severity,
+        RefactoringProblemSeverity.ERROR,
+        reason: problem.toString());
+    if (message != null) {
+      expect(problem.message, message);
+    }
+  }
+
+  /**
+   * Asserts that [result] has a single FATAL problem.
+   */
+  void assertResultProblemsFatal(EditGetRefactoringResult result,
+      [String message]) {
+    List<RefactoringProblem> problems = result.problems;
+    RefactoringProblem problem = problems[0];
+    expect(problems, hasLength(1));
+    expect(
+        problem.severity,
+        RefactoringProblemSeverity.FATAL,
+        reason: problem.toString());
+    if (message != null) {
+      expect(problem.message, message);
+    }
+  }
+
+  /**
+   * Asserts that [result] has no problems at all.
+   */
+  void assertResultProblemsOK(EditGetRefactoringResult result) {
+    expect(result.problems, isEmpty);
+  }
+
+  /**
+   * Asserts that [result] has a single WARNING problem.
+   */
+  void assertResultProblemsWarning(EditGetRefactoringResult result,
+      [String message]) {
+    List<RefactoringProblem> problems = result.problems;
+    RefactoringProblem problem = problems[0];
+    expect(problems, hasLength(1));
+    expect(
+        problem.severity,
+        RefactoringProblemSeverity.WARNING,
+        reason: problem.toString());
+    if (message != null) {
+      expect(problem.message, message);
+    }
+  }
+
+  Future assertSuccessfulRefactoring(String search, String newName,
+      String expectedCode) {
+    return getRefactoringResult(search, newName).then((result) {
+      assertResultProblemsOK(result);
+      assertTestRefactoringResult(result, expectedCode);
+    });
+  }
+
+  /**
+   * Asserts that the given [EditGetRefactoringResult] has a [testFile] change
+   * which results in the [expectedCode].
+   */
+  void assertTestRefactoringResult(EditGetRefactoringResult result,
+      String expectedCode) {
+    SourceChange change = result.change;
+    expect(change, isNotNull);
+    for (SourceFileEdit fileEdit in change.edits) {
+      if (fileEdit.file == testFile) {
+        String actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+        expect(actualCode, expectedCode);
+        return;
+      }
+    }
+    fail('No SourceFileEdit for $testFile in $change');
+  }
+
+  @override
+  Index createIndex() {
+    return createLocalMemoryIndex();
+  }
+
+  Future<EditGetRefactoringResult> getRefactoringResult(String search,
+      String newName, {bool validateOnly: false}) {
+    return waitForTasksFinished().then((_) {
+      return sendRenameRequest(
+          search,
+          newName,
+          validateOnly: validateOnly).then((Response response) {
+        return new EditGetRefactoringResult.fromResponse(response);
+      });
+    });
+  }
+
+  Future sendRenameRequest(String search, String newName, {bool validateOnly:
+      false}) {
+    Request request = new EditGetRefactoringParams(
+        RefactoringKind.RENAME,
+        testFile,
+        findOffset(search),
+        0,
+        validateOnly,
+        options: new RenameOptions(newName)).toRequest('0');
+    return serverChannel.sendRequest(request);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    server.handlers = [new EditDomainHandler(server),];
+    createProject();
+    handler = new EditDomainHandler(server);
+  }
+}
diff --git a/pkg/analysis_server/test/edit/test_all.dart b/pkg/analysis_server/test/edit/test_all.dart
index 7c513b6..b5d6241 100644
--- a/pkg/analysis_server/test/edit/test_all.dart
+++ b/pkg/analysis_server/test/edit/test_all.dart
@@ -6,8 +6,9 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'edit_domain_test.dart' as domain_edit_test;
-import 'fix_test.dart' as fix_test;
+import 'assists_test.dart' as assists_test;
+import 'fixes_test.dart' as fixes_test;
+import 'refactoring_test.dart' as refactoring_test;
 
 /**
  * Utility for manually running all tests.
@@ -15,7 +16,8 @@
 main() {
   groupSep = ' | ';
   group('edit', () {
-    domain_edit_test.main();
-    fix_test.main();
+    assists_test.main();
+    fixes_test.main();
+    refactoring_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
new file mode 100644
index 0000000..245f2b9
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/navigation_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.
+
+library test.integration.analysis.navigation;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class AnalysisNavigationTest extends AbstractAnalysisServerIntegrationTest {
+  test_navigation() {
+    String pathname1 = sourcePath('test1.dart');
+    String text1 =
+        r'''
+library foo;
+
+import 'dart:async';
+part 'test2.dart';
+
+class Class<TypeParameter> {
+  Class.constructor(); /* constructor declaration */
+
+  TypeParameter field;
+
+  method() {}
+}
+
+typedef FunctionTypeAlias();
+
+function(FunctionTypeAlias parameter) {
+  print(parameter());
+}
+
+int topLevelVariable;
+
+main() {
+  Class<int> localVariable = new Class<int>.constructor();
+  function(() => localVariable.field);
+  localVariable.method();
+  localVariable.field = 1;
+}
+''';
+    writeFile(pathname1, text1);
+    String pathname2 = sourcePath('test2.dart');
+    String text2 =
+        r'''
+part of foo;
+''';
+    writeFile(pathname2, text2);
+    standardAnalysisSetup();
+    sendAnalysisSetSubscriptions({'NAVIGATION': [pathname1]});
+    List regions;
+    onAnalysisNavigation.listen((params) {
+      expect(params['file'], equals(pathname1));
+      regions = params['regions'];
+    });
+    return analysisFinished.then((_) {
+      // There should be a single error, due to the fact that 'dart:async' is
+      // not used.
+      expect(currentAnalysisErrors[pathname1], hasLength(1));
+      expect(currentAnalysisErrors[pathname2], isEmpty);
+      Map findTargetElement(int index) {
+        for (Map region in regions) {
+          if (region['offset'] <= index && index < region['offset'] + region['length']) {
+            expect(region['targets'], hasLength(1));
+            return region['targets'][0];
+          }
+        }
+        fail('No element found for index $index');
+        return null;
+      }
+      void checkLocal(String source, String expectedTarget, String expectedKind) {
+        int sourceIndex = text1.indexOf(source);
+        int targetIndex = text1.indexOf(expectedTarget);
+        Map element = findTargetElement(sourceIndex);
+        expect(element['location']['file'], equals(pathname1));
+        expect(element['location']['offset'], equals(targetIndex));
+        expect(element['kind'], equals(expectedKind));
+      }
+      void checkRemote(String source, String expectedTargetRegexp, String expectedKind) {
+        int sourceIndex = text1.indexOf(source);
+        Map element = findTargetElement(sourceIndex);
+        expect(element['location']['file'], matches(expectedTargetRegexp));
+        expect(element['kind'], equals(expectedKind));
+      }
+      // TODO(paulberry): will the element type 'CLASS_TYPE_ALIAS' ever appear
+      // as a navigation target?
+      checkLocal('Class<int>', 'Class<TypeParameter>', 'CLASS');
+      checkRemote("part 'test2.dart';", r'test2.dart$', 'COMPILATION_UNIT');
+      checkLocal('new Class<int>.constructor', 'constructor(); /* constructor declaration */', 'CONSTRUCTOR');
+      checkLocal('field;', 'field;', 'FIELD');
+      checkLocal('function(() => localVariable.field)', 'function(FunctionTypeAlias parameter)', 'FUNCTION');
+      checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();', 'FUNCTION_TYPE_ALIAS');
+      checkLocal('field)', 'field;', 'GETTER');
+      checkRemote("import 'dart:async'", r'async\.dart$', 'LIBRARY');
+      checkLocal('localVariable.field', 'localVariable =', 'LOCAL_VARIABLE');
+      checkLocal('method();', 'method() {', 'METHOD');
+      checkLocal('parameter());', 'parameter) {', 'PARAMETER');
+      checkLocal('field = 1', 'field;', 'SETTER');
+      checkLocal('topLevelVariable;', 'topLevelVariable;', 'TOP_LEVEL_VARIABLE');
+      checkLocal('TypeParameter field;', 'TypeParameter>', 'TYPE_PARAMETER');
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(AnalysisNavigationTest);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
new file mode 100644
index 0000000..87d8a9f
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.integration.analysis.occurrences;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_occurrences() {
+    String pathname = sourcePath('test.dart');
+    String text =
+        r'''
+main() {
+  int sum = 0;
+  for (int i = 0; i < 10; i++) {
+    for (int j = 0; j < i; j++) {
+      sum += j;
+    }
+  }
+  print(sum);
+}
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+    sendAnalysisSetSubscriptions({
+      'OCCURRENCES': [pathname]
+    });
+    List occurrences;
+    onAnalysisOccurrences.listen((params) {
+      expect(params['file'], equals(pathname));
+      occurrences = params['occurrences'];
+    });
+    return analysisFinished.then((_) {
+      expect(currentAnalysisErrors[pathname], isEmpty);
+      Set<int> findOffsets(String elementName) {
+        for (Map occurrence in occurrences) {
+          if (occurrence['element']['name'] == elementName) {
+            return occurrence['offsets'].toSet();
+          }
+        }
+        fail('No element found matching $elementName');
+        return null;
+      }
+      void check(String elementName, Iterable<String> expectedOccurrences) {
+        Set<int> expectedOffsets = expectedOccurrences.map((String substring) =>
+            text.indexOf(substring)).toSet();
+        Set<int> foundOffsets = findOffsets(elementName);
+        expect(foundOffsets, equals(expectedOffsets));
+      }
+      check('i', ['i = 0', 'i < 10', 'i++', 'i;']);
+      check('j', ['j = 0', 'j < i', 'j++', 'j;']);
+      check('sum', ['sum = 0', 'sum +=', 'sum)']);
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
new file mode 100644
index 0000000..6194a13
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.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 test.integration.analysis.outline;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_outline() {
+    String pathname = sourcePath('test.dart');
+    String text =
+        r'''
+class Class1 {
+  int field;
+
+  void method() {
+  }
+
+  static staticMethod() {
+  }
+
+  get getter {
+    return null;
+  }
+
+  set setter(value) {
+  }
+}
+
+class Class2 {
+}
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+    sendAnalysisSetSubscriptions({
+      'OUTLINE': [pathname]
+    });
+    Map outline;
+    onAnalysisOutline.listen((params) {
+      expect(params['file'], equals(pathname));
+      outline = params['outline'];
+    });
+    return analysisFinished.then((_) {
+      expect(outline['element']['kind'], equals('COMPILATION_UNIT'));
+      expect(outline['offset'], equals(0));
+      expect(outline['length'], equals(text.length));
+      List classes = outline['children'];
+      expect(classes, hasLength(2));
+      expect(classes[0]['element']['name'], equals('Class1'));
+      expect(classes[1]['element']['name'], equals('Class2'));
+      checkConnected(classes);
+      List members = classes[0]['children'];
+      expect(members, hasLength(5));
+      expect(members[0]['element']['name'], equals('field'));
+      expect(members[1]['element']['name'], equals('method'));
+      expect(members[2]['element']['name'], equals('staticMethod'));
+      expect(members[3]['element']['name'], equals('getter'));
+      expect(members[4]['element']['name'], equals('setter'));
+      checkConnected(members);
+    });
+  }
+
+  /**
+   * Verify that the range of source text covered by the given outline objects
+   * is connected (the end of each object in the list corresponds to the start
+   * of the next).
+   */
+  void checkConnected(List outlineObjects) {
+    for (int i = 0; i < outlineObjects.length - 1; i++) {
+      expect(outlineObjects[i + 1]['offset'], equals(outlineObjects[i]['offset']
+          + outlineObjects[i]['length']));
+    }
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
new file mode 100644
index 0000000..a5be8a2
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.integration.analysis.overrides;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_overrides() {
+    String pathname = sourcePath('test.dart');
+    String text =
+        r'''
+abstract class Interface1 {
+  method0();
+  method1();
+  method2();
+  method3();
+}
+
+abstract class Interface2 {
+  method0();
+  method1();
+  method4();
+  method5();
+}
+
+abstract class Base {
+  method0();
+  method2();
+  method4();
+  method6();
+}
+
+class Target extends Base implements Interface1, Interface2 {
+  method0() {}
+  method1() {}
+  method2() {}
+  method3() {}
+  method4() {}
+  method5() {}
+  method6() {}
+  method7() {}
+}
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+    sendAnalysisSetSubscriptions({
+      'OVERRIDES': [pathname]
+    });
+    List overrides;
+    onAnalysisOverrides.listen((params) {
+      expect(params['file'], equals(pathname));
+      overrides = params['overrides'];
+    });
+    return analysisFinished.then((_) {
+      int targetOffset = text.indexOf('Target');
+      Map findOverride(String methodName) {
+        int methodOffset = text.indexOf(methodName, targetOffset);
+        for (Map override in overrides) {
+          if (override['offset'] == methodOffset) {
+            return override;
+          }
+        }
+        return null;
+      }
+      void checkOverrides(String methodName, bool
+          expectedOverridesBase, List<String> expectedOverridesInterfaces) {
+        Map override = findOverride(methodName);
+        if (!expectedOverridesBase && expectedOverridesInterfaces.isEmpty) {
+          // This method overrides nothing, so it should not appear in the
+          // overrides list.
+          expect(override, isNull);
+          return;
+        } else {
+          expect(override, isNotNull);
+        }
+        expect(override['length'], equals(methodName.length));
+        Map superclassMember = override['superclassMember'];
+        if (expectedOverridesBase) {
+          expect(superclassMember['element']['name'], equals(methodName));
+          expect(superclassMember['className'], equals('Base'));
+        } else {
+          expect(superclassMember, isNull);
+        }
+        List interfaceMembers = override['interfaceMembers'];
+        if (expectedOverridesInterfaces.isNotEmpty) {
+          expect(interfaceMembers, isNotNull);
+          Set<String> actualOverridesInterfaces = new Set<String>();
+          for (Map overriddenMember in interfaceMembers) {
+            expect(overriddenMember['element']['name'], equals(methodName));
+            String className = overriddenMember['className'];
+            bool wasAdded = actualOverridesInterfaces.add(className);
+            expect(wasAdded, isTrue);
+          }
+          expect(actualOverridesInterfaces, equals(
+              expectedOverridesInterfaces.toSet()));
+        } else {
+          expect(interfaceMembers, isNull);
+        }
+      }
+      checkOverrides('method0', true, ['Interface1', 'Interface2']);
+      checkOverrides('method1', false, ['Interface1', 'Interface2']);
+      checkOverrides('method2', true, ['Interface1']);
+      checkOverrides('method3', false, ['Interface1']);
+      checkOverrides('method4', true, ['Interface2']);
+      checkOverrides('method5', false, ['Interface2']);
+      checkOverrides('method6', true, []);
+      checkOverrides('method7', false, []);
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index a3242c2..e834ba4 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -11,7 +11,12 @@
 import 'get_errors_before_analysis_test.dart' as get_errors_before_analysis_test;
 import 'get_hover_test.dart' as get_hover_test;
 import 'highlights_test.dart' as highlights_test;
+import 'navigation_test.dart' as navigation_test;
+import 'occurrences_test.dart' as occurrences_test;
+import 'outline_test.dart' as outline_test;
+import 'overrides_test.dart' as overrides_test;
 import 'update_content_test.dart' as update_content_test;
+import 'update_content_list_test.dart' as update_content_list_test;
 
 /**
  * Utility for manually running all integration tests.
@@ -24,6 +29,11 @@
     get_errors_before_analysis_test.main();
     get_hover_test.main();
     highlights_test.main();
+    navigation_test.main();
+    occurrences_test.main();
+    outline_test.main();
+    overrides_test.main();
     update_content_test.main();
+    update_content_list_test.main();
   });
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
new file mode 100644
index 0000000..1acc512
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.integration.analysis.update.content.list;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_updateContent_list() {
+    String pathname = sourcePath('test.dart');
+    String goodText = r'''
+main() {
+  print("Hello");
+  print("World!");
+}''';
+    String badText = goodText.replaceAll('"', '');
+    // Create a dummy file
+    writeFile(pathname, '// dummy text');
+    standardAnalysisSetup();
+    // Override file contents with badText.
+    sendAnalysisUpdateContent({
+      pathname: {
+        'type': 'add',
+        'content': badText
+      }
+    });
+    return analysisFinished.then((_) {
+      // The overridden contents (badText) are missing quotation marks.
+      expect(currentAnalysisErrors[pathname], isNot(isEmpty));
+    }).then((_) {
+      // Prepare a set of edits which add the missing quotation marks, in the
+      // order in which they appear in the file.  If these edits are applied in
+      // the wrong order, some of the quotation marks will be in the wrong
+      // places, and there will still be errors.
+      List edits = '"'.allMatches(goodText).map((Match match) => {
+        'offset': match.start,
+        'length': 0,
+        'replacement': '"'
+      }).toList();
+      sendAnalysisUpdateContent({
+        pathname: {
+          'type': 'change',
+          'edits': edits
+        }
+      });
+      return analysisFinished;
+    }).then((_) {
+      // There should be no errors now, assuming that quotation marks have been
+      // inserted in all the correct places.
+      expect(currentAnalysisErrors[pathname], isEmpty);
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index dcc0871..b4d1e3d 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -35,9 +35,11 @@
       return sendAnalysisUpdateContent({
         pathname: {
           'type': 'change',
-          'offset': goodText.indexOf(';'),
-          'length': 1,
-          'replacement': ''
+          'edits': [{
+              'offset': goodText.indexOf(';'),
+              'length': 1,
+              'replacement': ''
+            }]
         }
       });
     }).then((result) => analysisFinished).then((_) {
@@ -46,9 +48,11 @@
       return sendAnalysisUpdateContent({
         pathname: {
           'type': 'change',
-          'offset': goodText.indexOf(';'),
-          'length': 0,
-          'replacement': ';'
+          'edits': [{
+              'offset': goodText.indexOf(';'),
+              'length': 0,
+              'replacement': ';'
+            }]
         }
       });
     }).then((result) => analysisFinished).then((_) {
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 3c8f953..acf1619 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -115,7 +115,7 @@
    *
    * Parameters
    *
-   * fatal ( bool )
+   * isFatal ( bool )
    *
    *   True if the error is a fatal error, meaning that the server will
    *   shutdown automatically after sending this notification.
@@ -402,13 +402,13 @@
    *
    * Parameters
    *
-   * files ( Map<FilePath, object> )
+   * files ( Map<FilePath, AddContentOverlay | ChangeContentOverlay |
+   * RemoveContentOverlay> )
    *
    *   A table mapping the files whose content has changed to a description of
-   *   the content change. Each value should be one of the following types:
-   *   AddContentOverlay, ChangeContentOverlay, or RemoveContentOverlay.
+   *   the content change.
    */
-  Future sendAnalysisUpdateContent(Map<String, Map<String, dynamic>> files, {bool checkTypes: true}) {
+  Future sendAnalysisUpdateContent(Map<String, Object> files, {bool checkTypes: true}) {
     Map<String, dynamic> params = {};
     params["files"] = files;
     if (checkTypes) {
@@ -426,9 +426,8 @@
   /**
    * Update the options controlling analysis based on the given set of options.
    * Any options that are not included in the analysis options will not be
-   * changed. If there are options in the analysis options that are not valid
-   * an error will be reported but the values of the valid options will still
-   * be updated.
+   * changed. If there are options in the analysis options that are not valid,
+   * they will be silently ignored.
    *
    * Parameters
    *
@@ -636,10 +635,7 @@
   StreamController _onAnalysisOutline;
 
   /**
-   * Reports the overridding members in a file. This notification currently
-   * includes only members that override a member from a superclass. In
-   * particular, it does not include members that override members from
-   * interfaces.
+   * Reports the overridding members in a file.
    *
    * This notification is not subscribed to by default. Clients can subscribe
    * by including the value "OVERRIDES" in the list of services passed in an
@@ -725,9 +721,13 @@
    *
    * results ( List<CompletionSuggestion> )
    *
-   *   The completion suggestions being reported.
+   *   The completion suggestions being reported. The notification contains all
+   *   possible completions at the requested cursor position, even those that
+   *   do not match the characters the user has already typed. This allows the
+   *   client to respond to further keystrokes from the user without having to
+   *   make additional requests.
    *
-   * last ( bool )
+   * isLast ( bool )
    *
    *   True if this is that last set of results that will be returned for the
    *   indicated completion.
@@ -768,10 +768,13 @@
    *
    *   The identifier used to associate results with this search request.
    *
-   * element ( Element )
+   * element ( optional Element )
    *
    *   The element referenced or defined at the given offset and whose
    *   references will be returned in the search results.
+   *
+   *   If no element was found at the given location, this field will be
+   *   absent.
    */
   Future sendSearchFindElementReferences(String file, int offset, bool includePotential, {bool checkTypes: true}) {
     Map<String, dynamic> params = {};
@@ -957,7 +960,7 @@
    *
    *   The search results being reported.
    *
-   * last ( bool )
+   * isLast ( bool )
    *
    *   True if this is that last set of results that will be returned for the
    *   indicated search.
@@ -1099,9 +1102,9 @@
    *
    * Parameters
    *
-   * kindId ( RefactoringKind )
+   * kind ( RefactoringKind )
    *
-   *   The identifier of the kind of refactoring to be performed.
+   *   The kind of refactoring to be performed.
    *
    * file ( FilePath )
    *
@@ -1130,7 +1133,7 @@
    *
    * Returns
    *
-   * status ( List<RefactoringProblem> )
+   * problems ( List<RefactoringProblem> )
    *
    *   The status of the refactoring. The array will be empty if there are no
    *   known problems.
@@ -1145,13 +1148,23 @@
    * change ( optional SourceChange )
    *
    *   The changes that are to be applied to affect the refactoring. This field
-   *   will be omitted if there are problems that prevent a set of changed from
+   *   will be omitted if there are problems that prevent a set of changes from
    *   being computed, such as having no options specified for a refactoring
    *   that requires them, or if only validation was requested.
+   *
+   * potentialEdits ( optional List<String> )
+   *
+   *   The ids of source edits that are not known to be valid. An edit is not
+   *   known to be valid if there was insufficient type information for the
+   *   server to be able to determine whether or not the code needs to be
+   *   modified, such as when a member is being renamed and there is a
+   *   reference to a member from an unknown type. This field will be omitted
+   *   if the change field is omitted or if there are no potential edits for
+   *   the refactoring.
    */
-  Future sendEditGetRefactoring(String kindId, String file, int offset, int length, bool validateOnly, {Map<String, dynamic> options, bool checkTypes: true}) {
+  Future sendEditGetRefactoring(String kind, String file, int offset, int length, bool validateOnly, {Map<String, dynamic> options, bool checkTypes: true}) {
     Map<String, dynamic> params = {};
-    params["kindId"] = kindId;
+    params["kind"] = kind;
     params["file"] = file;
     params["offset"] = offset;
     params["length"] = length;
diff --git a/pkg/analysis_server/test/integration/integration_tests.dart b/pkg/analysis_server/test/integration/integration_tests.dart
index 798e743..d4467f2 100644
--- a/pkg/analysis_server/test/integration/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/integration_tests.dart
@@ -120,7 +120,7 @@
     subscription = onServerStatus.listen((params) {
       bool analysisComplete = false;
       try {
-        analysisComplete = !params['analysis']['analyzing'];
+        analysisComplete = !params['analysis']['isAnalyzing'];
       } catch (_) {
         // Status message was mal-formed or missing optional parameters.  That's
         // fine, since we'll detect a mal-formed status message below.
@@ -456,6 +456,103 @@
 Matcher isListOf(Matcher elementMatcher) => new _ListOf(elementMatcher);
 
 /**
+ * Type of closures used by LazyMatcher.
+ */
+typedef Matcher MatcherCreator();
+
+/**
+ * Wrapper class for Matcher which doesn't create the underlying Matcher object
+ * until it is needed.  This is necessary in order to create matchers that can
+ * refer to themselves (so that recursive data structures can be represented).
+ */
+class LazyMatcher implements Matcher {
+  /**
+   * Callback that will be used to create the matcher the first time it is
+   * needed.
+   */
+  final MatcherCreator _creator;
+
+  /**
+   * The matcher returned by [_creator], if it has already been called.
+   * Otherwise null.
+   */
+  Matcher _wrappedMatcher;
+
+  LazyMatcher(this._creator);
+
+  @override
+  Description describe(Description description) {
+    _createMatcher();
+    return _wrappedMatcher.describe(description);
+  }
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription, Map matchState, bool verbose) {
+    _createMatcher();
+    return _wrappedMatcher.describeMismatch(item, mismatchDescription, matchState, verbose);
+  }
+
+  @override
+  bool matches(item, Map matchState) {
+    _createMatcher();
+    return _wrappedMatcher.matches(item, matchState);
+  }
+
+  /**
+   * Create the wrapped matcher object, if it hasn't been created already.
+   */
+  void _createMatcher() {
+    if (_wrappedMatcher == null) {
+      _wrappedMatcher = _creator();
+    }
+  }
+}
+
+/**
+ * Matcher that matches a union of different types, each of which is described
+ * by a matcher.
+ */
+class _OneOf extends Matcher {
+  /**
+   * Matchers for the individual choices.
+   */
+  final List<Matcher> choiceMatchers;
+
+  _OneOf(this.choiceMatchers);
+
+  @override
+  bool matches(item, Map matchState) {
+    for (Matcher choiceMatcher in choiceMatchers) {
+      Map subState = {};
+      if (choiceMatcher.matches(item, subState)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  Description describe(Description description) {
+    for (int i = 0; i < choiceMatchers.length; i++) {
+      if (i != 0) {
+        if (choiceMatchers.length == 2) {
+          description = description.add(' or ');
+        } else {
+          description = description.add(', ');
+          if (i == choiceMatchers.length - 1) {
+            description = description.add('or ');
+          }
+        }
+      }
+      description = description.addDescriptionOf(choiceMatchers[i]);
+    }
+    return description;
+  }
+}
+
+Matcher isOneOf(List<Matcher> choiceMatchers) => new _OneOf(choiceMatchers);
+
+/**
  * Matcher that matches a map of objects, where each key/value pair in the
  * map satisies the given key and value matchers.
  */
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index dd107d6..e493623 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -28,10 +28,10 @@
  *   "version": String
  * }
  */
-final Matcher isServerGetVersionResult = new MatchesJsonObject(
+final Matcher isServerGetVersionResult = new LazyMatcher(() => new MatchesJsonObject(
   "server.getVersion result", {
     "version": isString
-  });
+  }));
 
 /**
  * server.shutdown params
@@ -50,10 +50,10 @@
  *   "subscriptions": List<ServerService>
  * }
  */
-final Matcher isServerSetSubscriptionsParams = new MatchesJsonObject(
+final Matcher isServerSetSubscriptionsParams = new LazyMatcher(() => new MatchesJsonObject(
   "server.setSubscriptions params", {
     "subscriptions": isListOf(isServerService)
-  });
+  }));
 
 /**
  * server.setSubscriptions result
@@ -69,17 +69,17 @@
  * server.error params
  *
  * {
- *   "fatal": bool
+ *   "isFatal": bool
  *   "message": String
  *   "stackTrace": String
  * }
  */
-final Matcher isServerErrorParams = new MatchesJsonObject(
+final Matcher isServerErrorParams = new LazyMatcher(() => new MatchesJsonObject(
   "server.error params", {
-    "fatal": isBool,
+    "isFatal": isBool,
     "message": isString,
     "stackTrace": isString
-  });
+  }));
 
 /**
  * server.status params
@@ -88,10 +88,10 @@
  *   "analysis": optional AnalysisStatus
  * }
  */
-final Matcher isServerStatusParams = new MatchesJsonObject(
+final Matcher isServerStatusParams = new LazyMatcher(() => new MatchesJsonObject(
   "server.status params", null, optionalFields: {
     "analysis": isAnalysisStatus
-  });
+  }));
 
 /**
  * analysis.getErrors params
@@ -100,10 +100,10 @@
  *   "file": FilePath
  * }
  */
-final Matcher isAnalysisGetErrorsParams = new MatchesJsonObject(
+final Matcher isAnalysisGetErrorsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.getErrors params", {
     "file": isFilePath
-  });
+  }));
 
 /**
  * analysis.getErrors result
@@ -112,10 +112,10 @@
  *   "errors": List<AnalysisError>
  * }
  */
-final Matcher isAnalysisGetErrorsResult = new MatchesJsonObject(
+final Matcher isAnalysisGetErrorsResult = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.getErrors result", {
     "errors": isListOf(isAnalysisError)
-  });
+  }));
 
 /**
  * analysis.getHover params
@@ -125,11 +125,11 @@
  *   "offset": int
  * }
  */
-final Matcher isAnalysisGetHoverParams = new MatchesJsonObject(
+final Matcher isAnalysisGetHoverParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.getHover params", {
     "file": isFilePath,
     "offset": isInt
-  });
+  }));
 
 /**
  * analysis.getHover result
@@ -138,10 +138,10 @@
  *   "hovers": List<HoverInformation>
  * }
  */
-final Matcher isAnalysisGetHoverResult = new MatchesJsonObject(
+final Matcher isAnalysisGetHoverResult = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.getHover result", {
     "hovers": isListOf(isHoverInformation)
-  });
+  }));
 
 /**
  * analysis.reanalyze params
@@ -161,11 +161,11 @@
  *   "excluded": List<FilePath>
  * }
  */
-final Matcher isAnalysisSetAnalysisRootsParams = new MatchesJsonObject(
+final Matcher isAnalysisSetAnalysisRootsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.setAnalysisRoots params", {
     "included": isListOf(isFilePath),
     "excluded": isListOf(isFilePath)
-  });
+  }));
 
 /**
  * analysis.setAnalysisRoots result
@@ -179,10 +179,10 @@
  *   "files": List<FilePath>
  * }
  */
-final Matcher isAnalysisSetPriorityFilesParams = new MatchesJsonObject(
+final Matcher isAnalysisSetPriorityFilesParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.setPriorityFiles params", {
     "files": isListOf(isFilePath)
-  });
+  }));
 
 /**
  * analysis.setPriorityFiles result
@@ -196,10 +196,10 @@
  *   "subscriptions": Map<AnalysisService, List<FilePath>>
  * }
  */
-final Matcher isAnalysisSetSubscriptionsParams = new MatchesJsonObject(
+final Matcher isAnalysisSetSubscriptionsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.setSubscriptions params", {
     "subscriptions": isMapOf(isAnalysisService, isListOf(isFilePath))
-  });
+  }));
 
 /**
  * analysis.setSubscriptions result
@@ -210,13 +210,13 @@
  * analysis.updateContent params
  *
  * {
- *   "files": Map<FilePath, object>
+ *   "files": Map<FilePath, AddContentOverlay | ChangeContentOverlay | RemoveContentOverlay>
  * }
  */
-final Matcher isAnalysisUpdateContentParams = new MatchesJsonObject(
+final Matcher isAnalysisUpdateContentParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.updateContent params", {
-    "files": isMapOf(isFilePath, isObject)
-  });
+    "files": isMapOf(isFilePath, isOneOf([isAddContentOverlay, isChangeContentOverlay, isRemoveContentOverlay]))
+  }));
 
 /**
  * analysis.updateContent result
@@ -230,10 +230,10 @@
  *   "options": AnalysisOptions
  * }
  */
-final Matcher isAnalysisUpdateOptionsParams = new MatchesJsonObject(
+final Matcher isAnalysisUpdateOptionsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.updateOptions params", {
     "options": isAnalysisOptions
-  });
+  }));
 
 /**
  * analysis.updateOptions result
@@ -248,11 +248,11 @@
  *   "errors": List<AnalysisError>
  * }
  */
-final Matcher isAnalysisErrorsParams = new MatchesJsonObject(
+final Matcher isAnalysisErrorsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.errors params", {
     "file": isFilePath,
     "errors": isListOf(isAnalysisError)
-  });
+  }));
 
 /**
  * analysis.flushResults params
@@ -261,10 +261,10 @@
  *   "files": List<FilePath>
  * }
  */
-final Matcher isAnalysisFlushResultsParams = new MatchesJsonObject(
+final Matcher isAnalysisFlushResultsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.flushResults params", {
     "files": isListOf(isFilePath)
-  });
+  }));
 
 /**
  * analysis.folding params
@@ -274,11 +274,11 @@
  *   "regions": List<FoldingRegion>
  * }
  */
-final Matcher isAnalysisFoldingParams = new MatchesJsonObject(
+final Matcher isAnalysisFoldingParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.folding params", {
     "file": isFilePath,
     "regions": isListOf(isFoldingRegion)
-  });
+  }));
 
 /**
  * analysis.highlights params
@@ -288,11 +288,11 @@
  *   "regions": List<HighlightRegion>
  * }
  */
-final Matcher isAnalysisHighlightsParams = new MatchesJsonObject(
+final Matcher isAnalysisHighlightsParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.highlights params", {
     "file": isFilePath,
     "regions": isListOf(isHighlightRegion)
-  });
+  }));
 
 /**
  * analysis.navigation params
@@ -302,11 +302,11 @@
  *   "regions": List<NavigationRegion>
  * }
  */
-final Matcher isAnalysisNavigationParams = new MatchesJsonObject(
+final Matcher isAnalysisNavigationParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.navigation params", {
     "file": isFilePath,
     "regions": isListOf(isNavigationRegion)
-  });
+  }));
 
 /**
  * analysis.occurrences params
@@ -316,11 +316,11 @@
  *   "occurrences": List<Occurrences>
  * }
  */
-final Matcher isAnalysisOccurrencesParams = new MatchesJsonObject(
+final Matcher isAnalysisOccurrencesParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.occurrences params", {
     "file": isFilePath,
     "occurrences": isListOf(isOccurrences)
-  });
+  }));
 
 /**
  * analysis.outline params
@@ -330,11 +330,11 @@
  *   "outline": Outline
  * }
  */
-final Matcher isAnalysisOutlineParams = new MatchesJsonObject(
+final Matcher isAnalysisOutlineParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.outline params", {
     "file": isFilePath,
     "outline": isOutline
-  });
+  }));
 
 /**
  * analysis.overrides params
@@ -344,11 +344,11 @@
  *   "overrides": List<Override>
  * }
  */
-final Matcher isAnalysisOverridesParams = new MatchesJsonObject(
+final Matcher isAnalysisOverridesParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.overrides params", {
     "file": isFilePath,
     "overrides": isListOf(isOverride)
-  });
+  }));
 
 /**
  * completion.getSuggestions params
@@ -358,11 +358,11 @@
  *   "offset": int
  * }
  */
-final Matcher isCompletionGetSuggestionsParams = new MatchesJsonObject(
+final Matcher isCompletionGetSuggestionsParams = new LazyMatcher(() => new MatchesJsonObject(
   "completion.getSuggestions params", {
     "file": isFilePath,
     "offset": isInt
-  });
+  }));
 
 /**
  * completion.getSuggestions result
@@ -371,10 +371,10 @@
  *   "id": CompletionId
  * }
  */
-final Matcher isCompletionGetSuggestionsResult = new MatchesJsonObject(
+final Matcher isCompletionGetSuggestionsResult = new LazyMatcher(() => new MatchesJsonObject(
   "completion.getSuggestions result", {
     "id": isCompletionId
-  });
+  }));
 
 /**
  * completion.results params
@@ -384,17 +384,17 @@
  *   "replacementOffset": int
  *   "replacementLength": int
  *   "results": List<CompletionSuggestion>
- *   "last": bool
+ *   "isLast": bool
  * }
  */
-final Matcher isCompletionResultsParams = new MatchesJsonObject(
+final Matcher isCompletionResultsParams = new LazyMatcher(() => new MatchesJsonObject(
   "completion.results params", {
     "id": isCompletionId,
     "replacementOffset": isInt,
     "replacementLength": isInt,
     "results": isListOf(isCompletionSuggestion),
-    "last": isBool
-  });
+    "isLast": isBool
+  }));
 
 /**
  * search.findElementReferences params
@@ -405,26 +405,27 @@
  *   "includePotential": bool
  * }
  */
-final Matcher isSearchFindElementReferencesParams = new MatchesJsonObject(
+final Matcher isSearchFindElementReferencesParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.findElementReferences params", {
     "file": isFilePath,
     "offset": isInt,
     "includePotential": isBool
-  });
+  }));
 
 /**
  * search.findElementReferences result
  *
  * {
  *   "id": SearchId
- *   "element": Element
+ *   "element": optional Element
  * }
  */
-final Matcher isSearchFindElementReferencesResult = new MatchesJsonObject(
+final Matcher isSearchFindElementReferencesResult = new LazyMatcher(() => new MatchesJsonObject(
   "search.findElementReferences result", {
-    "id": isSearchId,
+    "id": isSearchId
+  }, optionalFields: {
     "element": isElement
-  });
+  }));
 
 /**
  * search.findMemberDeclarations params
@@ -433,10 +434,10 @@
  *   "name": String
  * }
  */
-final Matcher isSearchFindMemberDeclarationsParams = new MatchesJsonObject(
+final Matcher isSearchFindMemberDeclarationsParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.findMemberDeclarations params", {
     "name": isString
-  });
+  }));
 
 /**
  * search.findMemberDeclarations result
@@ -445,10 +446,10 @@
  *   "id": SearchId
  * }
  */
-final Matcher isSearchFindMemberDeclarationsResult = new MatchesJsonObject(
+final Matcher isSearchFindMemberDeclarationsResult = new LazyMatcher(() => new MatchesJsonObject(
   "search.findMemberDeclarations result", {
     "id": isSearchId
-  });
+  }));
 
 /**
  * search.findMemberReferences params
@@ -457,10 +458,10 @@
  *   "name": String
  * }
  */
-final Matcher isSearchFindMemberReferencesParams = new MatchesJsonObject(
+final Matcher isSearchFindMemberReferencesParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.findMemberReferences params", {
     "name": isString
-  });
+  }));
 
 /**
  * search.findMemberReferences result
@@ -469,10 +470,10 @@
  *   "id": SearchId
  * }
  */
-final Matcher isSearchFindMemberReferencesResult = new MatchesJsonObject(
+final Matcher isSearchFindMemberReferencesResult = new LazyMatcher(() => new MatchesJsonObject(
   "search.findMemberReferences result", {
     "id": isSearchId
-  });
+  }));
 
 /**
  * search.findTopLevelDeclarations params
@@ -481,10 +482,10 @@
  *   "pattern": String
  * }
  */
-final Matcher isSearchFindTopLevelDeclarationsParams = new MatchesJsonObject(
+final Matcher isSearchFindTopLevelDeclarationsParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.findTopLevelDeclarations params", {
     "pattern": isString
-  });
+  }));
 
 /**
  * search.findTopLevelDeclarations result
@@ -493,10 +494,10 @@
  *   "id": SearchId
  * }
  */
-final Matcher isSearchFindTopLevelDeclarationsResult = new MatchesJsonObject(
+final Matcher isSearchFindTopLevelDeclarationsResult = new LazyMatcher(() => new MatchesJsonObject(
   "search.findTopLevelDeclarations result", {
     "id": isSearchId
-  });
+  }));
 
 /**
  * search.getTypeHierarchy params
@@ -506,11 +507,11 @@
  *   "offset": int
  * }
  */
-final Matcher isSearchGetTypeHierarchyParams = new MatchesJsonObject(
+final Matcher isSearchGetTypeHierarchyParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.getTypeHierarchy params", {
     "file": isFilePath,
     "offset": isInt
-  });
+  }));
 
 /**
  * search.getTypeHierarchy result
@@ -519,10 +520,10 @@
  *   "hierarchyItems": optional List<TypeHierarchyItem>
  * }
  */
-final Matcher isSearchGetTypeHierarchyResult = new MatchesJsonObject(
+final Matcher isSearchGetTypeHierarchyResult = new LazyMatcher(() => new MatchesJsonObject(
   "search.getTypeHierarchy result", null, optionalFields: {
     "hierarchyItems": isListOf(isTypeHierarchyItem)
-  });
+  }));
 
 /**
  * search.results params
@@ -530,15 +531,15 @@
  * {
  *   "id": SearchId
  *   "results": List<SearchResult>
- *   "last": bool
+ *   "isLast": bool
  * }
  */
-final Matcher isSearchResultsParams = new MatchesJsonObject(
+final Matcher isSearchResultsParams = new LazyMatcher(() => new MatchesJsonObject(
   "search.results params", {
     "id": isSearchId,
     "results": isListOf(isSearchResult),
-    "last": isBool
-  });
+    "isLast": isBool
+  }));
 
 /**
  * edit.getAssists params
@@ -549,12 +550,12 @@
  *   "length": int
  * }
  */
-final Matcher isEditGetAssistsParams = new MatchesJsonObject(
+final Matcher isEditGetAssistsParams = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getAssists params", {
     "file": isFilePath,
     "offset": isInt,
     "length": isInt
-  });
+  }));
 
 /**
  * edit.getAssists result
@@ -563,10 +564,10 @@
  *   "assists": List<SourceChange>
  * }
  */
-final Matcher isEditGetAssistsResult = new MatchesJsonObject(
+final Matcher isEditGetAssistsResult = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getAssists result", {
     "assists": isListOf(isSourceChange)
-  });
+  }));
 
 /**
  * edit.getAvailableRefactorings params
@@ -577,12 +578,12 @@
  *   "length": int
  * }
  */
-final Matcher isEditGetAvailableRefactoringsParams = new MatchesJsonObject(
+final Matcher isEditGetAvailableRefactoringsParams = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getAvailableRefactorings params", {
     "file": isFilePath,
     "offset": isInt,
     "length": isInt
-  });
+  }));
 
 /**
  * edit.getAvailableRefactorings result
@@ -591,10 +592,10 @@
  *   "kinds": List<RefactoringKind>
  * }
  */
-final Matcher isEditGetAvailableRefactoringsResult = new MatchesJsonObject(
+final Matcher isEditGetAvailableRefactoringsResult = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getAvailableRefactorings result", {
     "kinds": isListOf(isRefactoringKind)
-  });
+  }));
 
 /**
  * edit.getFixes params
@@ -604,11 +605,11 @@
  *   "offset": int
  * }
  */
-final Matcher isEditGetFixesParams = new MatchesJsonObject(
+final Matcher isEditGetFixesParams = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getFixes params", {
     "file": isFilePath,
     "offset": isInt
-  });
+  }));
 
 /**
  * edit.getFixes result
@@ -617,16 +618,16 @@
  *   "fixes": List<ErrorFixes>
  * }
  */
-final Matcher isEditGetFixesResult = new MatchesJsonObject(
+final Matcher isEditGetFixesResult = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getFixes result", {
     "fixes": isListOf(isErrorFixes)
-  });
+  }));
 
 /**
  * edit.getRefactoring params
  *
  * {
- *   "kindId": RefactoringKind
+ *   "kind": RefactoringKind
  *   "file": FilePath
  *   "offset": int
  *   "length": int
@@ -634,33 +635,35 @@
  *   "options": optional object
  * }
  */
-final Matcher isEditGetRefactoringParams = new MatchesJsonObject(
+final Matcher isEditGetRefactoringParams = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getRefactoring params", {
-    "kindId": isRefactoringKind,
+    "kind": isRefactoringKind,
     "file": isFilePath,
     "offset": isInt,
     "length": isInt,
     "validateOnly": isBool
   }, optionalFields: {
     "options": isObject
-  });
+  }));
 
 /**
  * edit.getRefactoring result
  *
  * {
- *   "status": List<RefactoringProblem>
+ *   "problems": List<RefactoringProblem>
  *   "feedback": optional object
  *   "change": optional SourceChange
+ *   "potentialEdits": optional List<String>
  * }
  */
-final Matcher isEditGetRefactoringResult = new MatchesJsonObject(
+final Matcher isEditGetRefactoringResult = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getRefactoring result", {
-    "status": isListOf(isRefactoringProblem)
+    "problems": isListOf(isRefactoringProblem)
   }, optionalFields: {
     "feedback": isObject,
-    "change": isSourceChange
-  });
+    "change": isSourceChange,
+    "potentialEdits": isListOf(isString)
+  }));
 
 /**
  * debug.createContext params
@@ -669,10 +672,10 @@
  *   "contextRoot": FilePath
  * }
  */
-final Matcher isDebugCreateContextParams = new MatchesJsonObject(
+final Matcher isDebugCreateContextParams = new LazyMatcher(() => new MatchesJsonObject(
   "debug.createContext params", {
     "contextRoot": isFilePath
-  });
+  }));
 
 /**
  * debug.createContext result
@@ -681,10 +684,10 @@
  *   "id": DebugContextId
  * }
  */
-final Matcher isDebugCreateContextResult = new MatchesJsonObject(
+final Matcher isDebugCreateContextResult = new LazyMatcher(() => new MatchesJsonObject(
   "debug.createContext result", {
     "id": isDebugContextId
-  });
+  }));
 
 /**
  * debug.deleteContext params
@@ -693,10 +696,10 @@
  *   "id": DebugContextId
  * }
  */
-final Matcher isDebugDeleteContextParams = new MatchesJsonObject(
+final Matcher isDebugDeleteContextParams = new LazyMatcher(() => new MatchesJsonObject(
   "debug.deleteContext params", {
     "id": isDebugContextId
-  });
+  }));
 
 /**
  * debug.deleteContext result
@@ -712,13 +715,13 @@
  *   "uri": optional String
  * }
  */
-final Matcher isDebugMapUriParams = new MatchesJsonObject(
+final Matcher isDebugMapUriParams = new LazyMatcher(() => new MatchesJsonObject(
   "debug.mapUri params", {
     "id": isDebugContextId
   }, optionalFields: {
     "file": isFilePath,
     "uri": isString
-  });
+  }));
 
 /**
  * debug.mapUri result
@@ -728,11 +731,11 @@
  *   "uri": optional String
  * }
  */
-final Matcher isDebugMapUriResult = new MatchesJsonObject(
+final Matcher isDebugMapUriResult = new LazyMatcher(() => new MatchesJsonObject(
   "debug.mapUri result", null, optionalFields: {
     "file": isFilePath,
     "uri": isString
-  });
+  }));
 
 /**
  * debug.setSubscriptions params
@@ -741,10 +744,10 @@
  *   "subscriptions": List<DebugService>
  * }
  */
-final Matcher isDebugSetSubscriptionsParams = new MatchesJsonObject(
+final Matcher isDebugSetSubscriptionsParams = new LazyMatcher(() => new MatchesJsonObject(
   "debug.setSubscriptions params", {
     "subscriptions": isListOf(isDebugService)
-  });
+  }));
 
 /**
  * debug.setSubscriptions result
@@ -760,12 +763,12 @@
  *   "htmlToDart": Map<FilePath, List<FilePath>>
  * }
  */
-final Matcher isDebugLaunchDataParams = new MatchesJsonObject(
+final Matcher isDebugLaunchDataParams = new LazyMatcher(() => new MatchesJsonObject(
   "debug.launchData params", {
     "executables": isListOf(isExecutableFile),
     "dartToHtml": isMapOf(isFilePath, isListOf(isFilePath)),
     "htmlToDart": isMapOf(isFilePath, isListOf(isFilePath))
-  });
+  }));
 
 /**
  * AddContentOverlay
@@ -775,11 +778,11 @@
  *   "content": String
  * }
  */
-final Matcher isAddContentOverlay = new MatchesJsonObject(
+final Matcher isAddContentOverlay = new LazyMatcher(() => new MatchesJsonObject(
   "AddContentOverlay", {
     "type": equals("add"),
     "content": isString
-  });
+  }));
 
 /**
  * AnalysisError
@@ -792,7 +795,7 @@
  *   "correction": optional String
  * }
  */
-final Matcher isAnalysisError = new MatchesJsonObject(
+final Matcher isAnalysisError = new LazyMatcher(() => new MatchesJsonObject(
   "AnalysisError", {
     "severity": isErrorSeverity,
     "type": isErrorType,
@@ -800,14 +803,12 @@
     "message": isString
   }, optionalFields: {
     "correction": isString
-  });
+  }));
 
 /**
  * AnalysisOptions
  *
  * {
- *   "analyzeAngular": optional bool
- *   "analyzePolymer": optional bool
  *   "enableAsync": optional bool
  *   "enableDeferredLoading": optional bool
  *   "enableEnums": optional bool
@@ -815,16 +816,14 @@
  *   "generateHints": optional bool
  * }
  */
-final Matcher isAnalysisOptions = new MatchesJsonObject(
+final Matcher isAnalysisOptions = new LazyMatcher(() => new MatchesJsonObject(
   "AnalysisOptions", null, optionalFields: {
-    "analyzeAngular": isBool,
-    "analyzePolymer": isBool,
     "enableAsync": isBool,
     "enableDeferredLoading": isBool,
     "enableEnums": isBool,
     "generateDart2jsHints": isBool,
     "generateHints": isBool
-  });
+  }));
 
 /**
  * AnalysisService
@@ -851,34 +850,30 @@
  * AnalysisStatus
  *
  * {
- *   "analyzing": bool
+ *   "isAnalyzing": bool
  *   "analysisTarget": optional String
  * }
  */
-final Matcher isAnalysisStatus = new MatchesJsonObject(
+final Matcher isAnalysisStatus = new LazyMatcher(() => new MatchesJsonObject(
   "AnalysisStatus", {
-    "analyzing": isBool
+    "isAnalyzing": isBool
   }, optionalFields: {
     "analysisTarget": isString
-  });
+  }));
 
 /**
  * ChangeContentOverlay
  *
  * {
  *   "type": "change"
- *   "offset": int
- *   "length": int
- *   "replacement": String
+ *   "edits": List<SourceEdit>
  * }
  */
-final Matcher isChangeContentOverlay = new MatchesJsonObject(
+final Matcher isChangeContentOverlay = new LazyMatcher(() => new MatchesJsonObject(
   "ChangeContentOverlay", {
     "type": equals("change"),
-    "offset": isInt,
-    "length": isInt,
-    "replacement": isString
-  });
+    "edits": isListOf(isSourceEdit)
+  }));
 
 /**
  * CompletionId
@@ -925,7 +920,7 @@
  *   "parameterType": optional String
  * }
  */
-final Matcher isCompletionSuggestion = new MatchesJsonObject(
+final Matcher isCompletionSuggestion = new LazyMatcher(() => new MatchesJsonObject(
   "CompletionSuggestion", {
     "kind": isCompletionSuggestionKind,
     "relevance": isCompletionRelevance,
@@ -945,7 +940,7 @@
     "positionalParameterCount": isInt,
     "parameterName": isString,
     "parameterType": isString
-  });
+  }));
 
 /**
  * CompletionSuggestionKind
@@ -960,6 +955,7 @@
  *   FUNCTION_TYPE_ALIAS
  *   GETTER
  *   IMPORT
+ *   KEYWORD
  *   LIBRARY_PREFIX
  *   LOCAL_VARIABLE
  *   METHOD
@@ -982,6 +978,7 @@
   "FUNCTION_TYPE_ALIAS",
   "GETTER",
   "IMPORT",
+  "KEYWORD",
   "LIBRARY_PREFIX",
   "LOCAL_VARIABLE",
   "METHOD",
@@ -1024,7 +1021,7 @@
  *   "returnType": optional String
  * }
  */
-final Matcher isElement = new MatchesJsonObject(
+final Matcher isElement = new LazyMatcher(() => new MatchesJsonObject(
   "Element", {
     "kind": isElementKind,
     "name": isString,
@@ -1033,7 +1030,7 @@
     "location": isLocation,
     "parameters": isString,
     "returnType": isString
-  });
+  }));
 
 /**
  * ElementKind
@@ -1043,19 +1040,20 @@
  *   CLASS_TYPE_ALIAS
  *   COMPILATION_UNIT
  *   CONSTRUCTOR
- *   GETTER
  *   FIELD
  *   FUNCTION
  *   FUNCTION_TYPE_ALIAS
+ *   GETTER
  *   LIBRARY
  *   LOCAL_VARIABLE
  *   METHOD
+ *   PARAMETER
  *   SETTER
  *   TOP_LEVEL_VARIABLE
  *   TYPE_PARAMETER
- *   UNKNOWN
  *   UNIT_TEST_GROUP
  *   UNIT_TEST_TEST
+ *   UNKNOWN
  * }
  */
 final Matcher isElementKind = new MatchesEnum("ElementKind", [
@@ -1063,19 +1061,20 @@
   "CLASS_TYPE_ALIAS",
   "COMPILATION_UNIT",
   "CONSTRUCTOR",
-  "GETTER",
   "FIELD",
   "FUNCTION",
   "FUNCTION_TYPE_ALIAS",
+  "GETTER",
   "LIBRARY",
   "LOCAL_VARIABLE",
   "METHOD",
+  "PARAMETER",
   "SETTER",
   "TOP_LEVEL_VARIABLE",
   "TYPE_PARAMETER",
-  "UNKNOWN",
   "UNIT_TEST_GROUP",
-  "UNIT_TEST_TEST"
+  "UNIT_TEST_TEST",
+  "UNKNOWN"
 ]);
 
 /**
@@ -1087,13 +1086,13 @@
  *   "data": optional object
  * }
  */
-final Matcher isError = new MatchesJsonObject(
+final Matcher isError = new LazyMatcher(() => new MatchesJsonObject(
   "Error", {
     "code": isString,
     "message": isString
   }, optionalFields: {
     "data": isObject
-  });
+  }));
 
 /**
  * ErrorFixes
@@ -1103,11 +1102,11 @@
  *   "fixes": List<SourceChange>
  * }
  */
-final Matcher isErrorFixes = new MatchesJsonObject(
+final Matcher isErrorFixes = new LazyMatcher(() => new MatchesJsonObject(
   "ErrorFixes", {
     "error": isAnalysisError,
     "fixes": isListOf(isSourceChange)
-  });
+  }));
 
 /**
  * ErrorSeverity
@@ -1153,11 +1152,11 @@
  *   "offset": ExecutableKind
  * }
  */
-final Matcher isExecutableFile = new MatchesJsonObject(
+final Matcher isExecutableFile = new LazyMatcher(() => new MatchesJsonObject(
   "ExecutableFile", {
     "file": isFilePath,
     "offset": isExecutableKind
-  });
+  }));
 
 /**
  * ExecutableKind
@@ -1209,12 +1208,12 @@
  *   "length": int
  * }
  */
-final Matcher isFoldingRegion = new MatchesJsonObject(
+final Matcher isFoldingRegion = new LazyMatcher(() => new MatchesJsonObject(
   "FoldingRegion", {
     "kind": isFoldingKind,
     "offset": isInt,
     "length": isInt
-  });
+  }));
 
 /**
  * HighlightRegion
@@ -1225,12 +1224,12 @@
  *   "length": int
  * }
  */
-final Matcher isHighlightRegion = new MatchesJsonObject(
+final Matcher isHighlightRegion = new LazyMatcher(() => new MatchesJsonObject(
   "HighlightRegion", {
     "type": isHighlightRegionType,
     "offset": isInt,
     "length": isInt
-  });
+  }));
 
 /**
  * HighlightRegionType
@@ -1327,7 +1326,7 @@
  *   "staticType": optional String
  * }
  */
-final Matcher isHoverInformation = new MatchesJsonObject(
+final Matcher isHoverInformation = new LazyMatcher(() => new MatchesJsonObject(
   "HoverInformation", {
     "offset": isInt,
     "length": isInt
@@ -1340,7 +1339,7 @@
     "parameter": isString,
     "propagatedType": isString,
     "staticType": isString
-  });
+  }));
 
 /**
  * LinkedEditGroup
@@ -1351,12 +1350,12 @@
  *   "suggestions": List<LinkedEditSuggestion>
  * }
  */
-final Matcher isLinkedEditGroup = new MatchesJsonObject(
+final Matcher isLinkedEditGroup = new LazyMatcher(() => new MatchesJsonObject(
   "LinkedEditGroup", {
     "positions": isListOf(isPosition),
     "length": isInt,
     "suggestions": isListOf(isLinkedEditSuggestion)
-  });
+  }));
 
 /**
  * LinkedEditSuggestion
@@ -1366,11 +1365,11 @@
  *   "kind": LinkedEditSuggestionKind
  * }
  */
-final Matcher isLinkedEditSuggestion = new MatchesJsonObject(
+final Matcher isLinkedEditSuggestion = new LazyMatcher(() => new MatchesJsonObject(
   "LinkedEditSuggestion", {
     "value": isString,
     "kind": isLinkedEditSuggestionKind
-  });
+  }));
 
 /**
  * LinkedEditSuggestionKind
@@ -1400,14 +1399,14 @@
  *   "startColumn": int
  * }
  */
-final Matcher isLocation = new MatchesJsonObject(
+final Matcher isLocation = new LazyMatcher(() => new MatchesJsonObject(
   "Location", {
     "file": isFilePath,
     "offset": isInt,
     "length": isInt,
     "startLine": isInt,
     "startColumn": isInt
-  });
+  }));
 
 /**
  * NavigationRegion
@@ -1418,12 +1417,12 @@
  *   "targets": List<Element>
  * }
  */
-final Matcher isNavigationRegion = new MatchesJsonObject(
+final Matcher isNavigationRegion = new LazyMatcher(() => new MatchesJsonObject(
   "NavigationRegion", {
     "offset": isInt,
     "length": isInt,
     "targets": isListOf(isElement)
-  });
+  }));
 
 /**
  * Occurrences
@@ -1434,12 +1433,12 @@
  *   "length": int
  * }
  */
-final Matcher isOccurrences = new MatchesJsonObject(
+final Matcher isOccurrences = new LazyMatcher(() => new MatchesJsonObject(
   "Occurrences", {
     "element": isElement,
     "offsets": isListOf(isInt),
     "length": isInt
-  });
+  }));
 
 /**
  * Outline
@@ -1451,14 +1450,14 @@
  *   "children": optional List<Outline>
  * }
  */
-final Matcher isOutline = new MatchesJsonObject(
+final Matcher isOutline = new LazyMatcher(() => new MatchesJsonObject(
   "Outline", {
     "element": isElement,
     "offset": isInt,
     "length": isInt
   }, optionalFields: {
     "children": isListOf(isOutline)
-  });
+  }));
 
 /**
  * Override
@@ -1470,14 +1469,14 @@
  *   "interfaceMembers": optional List<OverriddenMember>
  * }
  */
-final Matcher isOverride = new MatchesJsonObject(
+final Matcher isOverride = new LazyMatcher(() => new MatchesJsonObject(
   "Override", {
     "offset": isInt,
     "length": isInt
   }, optionalFields: {
     "superclassMember": isOverriddenMember,
     "interfaceMembers": isListOf(isOverriddenMember)
-  });
+  }));
 
 /**
  * OverriddenMember
@@ -1487,25 +1486,11 @@
  *   "className": String
  * }
  */
-final Matcher isOverriddenMember = new MatchesJsonObject(
+final Matcher isOverriddenMember = new LazyMatcher(() => new MatchesJsonObject(
   "OverriddenMember", {
     "element": isElement,
     "className": isString
-  });
-
-/**
- * Parameter
- *
- * {
- *   "type": String
- *   "name": String
- * }
- */
-final Matcher isParameter = new MatchesJsonObject(
-  "Parameter", {
-    "type": isString,
-    "name": isString
-  });
+  }));
 
 /**
  * Position
@@ -1515,11 +1500,11 @@
  *   "offset": int
  * }
  */
-final Matcher isPosition = new MatchesJsonObject(
+final Matcher isPosition = new LazyMatcher(() => new MatchesJsonObject(
   "Position", {
     "file": isFilePath,
     "offset": isInt
-  });
+  }));
 
 /**
  * RefactoringKind
@@ -1545,20 +1530,57 @@
 ]);
 
 /**
+ * RefactoringMethodParameter
+ *
+ * {
+ *   "id": optional String
+ *   "kind": RefactoringMethodParameterKind
+ *   "type": String
+ *   "name": String
+ *   "parameters": optional String
+ * }
+ */
+final Matcher isRefactoringMethodParameter = new LazyMatcher(() => new MatchesJsonObject(
+  "RefactoringMethodParameter", {
+    "kind": isRefactoringMethodParameterKind,
+    "type": isString,
+    "name": isString
+  }, optionalFields: {
+    "id": isString,
+    "parameters": isString
+  }));
+
+/**
+ * RefactoringMethodParameterKind
+ *
+ * enum {
+ *   REQUIRED
+ *   POSITIONAL
+ *   NAMED
+ * }
+ */
+final Matcher isRefactoringMethodParameterKind = new MatchesEnum("RefactoringMethodParameterKind", [
+  "REQUIRED",
+  "POSITIONAL",
+  "NAMED"
+]);
+
+/**
  * RefactoringProblem
  *
  * {
  *   "severity": RefactoringProblemSeverity
  *   "message": String
- *   "location": Location
+ *   "location": optional Location
  * }
  */
-final Matcher isRefactoringProblem = new MatchesJsonObject(
+final Matcher isRefactoringProblem = new LazyMatcher(() => new MatchesJsonObject(
   "RefactoringProblem", {
     "severity": isRefactoringProblemSeverity,
-    "message": isString,
+    "message": isString
+  }, optionalFields: {
     "location": isLocation
-  });
+  }));
 
 /**
  * RefactoringProblemSeverity
@@ -1584,10 +1606,10 @@
  *   "type": "remove"
  * }
  */
-final Matcher isRemoveContentOverlay = new MatchesJsonObject(
+final Matcher isRemoveContentOverlay = new LazyMatcher(() => new MatchesJsonObject(
   "RemoveContentOverlay", {
     "type": equals("remove")
-  });
+  }));
 
 /**
  * SearchId
@@ -1606,13 +1628,13 @@
  *   "path": List<Element>
  * }
  */
-final Matcher isSearchResult = new MatchesJsonObject(
+final Matcher isSearchResult = new LazyMatcher(() => new MatchesJsonObject(
   "SearchResult", {
     "location": isLocation,
     "kind": isSearchResultKind,
     "isPotential": isBool,
     "path": isListOf(isElement)
-  });
+  }));
 
 /**
  * SearchResultKind
@@ -1623,6 +1645,7 @@
  *   READ
  *   READ_WRITE
  *   REFERENCE
+ *   UNKNOWN
  *   WRITE
  * }
  */
@@ -1632,6 +1655,7 @@
   "READ",
   "READ_WRITE",
   "REFERENCE",
+  "UNKNOWN",
   "WRITE"
 ]);
 
@@ -1656,14 +1680,14 @@
  *   "selection": optional Position
  * }
  */
-final Matcher isSourceChange = new MatchesJsonObject(
+final Matcher isSourceChange = new LazyMatcher(() => new MatchesJsonObject(
   "SourceChange", {
     "message": isString,
     "edits": isListOf(isSourceFileEdit),
     "linkedEditGroups": isListOf(isLinkedEditGroup)
   }, optionalFields: {
     "selection": isPosition
-  });
+  }));
 
 /**
  * SourceEdit
@@ -1672,14 +1696,17 @@
  *   "offset": int
  *   "length": int
  *   "replacement": String
+ *   "id": optional String
  * }
  */
-final Matcher isSourceEdit = new MatchesJsonObject(
+final Matcher isSourceEdit = new LazyMatcher(() => new MatchesJsonObject(
   "SourceEdit", {
     "offset": isInt,
     "length": isInt,
     "replacement": isString
-  });
+  }, optionalFields: {
+    "id": isString
+  }));
 
 /**
  * SourceFileEdit
@@ -1689,11 +1716,11 @@
  *   "edits": List<SourceEdit>
  * }
  */
-final Matcher isSourceFileEdit = new MatchesJsonObject(
+final Matcher isSourceFileEdit = new LazyMatcher(() => new MatchesJsonObject(
   "SourceFileEdit", {
     "file": isFilePath,
     "edits": isListOf(isSourceEdit)
-  });
+  }));
 
 /**
  * TypeHierarchyItem
@@ -1708,7 +1735,7 @@
  *   "subclasses": List<int>
  * }
  */
-final Matcher isTypeHierarchyItem = new MatchesJsonObject(
+final Matcher isTypeHierarchyItem = new LazyMatcher(() => new MatchesJsonObject(
   "TypeHierarchyItem", {
     "classElement": isElement,
     "interfaces": isListOf(isInt),
@@ -1718,7 +1745,7 @@
     "displayName": isString,
     "memberElement": isElement,
     "superclass": isInt
-  });
+  }));
 
 /**
  * convertGetterToMethod feedback
@@ -1749,12 +1776,12 @@
  *   "lengths": List<int>
  * }
  */
-final Matcher isExtractLocalVariableFeedback = new MatchesJsonObject(
+final Matcher isExtractLocalVariableFeedback = new LazyMatcher(() => new MatchesJsonObject(
   "extractLocalVariable feedback", {
     "names": isListOf(isString),
     "offsets": isListOf(isInt),
     "lengths": isListOf(isInt)
-  });
+  }));
 
 /**
  * extractLocalVariable options
@@ -1764,11 +1791,11 @@
  *   "extractAll": bool
  * }
  */
-final Matcher isExtractLocalVariableOptions = new MatchesJsonObject(
+final Matcher isExtractLocalVariableOptions = new LazyMatcher(() => new MatchesJsonObject(
   "extractLocalVariable options", {
     "name": isString,
     "extractAll": isBool
-  });
+  }));
 
 /**
  * extractMethod feedback
@@ -1779,24 +1806,24 @@
  *   "returnType": String
  *   "names": List<String>
  *   "canCreateGetter": bool
- *   "parameters": List<Parameter>
+ *   "parameters": List<RefactoringMethodParameter>
  *   "occurrences": int
  *   "offsets": List<int>
  *   "lengths": List<int>
  * }
  */
-final Matcher isExtractMethodFeedback = new MatchesJsonObject(
+final Matcher isExtractMethodFeedback = new LazyMatcher(() => new MatchesJsonObject(
   "extractMethod feedback", {
     "offset": isInt,
     "length": isInt,
     "returnType": isString,
     "names": isListOf(isString),
     "canCreateGetter": isBool,
-    "parameters": isListOf(isParameter),
+    "parameters": isListOf(isRefactoringMethodParameter),
     "occurrences": isInt,
     "offsets": isListOf(isInt),
     "lengths": isListOf(isInt)
-  });
+  }));
 
 /**
  * extractMethod options
@@ -1805,18 +1832,18 @@
  *   "returnType": String
  *   "createGetter": bool
  *   "name": String
- *   "parameters": List<Parameter>
+ *   "parameters": List<RefactoringMethodParameter>
  *   "extractAll": bool
  * }
  */
-final Matcher isExtractMethodOptions = new MatchesJsonObject(
+final Matcher isExtractMethodOptions = new LazyMatcher(() => new MatchesJsonObject(
   "extractMethod options", {
     "returnType": isString,
     "createGetter": isBool,
     "name": isString,
-    "parameters": isListOf(isParameter),
+    "parameters": isListOf(isRefactoringMethodParameter),
     "extractAll": isBool
-  });
+  }));
 
 /**
  * inlineLocalVariable feedback
@@ -1841,11 +1868,11 @@
  *   "inlineAll": bool
  * }
  */
-final Matcher isInlineMethodOptions = new MatchesJsonObject(
+final Matcher isInlineMethodOptions = new LazyMatcher(() => new MatchesJsonObject(
   "inlineMethod options", {
     "deleteSource": isBool,
     "inlineAll": isBool
-  });
+  }));
 
 /**
  * rename feedback
@@ -1855,11 +1882,11 @@
  *   "length": int
  * }
  */
-final Matcher isRenameFeedback = new MatchesJsonObject(
+final Matcher isRenameFeedback = new LazyMatcher(() => new MatchesJsonObject(
   "rename feedback", {
     "offset": isInt,
     "length": isInt
-  });
+  }));
 
 /**
  * rename options
@@ -1868,8 +1895,8 @@
  *   "newName": String
  * }
  */
-final Matcher isRenameOptions = new MatchesJsonObject(
+final Matcher isRenameOptions = new LazyMatcher(() => new MatchesJsonObject(
   "rename options", {
     "newName": isString
-  });
+  }));
 
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index a3ab34a..1ba5b7d 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -21,7 +21,7 @@
     Completer analysisFinished = new Completer();
     onServerStatus.listen((params) {
       if (params['analysis'] != null) {
-        if (params['analysis']['analyzing']) {
+        if (params['analysis']['isAnalyzing']) {
           expect(analysisBegun.isCompleted, isFalse);
           analysisBegun.complete();
         } else {
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 2857174..6edda40 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -10,7 +10,7 @@
 @MirrorsUsed(targets: 'mocks', override: '*')
 import 'dart:mirrors';
 
-import 'package:analysis_services/index/index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/file_system/file_system.dart' as resource;
 import 'package:analyzer/file_system/memory_file_system.dart' as resource;
 import 'package:analysis_server/src/analysis_server.dart';
@@ -128,7 +128,7 @@
  */
 class MockServerChannel implements ServerCommunicationChannel {
   StreamController<Request> requestController = new StreamController<Request>();
-  StreamController<Response> responseController = new StreamController<Response>();
+  StreamController<Response> responseController = new StreamController<Response>.broadcast();
   StreamController<Notification> notificationController = new StreamController<Notification>(sync: true);
 
   List<Response> responsesReceived = [];
@@ -193,6 +193,9 @@
     return responseController.stream.firstWhere((response) {
       return response.id == id;
     });
+//    return responseController.stream.firstWhere((response) {
+//      return response.id == id;
+//    });
   }
 
   @override
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 3fcabfb..26aa83d 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -7,7 +7,6 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/json.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -20,7 +19,6 @@
   runReflectiveTests(NotificationTest);
   runReflectiveTests(RequestTest);
   runReflectiveTests(RequestErrorTest);
-  runReflectiveTests(RequestDatumTest);
   runReflectiveTests(ResponseTest);
 }
 
@@ -60,25 +58,20 @@
     Notification original = new Notification('foo');
     Notification notification = new Notification.fromJson(original.toJson());
     expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
+    expect(notification.toJson().keys, isNot(contains('params')));
   }
 
   void test_fromJson_withParams() {
-    Notification original = new Notification('foo');
-    original.setParameter('x', 'y');
+    Notification original = new Notification('foo', {'x': 'y'});
     Notification notification = new Notification.fromJson(original.toJson());
     expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
+    expect(notification.toJson()['params'], equals({'x': 'y'}));
   }
 
-  void test_getParameter_defined() {
-    Notification notification = new Notification('foo');
-    notification.setParameter('x', 'y');
+  void test_toJson_withParams() {
+    Notification notification = new Notification('foo', {'x': 'y'});
     expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
+    expect(notification.toJson()['params'], equals({'x': 'y'}));
     expect(notification.toJson(), equals({
       'event': 'foo',
       'params': {
@@ -87,309 +80,14 @@
     }));
   }
 
-  void test_getParameter_undefined() {
+  void test_toJson_noParams() {
     Notification notification = new Notification('foo');
     expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
+    expect(notification.toJson().keys, isNot(contains('params')));
     expect(notification.toJson(), equals({
       'event': 'foo'
     }));
   }
-
-  void test_setParameter_HasToJson() {
-    Notification notification = new Notification('foo');
-    notification.setParameter('my', new _MyHasToJsonObject(42));
-    expect(notification.toJson(), equals({
-      'event': 'foo',
-      'params': {
-        'my': {
-          'offset': 42
-        }
-      }
-    }));
-  }
-
-  void test_setParameter_Iterable_HasToJson() {
-    Notification notification = new Notification('foo');
-    notification.setParameter('my', [
-      new _MyHasToJsonObject(1),
-      new _MyHasToJsonObject(2),
-      new _MyHasToJsonObject(3)]);
-    expect(notification.toJson(), equals({
-      'event': 'foo',
-      'params': {
-        'my': [{'offset': 1}, {'offset': 2}, {'offset': 3}]
-      }
-    }));
-  }
-}
-
-
-class _MyHasToJsonObject implements HasToJson {
-  int offset;
-  _MyHasToJsonObject(this.offset);
-  Map<String, Object> toJson() => {'offset': offset};
-}
-
-
-@ReflectiveTestCase()
-class RequestDatumTest {
-  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>(
-      "RequestDatum");
-
-  static Request request;
-  static Matcher _throwsInvalidParameter = throwsA(
-      new InvalidParameterResponseMatcher());
-
-  void setUp() {
-    request = new Request('myId', 'myMethod');
-  }
-
-  void test_asBool() {
-    expect(makeDatum(true).asBool(), isTrue);
-    expect(makeDatum(false).asBool(), isFalse);
-    expect(makeDatum('true').asBool(), isTrue);
-    expect(makeDatum('false').asBool(), isFalse);
-    expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
-  }
-
-  void test_asInt() {
-    expect(makeDatum(1).asInt(), equals(1));
-    expect(makeDatum('2').asInt(), equals(2));
-    expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
-    expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
-  }
-
-  void test_asList_emptyList() {
-    expect(makeDatum([]).asList((datum) => datum.asString()), equals([]));
-  }
-
-  void test_asList_nonEmptyList() {
-    expect(makeDatum(['foo', 'bar']).asList((datum) => datum.asString()),
-        equals(['foo', 'bar']));
-  }
-
-  void test_asList_nonList() {
-    expect(() => makeDatum(3).asList((datum) => null), _throwsInvalidParameter);
-  }
-
-  void test_asList_null() {
-    expect(makeDatum(null).asList((datum) => datum.asString()), equals([]));
-  }
-
-  void test_asString() {
-    expect(makeDatum('foo').asString(), equals('foo'));
-    expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
-  }
-
-  void test_asStringList() {
-    expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
-    expect(makeDatum([]).asStringList(), equals([]));
-    expect(makeDatum(null).asStringList(), equals([]));
-    expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
-    expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
-  }
-
-  void test_asStringListMap() {
-    {
-      var map = {
-        'key1': ['value11', 'value12'],
-        'key2': ['value21', 'value22']
-      };
-      expect(makeDatum(map).asStringListMap(), map);
-    }
-    {
-      var map = {
-        'key1': 10,
-        'key2': 20
-      };
-      expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
-    }
-    {
-      var map = {
-        'key1': [11, 12],
-        'key2': [21, 22]
-      };
-      expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
-    }
-  }
-
-  void test_asStringMap() {
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).asStringMap(), equals({
-      'key1': 'value1',
-      'key2': 'value2'
-    }));
-    expect(makeDatum({}).asStringMap(), equals({}));
-    expect(() => makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
-  }
-
-  void test_forEachMap_emptyMap() {
-    makeDatum({}).forEachMap((key, value) {
-      fail('Empty map should not be iterated');
-    });
-  }
-
-  void test_forEachMap_nonMap() {
-    expect(() => makeDatum(1).forEachMap((key, value) {
-      fail('Non-map should not be iterated');
-    }), _throwsInvalidParameter);
-  }
-
-  void test_forEachMap_null() {
-    makeDatum(null).forEachMap((key, value) {
-      fail('Empty map should not be iterated');
-    });
-  }
-
-  void test_forEachMap_oneElementMap() {
-    int callCount = 0;
-    makeDatum({
-      'key': 'value'
-    }).forEachMap((key, value) {
-      callCount++;
-      expect(key, equals('key'));
-      expect(value, isRequestDatum);
-      expect(value.datum, equals('value'));
-    });
-    expect(callCount, equals(1));
-  }
-
-  void test_forEachMap_twoElementMap() {
-    int callCount = 0;
-    Map<String, String> map = {
-      'key1': 'value1',
-      'key2': 'value2'
-    };
-    Map iterationResult = {};
-    makeDatum(map).forEachMap((key, value) {
-      callCount++;
-      expect(value, isRequestDatum);
-      iterationResult[key] = value.datum;
-    });
-    expect(callCount, equals(2));
-    expect(iterationResult, equals(map));
-  }
-
-  void test_hasKey() {
-    var datum = makeDatum({
-      'foo': 'bar'
-    });
-    expect(datum.hasKey('foo'), isTrue);
-    expect(datum.hasKey('bar'), isFalse);
-    expect(datum.hasKey('baz'), isFalse);
-  }
-
-  void test_hasKey_null() {
-    expect(makeDatum(null).hasKey('foo'), isFalse);
-  }
-
-   void test_indexOperator_hasKey() {
-    var indexResult = makeDatum({
-      'foo': 'bar'
-    })['foo'];
-    expect(indexResult, isRequestDatum);
-    expect(indexResult.datum, equals('bar'));
-    expect(indexResult.path, equals('myPath.foo'));
-  }
-
-  void test_indexOperator_missingKey() {
-    expect(() => makeDatum({
-      'foo': 'bar'
-    })['baz'], _throwsInvalidParameter);
-  }
-
-  void test_indexOperator_nonMap() {
-    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
-  }
-
-  void test_indexOperator_null() {
-    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
-  }
-
-  void test_isList() {
-    expect(makeDatum(3).isList, isFalse);
-    expect(makeDatum(null).isList, isTrue);
-    expect(makeDatum([]).isList, isTrue);
-    expect(makeDatum(['foo', 'bar']).isList, isTrue);
-  }
-
-  void test_isMap() {
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).isMap, isTrue);
-    expect(makeDatum({}).isMap, isTrue);
-    expect(makeDatum(null).isMap, isTrue);
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).isMap, isTrue);
-    expect(makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).isMap, isTrue);
-    expect(makeDatum([]).isMap, isFalse);
-  }
-
-  void test_isStringList() {
-    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
-    expect(makeDatum([]).isStringList, isTrue);
-    expect(makeDatum(null).isStringList, isTrue);
-    expect(makeDatum(['foo', 1]).isStringList, isFalse);
-    expect(makeDatum({}).isStringList, isFalse);
-  }
-
-  void test_isStringListMap() {
-    expect(makeDatum({
-      'key1': ['value11', 'value12'],
-      'key2': ['value21', 'value22']
-    }).isStringListMap, isTrue);
-    expect(makeDatum({
-      'key1': 10,
-      'key2': 20
-    }).isStringListMap, isFalse);
-    expect(makeDatum({
-      'key1': [11, 12],
-      'key2': [21, 22]
-    }).isStringListMap, isFalse);
-    expect(makeDatum({}).isStringListMap, isTrue);
-    expect(makeDatum(null).isStringListMap, isTrue);
-    expect(makeDatum(3).isStringListMap, isFalse);
-  }
-
-  void test_isStringMap() {
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).isStringMap, isTrue);
-    expect(makeDatum({}).isStringMap, isTrue);
-    expect(makeDatum(null).isStringMap, isTrue);
-    expect(makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).isStringMap, isFalse);
-    expect(makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).isStringMap, isFalse);
-    expect(makeDatum([]).isMap, isFalse);
-  }
-
-  static RequestDatum makeDatum(dynamic datum) {
-    return new RequestDatum(request, 'myPath', datum);
-  }
 }
 
 
@@ -503,57 +201,12 @@
   }
 
   void test_fromJson_withParams() {
-    Request original = new Request('one', 'aMethod');
-    original.setParameter('foo', 'bar');
+    Request original = new Request('one', 'aMethod', {'foo': 'bar'});
     String json = JSON.encode(original.toJson());
     Request request = new Request.fromString(json);
     expect(request.id, equals('one'));
     expect(request.method, equals('aMethod'));
-    expect(request.getParameter('foo', null).asString(), equals('bar'));
-  }
-
-  void test_getParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getParameter(name, null).datum, equals(value));
-  }
-
-   void test_getParameter_null() {
-    String name = 'name';
-    Request request = new Request('0', '');
-    request.setParameter(name, null);
-    expect(request.getParameter(name, 'default').datum, equals(null));
-  }
-
-  void test_getParameter_undefined() {
-    String name = 'name';
-    String defaultValue = 'default value';
-    Request request = new Request('0', '');
-    expect(request.getParameter(name, defaultValue).datum, equals(
-        defaultValue));
-  }
-
-  void test_getRequiredParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getRequiredParameter(name).datum, equals(value));
-  }
-
-   void test_getRequiredParameter_null() {
-    String name = 'name';
-    Request request = new Request('0', '');
-    request.setParameter(name, null);
-    expect(request.getRequiredParameter(name).datum, equals(null));
-  }
-
-  void test_getRequiredParameter_undefined() {
-    String name = 'name';
-    Request request = new Request('0', '');
-    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
+    expect(request.toJson()['params'], equals({'foo': 'bar'}));
   }
 
   void test_toJson() {
@@ -565,8 +218,7 @@
   }
 
   void test_toJson_withParams() {
-    Request request = new Request('one', 'aMethod');
-    request.setParameter('foo', 'bar');
+    Request request = new Request('one', 'aMethod', {'foo': 'bar'});
     expect(request.toJson(), equals({
       Request.ID: 'one',
       Request.METHOD: 'aMethod',
@@ -678,26 +330,11 @@
   }
 
   void test_fromJson_withResult() {
-    Response original = new Response('myId');
-    original.setResult('foo', 'bar');
+    Response original = new Response('myId', result: {'foo': 'bar'});
     Response response = new Response.fromJson(original.toJson());
     expect(response.id, equals('myId'));
-    Map<String, Object> result = response.result;
+    Map<String, Object> result = response.toJson()['result'];
     expect(result.length, equals(1));
     expect(result['foo'], equals('bar'));
   }
-
-  void test_setResult() {
-    String resultName = 'name';
-    String resultValue = 'value';
-    Response response = new Response('0');
-    response.setResult(resultName, resultValue);
-    expect(response.getResult(resultName), same(resultValue));
-    expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.RESULT: {
-        resultName: resultValue
-      }
-    }));
-  }
 }
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index 2e33967..655ea34 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -6,14 +6,11 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/search/search_domain.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart' show Index;
-import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/index/index.dart' show Index;
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
@@ -70,19 +67,17 @@
 
   String getPathString(List<Element> path) {
     return path.map((Element element) {
-      return '${element.kind} ${element.name}';
+      return '${element.kind.name} ${element.name}';
     }).join('\n');
   }
 
   @override
   void processNotification(Notification notification) {
     if (notification.event == SEARCH_RESULTS) {
-      String id = notification.getParameter(ID);
-      if (id == searchId) {
-        for (Map<String, Object> json in notification.getParameter(RESULTS)) {
-          results.add(new SearchResult.fromJson(json));
-        }
-        searchDone = notification.getParameter(LAST);
+      var params = new SearchResultsParams.fromNotification(notification);
+      if (params.id == searchId) {
+        results.addAll(params.results);
+        searchDone = params.isLast;
       }
     }
   }
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index a0902bc..f517d80 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -6,11 +6,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -30,13 +26,12 @@
   Future findElementReferences(String search, bool includePotential) {
     int offset = findOffset(search);
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES);
-      request.setParameter(FILE, testFile);
-      request.setParameter(OFFSET, offset);
-      request.setParameter(INCLUDE_POTENTIAL, includePotential);
+      Request request = new SearchFindElementReferencesParams(testFile, offset,
+          includePotential).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      searchId = response.getResult(ID);
-      searchElement = response.getResult(ELEMENT);
+      var result = new SearchFindElementReferencesResult.fromResponse(response);
+      searchId = result.id;
+      searchElement = result.element;
       results.clear();
       return waitForSearchResults();
     });
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
index 3ebda0f..8c23381 100644
--- a/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -6,11 +6,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -41,10 +37,11 @@
 
   Future findMemberDeclarations(String name) {
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', SEARCH_FIND_MEMBER_DECLARATIONS);
-      request.setParameter(NAME, name);
+      Request request =
+          new SearchFindMemberDeclarationsParams(name).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      searchId = response.getResult(ID);
+      var result = new SearchFindMemberDeclarationsResult.fromResponse(response);
+      searchId = result.id;
       results.clear();
       return waitForSearchResults();
     });
diff --git a/pkg/analysis_server/test/search/member_references_test.dart b/pkg/analysis_server/test/search/member_references_test.dart
index 1275e99..8a8a3f3e 100644
--- a/pkg/analysis_server/test/search/member_references_test.dart
+++ b/pkg/analysis_server/test/search/member_references_test.dart
@@ -6,10 +6,7 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -31,10 +28,9 @@
 
   Future findMemberReferences(String name) {
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
-      request.setParameter(NAME, name);
+      Request request = new SearchFindMemberReferencesParams(name).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      searchId = response.getResult(ID);
+      searchId = new SearchFindMemberReferencesResult.fromResponse(response).id;
       results.clear();
       return waitForSearchResults();
     });
diff --git a/pkg/analysis_server/test/search/search_domain_test.dart b/pkg/analysis_server/test/search/search_domain_test.dart
deleted file mode 100644
index c8409b8..0000000
--- a/pkg/analysis_server/test/search/search_domain_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.search.domain;
-
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_domain.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_testing/mock_sdk.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:unittest/unittest.dart';
-
-import '../mocks.dart';
-
-
-main() {
-  groupSep = ' | ';
-
-  MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
-  AnalysisServer server;
-  SearchDomainHandler handler;
-
-  setUp(() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(
-        serverChannel,
-        resourceProvider,
-        new MockPackageMapProvider(),
-        null,
-        new MockSdk());
-    handler = new SearchDomainHandler(server);
-  });
-
-  group('SearchDomainHandler', () {
-    test('findMemberReferences', () {
-      var request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
-      request.setParameter(NAME, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-  });
-}
diff --git a/pkg/analysis_server/test/search/search_result_test.dart b/pkg/analysis_server/test/search/search_result_test.dart
index dc2c4dc..aeedacc 100644
--- a/pkg/analysis_server/test/search/search_result_test.dart
+++ b/pkg/analysis_server/test/search/search_result_test.dart
@@ -4,17 +4,14 @@
 
 library test.search.search_result;
 
-import 'package:analysis_server/src/computer/element.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(SearchResultTest);
   runReflectiveTests(SearchResultKindTest);
 }
 
@@ -45,70 +42,30 @@
 
   void test_fromName() {
     expect(
-        new SearchResultKind.fromName(SearchResultKind.DECLARATION.name),
+        new SearchResultKind(SearchResultKind.DECLARATION.name),
         SearchResultKind.DECLARATION);
     expect(
-        new SearchResultKind.fromName(SearchResultKind.READ.name),
+        new SearchResultKind(SearchResultKind.READ.name),
         SearchResultKind.READ);
     expect(
-        new SearchResultKind.fromName(SearchResultKind.READ_WRITE.name),
+        new SearchResultKind(SearchResultKind.READ_WRITE.name),
         SearchResultKind.READ_WRITE);
     expect(
-        new SearchResultKind.fromName(SearchResultKind.WRITE.name),
+        new SearchResultKind(SearchResultKind.WRITE.name),
         SearchResultKind.WRITE);
     expect(
-        new SearchResultKind.fromName(SearchResultKind.REFERENCE.name),
+        new SearchResultKind(SearchResultKind.REFERENCE.name),
         SearchResultKind.REFERENCE);
     expect(
-        new SearchResultKind.fromName(SearchResultKind.INVOCATION.name),
+        new SearchResultKind(SearchResultKind.INVOCATION.name),
         SearchResultKind.INVOCATION);
-    expect(new SearchResultKind.fromName(null), SearchResultKind.UNKNOWN);
+    expect(
+        new SearchResultKind(SearchResultKind.UNKNOWN.name),
+        SearchResultKind.UNKNOWN);
   }
 
   void test_toString() {
-    expect(SearchResultKind.DECLARATION.toString(), 'DECLARATION');
-  }
-}
-
-
-@ReflectiveTestCase()
-class SearchResultTest {
-  void test_fromJson() {
-    Map<String, Object> map = {
-      KIND: 'READ',
-      IS_POTENTIAL: true,
-      LOCATION: {
-        FILE: '/test.dart',
-        OFFSET: 1,
-        LENGTH: 2,
-        START_LINE: 3,
-        START_COLUMN: 4
-      },
-      PATH: [
-          new Element(
-              ElementKind.FIELD,
-              'myField',
-              new Location('/lib.dart', 10, 20, 30, 40),
-              false,
-              false).toJson()]
-    };
-    SearchResult result = new SearchResult.fromJson(map);
-    expect(result.kind, SearchResultKind.READ);
-    expect(result.location.file, '/test.dart');
-    expect(result.location.offset, 1);
-    expect(result.location.length, 2);
-    expect(result.location.startLine, 3);
-    expect(result.location.startColumn, 4);
-    expect(result.path, hasLength(1));
-    expect(result.path[0].kind, ElementKind.FIELD);
-    expect(result.path[0].name, 'myField');
-    expect(result.path[0].location.file, '/lib.dart');
-    expect(result.path[0].location.offset, 10);
-    // touch toJson();
-    expect(result.toJson(), hasLength(4));
-    // touch asJson();
-    expect(SearchResult.asJson(result), hasLength(4));
-    // touch toString();
-    expect(result.toString(), hasLength(greaterThan(10)));
+    expect(SearchResultKind.DECLARATION.toString(),
+        'SearchResultKind.DECLARATION');
   }
 }
diff --git a/pkg/analysis_server/test/search/test_all.dart b/pkg/analysis_server/test/search/test_all.dart
index db3efd7..5bc1b7b 100644
--- a/pkg/analysis_server/test/search/test_all.dart
+++ b/pkg/analysis_server/test/search/test_all.dart
@@ -8,7 +8,6 @@
 import 'element_references_test.dart' as element_references_test;
 import 'member_declarations_test.dart' as member_declarations;
 import 'member_references_test.dart' as member_references_test;
-import 'search_domain_test.dart' as search_domain_test;
 import 'search_result_test.dart' as search_result_test;
 import 'top_level_declarations_test.dart' as top_level_declarations_test;
 import 'type_hierarchy_test.dart' as type_hierarchy_test;
@@ -22,7 +21,6 @@
     element_references_test.main();
     member_declarations.main();
     member_references_test.main();
-    search_domain_test.main();
     search_result_test.main();
     top_level_declarations_test.main();
     type_hierarchy_test.main();
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
index 902fa26..59a5eeb 100644
--- a/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -4,16 +4,12 @@
 
 library test.search.top_level_declarations;
 
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/search/search_result.dart';
-import 'package:analysis_services/constants.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import 'abstract_search_domain.dart';
 import 'dart:async';
-import 'package:analysis_server/src/computer/element.dart';
 
 
 main() {
@@ -26,10 +22,11 @@
 class TopLevelDeclarationsTest extends AbstractSearchDomainTest {
   Future findTopLevelDeclarations(String pattern) {
     return waitForTasksFinished().then((_) {
-      Request request = new Request('0', SEARCH_FIND_TOP_LEVEL_DECLARATIONS);
-      request.setParameter(PATTERN, pattern);
+      Request request = new SearchFindTopLevelDeclarationsParams(
+          pattern).toRequest('0');
       Response response = handleSuccessfulRequest(request);
-      searchId = response.getResult(ID);
+      searchId = new SearchFindTopLevelDeclarationsResult.fromResponse(
+          response).id;
       results.clear();
       return waitForSearchResults();
     });
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index a24dd47..d542fb8 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -6,12 +6,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/search/search_domain.dart';
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -46,8 +44,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('main() {').then((jsons) {
-        expect(jsons, isNull);
+      return _getTypeHierarchy('main() {').then((items) {
+        expect(items, isEmpty);
       });
     });
   }
@@ -60,8 +58,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('B extends A').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('B extends A').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'B',
@@ -96,12 +94,12 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('B extends').then((jsons) {
-        var jsonB = jsons[0];
-        var jsonA = jsons[jsonB[SUPERCLASS]];
-        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
-        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
-        expect(jsonA[DISPLAY_NAME], 'A<int>');
+      return _getTypeHierarchy('B extends').then((items) {
+        var itemB = items[0];
+        var itemA = items[itemB.superclass];
+        expect(itemA.classElement.name, 'A');
+        expect(itemB.classElement.name, 'B');
+        expect(itemA.displayName, 'A<int>');
       });
     });
   }
@@ -115,8 +113,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('A {}').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('A {}').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'A',
@@ -174,8 +172,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('B extends').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('B extends').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'B',
@@ -233,8 +231,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('C extends').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('C extends').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'C',
@@ -292,8 +290,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('T implements').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('T implements').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'T',
@@ -351,8 +349,8 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('T extends Object').then((jsons) {
-        expect(jsons, [{
+      return _getTypeHierarchy('T extends Object').then((items) {
+        expect(_toJson(items), [{
             'classElement': {
               'kind': 'CLASS',
               'name': 'T',
@@ -415,24 +413,24 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('test => null; // in B').then((jsons) {
-        Map jsonB = jsons[0];
-        Map jsonA = jsons[jsonB[SUPERCLASS]];
-        Map jsonC = jsons[jsonB[SUBCLASSES][0]];
-        Map jsonD = jsons[jsonC[SUBCLASSES][0]];
-        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
-        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
-        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
-        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+      return _getTypeHierarchy('test => null; // in B').then((items) {
+        TypeHierarchyItem itemB = items[0];
+        TypeHierarchyItem itemA = items[itemB.superclass];
+        TypeHierarchyItem itemC = items[itemB.subclasses[0]];
+        TypeHierarchyItem itemD = items[itemC.subclasses[0]];
+        expect(itemA.classElement.name, 'A');
+        expect(itemB.classElement.name, 'B');
+        expect(itemC.classElement.name, 'C');
+        expect(itemD.classElement.name, 'D');
         expect(
-            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemA.memberElement.location.offset,
             findOffset('test => null; // in A'));
         expect(
-            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemB.memberElement.location.offset,
             findOffset('test => null; // in B'));
-        expect(jsonC['memberElement'], isNull);
+        expect(itemC.memberElement, isNull);
         expect(
-            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemD.memberElement.location.offset,
             findOffset('test => null; // in D'));
       });
     });
@@ -453,24 +451,24 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('test() {} // in B').then((jsons) {
-        var jsonB = jsons[0];
-        var jsonA = jsons[jsonB[SUPERCLASS]];
-        var jsonC = jsons[jsonB[SUBCLASSES][0]];
-        var jsonD = jsons[jsonC[SUBCLASSES][0]];
-        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
-        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
-        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
-        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+      return _getTypeHierarchy('test() {} // in B').then((items) {
+        var itemB = items[0];
+        var itemA = items[itemB.superclass];
+        var itemC = items[itemB.subclasses[0]];
+        var itemD = items[itemC.subclasses[0]];
+        expect(itemA.classElement.name, 'A');
+        expect(itemB.classElement.name, 'B');
+        expect(itemC.classElement.name, 'C');
+        expect(itemD.classElement.name, 'D');
         expect(
-            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemA.memberElement.location.offset,
             findOffset('test() {} // in A'));
         expect(
-            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemB.memberElement.location.offset,
             findOffset('test() {} // in B'));
-        expect(jsonC['memberElement'], isNull);
+        expect(itemC.memberElement, isNull);
         expect(
-            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemD.memberElement.location.offset,
             findOffset('test() {} // in D'));
       });
     });
@@ -491,24 +489,24 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('==(x) => null; // in B').then((jsons) {
-        var jsonB = jsons[0];
-        var jsonA = jsons[jsonB[SUPERCLASS]];
-        var jsonC = jsons[jsonB[SUBCLASSES][0]];
-        var jsonD = jsons[jsonC[SUBCLASSES][0]];
-        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
-        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
-        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
-        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+      return _getTypeHierarchy('==(x) => null; // in B').then((items) {
+        var itemB = items[0];
+        var itemA = items[itemB.superclass];
+        var itemC = items[itemB.subclasses[0]];
+        var itemD = items[itemC.subclasses[0]];
+        expect(itemA.classElement.name, 'A');
+        expect(itemB.classElement.name, 'B');
+        expect(itemC.classElement.name, 'C');
+        expect(itemD.classElement.name, 'D');
         expect(
-            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemA.memberElement.location.offset,
             findOffset('==(x) => null; // in A'));
         expect(
-            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemB.memberElement.location.offset,
             findOffset('==(x) => null; // in B'));
-        expect(jsonC['memberElement'], isNull);
+        expect(itemC.memberElement, isNull);
         expect(
-            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemD.memberElement.location.offset,
             findOffset('==(x) => null; // in D'));
       });
     });
@@ -529,41 +527,44 @@
 }
 ''');
     return waitForTasksFinished().then((_) {
-      return _getTypeHierarchy('test(x) {} // in B').then((jsons) {
-        var jsonB = jsons[0];
-        var jsonA = jsons[jsonB[SUPERCLASS]];
-        var jsonC = jsons[jsonB[SUBCLASSES][0]];
-        var jsonD = jsons[jsonC[SUBCLASSES][0]];
-        expect(jsonA[CLASS_ELEMENT][NAME], 'A');
-        expect(jsonB[CLASS_ELEMENT][NAME], 'B');
-        expect(jsonC[CLASS_ELEMENT][NAME], 'C');
-        expect(jsonD[CLASS_ELEMENT][NAME], 'D');
+      return _getTypeHierarchy('test(x) {} // in B').then((items) {
+        var itemB = items[0];
+        var itemA = items[itemB.superclass];
+        var itemC = items[itemB.subclasses[0]];
+        var itemD = items[itemC.subclasses[0]];
+        expect(itemA.classElement.name, 'A');
+        expect(itemB.classElement.name, 'B');
+        expect(itemC.classElement.name, 'C');
+        expect(itemD.classElement.name, 'D');
         expect(
-            jsonA[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemA.memberElement.location.offset,
             findOffset('test(x) {} // in A'));
         expect(
-            jsonB[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemB.memberElement.location.offset,
             findOffset('test(x) {} // in B'));
-        expect(jsonC['memberElement'], isNull);
+        expect(itemC.memberElement, isNull);
         expect(
-            jsonD[MEMBER_ELEMENT][LOCATION][OFFSET],
+            itemD.memberElement.location.offset,
             findOffset('test(x) {} // in D'));
       });
     });
   }
 
   Request _createGetTypeHierarchyRequest(String search) {
-    int offset = findOffset(search);
-    Request request = new Request(requestId, SEARCH_GET_TYPE_HIERARCHY);
-    request.setParameter(FILE, testFile);
-    request.setParameter(OFFSET, offset);
-    return request;
+    return new SearchGetTypeHierarchyParams(
+        testFile,
+        findOffset(search)).toRequest(requestId);
   }
 
-  Future<List<Map<String, Object>>> _getTypeHierarchy(String search) {
+  Future<List<TypeHierarchyItem>> _getTypeHierarchy(String search) {
     Request request = _createGetTypeHierarchyRequest(search);
     return serverChannel.sendRequest(request).then((Response response) {
-      return response.getResult(HIERARCHY_ITEMS) as List<Map<String, Object>>;
+      return new SearchGetTypeHierarchyResult.fromResponse(
+          response).hierarchyItems;
     });
   }
+
+  List _toJson(List<TypeHierarchyItem> items) {
+    return items.map((item) => item.toJson()).toList();
+  }
 }
diff --git a/pkg/analysis_services/test/completion/completion_computer_test.dart b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
similarity index 70%
rename from pkg/analysis_services/test/completion/completion_computer_test.dart
rename to pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 961d00c..15562d6 100644
--- a/pkg/analysis_services/test/completion/completion_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -6,24 +6,21 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/completion/dart_completion_manager.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
-import 'package:analysis_testing/abstract_context.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
-import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(CompletionManagerTest);
   runReflectiveTests(DartCompletionManagerTest);
 }
 
@@ -42,34 +39,6 @@
 }
 
 @ReflectiveTestCase()
-class CompletionManagerTest extends AbstractContextTest {
-
-  test_dart() {
-    Source source = addSource('/does/not/exist.dart', '');
-    var manager = CompletionManager.create(context, source, 0, null);
-    expect(manager.runtimeType, DartCompletionManager);
-  }
-
-  test_html() {
-    Source source = addSource('/does/not/exist.html', '');
-    var manager = CompletionManager.create(context, source, 0, null);
-    expect(manager.runtimeType, NoOpCompletionManager);
-  }
-
-  test_null_context() {
-    Source source = addSource('/does/not/exist.dart', '');
-    var manager = CompletionManager.create(null, source, 0, null);
-    expect(manager.runtimeType, NoOpCompletionManager);
-  }
-
-  test_other() {
-    Source source = addSource('/does/not/exist.foo', '');
-    var manager = CompletionManager.create(context, source, 0, null);
-    expect(manager.runtimeType, NoOpCompletionManager);
-  }
-}
-
-@ReflectiveTestCase()
 class DartCompletionManagerTest extends AbstractSingleUnitTest {
   Index index;
   SearchEngineImpl searchEngine;
@@ -80,13 +49,19 @@
   CompletionSuggestion suggestion1;
   CompletionSuggestion suggestion2;
 
+  void resolveLibrary() {
+    context.resolveCompilationUnit(
+        source,
+        context.computeLibraryElement(source));
+  }
+
   @override
   void setUp() {
     super.setUp();
     index = createLocalMemoryIndex();
     searchEngine = new SearchEngineImpl(index);
     source = addSource('/does/not/exist.dart', '');
-    manager = new DartCompletionManager(context, source, 17, searchEngine);
+    manager = new DartCompletionManager(context, searchEngine, source, 17);
     suggestion1 = new CompletionSuggestion(
         CompletionSuggestionKind.CLASS,
         CompletionRelevance.DEFAULT,
@@ -105,34 +80,6 @@
         false);
   }
 
-  test_compute_fastOnly() {
-    computer1 = new MockCompletionComputer(suggestion1, null);
-    computer2 = new MockCompletionComputer(suggestion2, null);
-    manager.computers = [computer1, computer2];
-    int count = 0;
-    bool done = false;
-    manager.results().listen((CompletionResult r) {
-      switch (++count) {
-        case 1:
-          computer1.assertCalls(context, source, 17, searchEngine);
-          computer2.assertCalls(context, source, 17, searchEngine);
-          expect(r.last, isTrue);
-          expect(r.suggestions, hasLength(2));
-          expect(r.suggestions, contains(suggestion1));
-          expect(r.suggestions, contains(suggestion2));
-          break;
-        default:
-          fail('unexpected');
-      }
-    }, onDone: () {
-      done = true;
-      expect(count, equals(1));
-    });
-    return pumpEventQueue().then((_) {
-      expect(done, isTrue);
-    });
-  }
-
   test_compute_fastAndFull() {
     computer1 = new MockCompletionComputer(suggestion1, null);
     computer2 = new MockCompletionComputer(null, suggestion2);
@@ -169,27 +116,50 @@
     });
   }
 
-  void resolveLibrary() {
-    context.resolveCompilationUnit(
-        source,
-        context.computeLibraryElement(source));
+  test_compute_fastOnly() {
+    computer1 = new MockCompletionComputer(suggestion1, null);
+    computer2 = new MockCompletionComputer(suggestion2, null);
+    manager.computers = [computer1, computer2];
+    int count = 0;
+    bool done = false;
+    manager.results().listen((CompletionResult r) {
+      switch (++count) {
+        case 1:
+          computer1.assertCalls(context, source, 17, searchEngine);
+          computer2.assertCalls(context, source, 17, searchEngine);
+          expect(r.last, isTrue);
+          expect(r.suggestions, hasLength(2));
+          expect(r.suggestions, contains(suggestion1));
+          expect(r.suggestions, contains(suggestion2));
+          break;
+        default:
+          fail('unexpected');
+      }
+    }, onDone: () {
+      done = true;
+      expect(count, equals(1));
+    });
+    return pumpEventQueue().then((_) {
+      expect(done, isTrue);
+    });
   }
 }
 
-class MockCompletionComputer extends CompletionComputer {
+class MockCompletionComputer extends DartCompletionComputer {
   final CompletionSuggestion fastSuggestion;
   final CompletionSuggestion fullSuggestion;
   int fastCount = 0;
   int fullCount = 0;
+  DartCompletionRequest request;
 
   MockCompletionComputer(this.fastSuggestion, this.fullSuggestion);
 
   assertCalls(AnalysisContext context, Source source, int offset,
       SearchEngine searchEngine) {
-    expect(this.context, equals(context));
-    expect(this.source, equals(source));
-    expect(this.offset, equals(offset));
-    expect(this.searchEngine, equals(searchEngine));
+    expect(request.context, equals(context));
+    expect(request.source, equals(source));
+    expect(request.offset, equals(offset));
+    expect(request.searchEngine, equals(searchEngine));
     expect(this.fastCount, equals(1));
     expect(this.fullCount, equals(0));
   }
@@ -200,21 +170,21 @@
   }
 
   @override
-  bool computeFast(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
+  bool computeFast(DartCompletionRequest request) {
+    this.request = request;
     fastCount++;
     if (fastSuggestion != null) {
-      suggestions.add(fastSuggestion);
+      request.suggestions.add(fastSuggestion);
     }
     return fastSuggestion != null;
   }
 
   @override
-  Future<bool> computeFull(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
+  Future<bool> computeFull(DartCompletionRequest request) {
+    this.request = request;
     fullCount++;
     if (fullSuggestion != null) {
-      suggestions.add(fullSuggestion);
+      request.suggestions.add(fullSuggestion);
     }
     return new Future.value(fullSuggestion != null);
   }
diff --git a/pkg/analysis_server/test/services/completion/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
new file mode 100644
index 0000000..582e9a4
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.manager;
+
+import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_testing/abstract_context.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(CompletionManagerTest);
+}
+
+@ReflectiveTestCase()
+class CompletionManagerTest extends AbstractContextTest {
+
+  test_dart() {
+    Source source = addSource('/does/not/exist.dart', '');
+    var manager = CompletionManager.create(context, source, 0, null);
+    expect(manager.runtimeType, DartCompletionManager);
+  }
+
+  test_html() {
+    Source source = addSource('/does/not/exist.html', '');
+    var manager = CompletionManager.create(context, source, 0, null);
+    expect(manager.runtimeType, NoOpCompletionManager);
+  }
+
+  test_null_context() {
+    Source source = addSource('/does/not/exist.dart', '');
+    var manager = CompletionManager.create(null, source, 0, null);
+    expect(manager.runtimeType, NoOpCompletionManager);
+  }
+
+  test_other() {
+    Source source = addSource('/does/not/exist.foo', '');
+    var manager = CompletionManager.create(context, source, 0, null);
+    expect(manager.runtimeType, NoOpCompletionManager);
+  }
+}
diff --git a/pkg/analysis_services/test/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
similarity index 63%
rename from pkg/analysis_services/test/completion/completion_test_util.dart
rename to pkg/analysis_server/test/services/completion/completion_test_util.dart
index 91439e8..ab04f45 100644
--- a/pkg/analysis_services/test/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -6,11 +6,11 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_context.dart';
 import 'package:analysis_testing/mock_sdk.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -22,12 +22,12 @@
 class AbstractCompletionTest extends AbstractContextTest {
   Index index;
   SearchEngineImpl searchEngine;
-  CompletionComputer computer;
+  DartCompletionComputer computer;
   String testFile = '/completionTest.dart';
   Source testSource;
   int completionOffset;
-  List<CompletionSuggestion> suggestions;
   bool _computeFastCalled = false;
+  DartCompletionRequest request;
 
   void addResolvedUnit(String file, String code) {
     Source source = addSource(file, code);
@@ -44,10 +44,15 @@
     content = content.substring(0, completionOffset) +
         content.substring(completionOffset + 1);
     testSource = addSource(testFile, content);
+    request = new DartCompletionRequest(
+        context,
+        searchEngine,
+        testSource,
+        completionOffset);
   }
 
   void assertNotSuggested(String completion) {
-    if (suggestions.any((cs) => cs.completion == completion)) {
+    if (request.suggestions.any((cs) => cs.completion == completion)) {
       fail('did not expect completion: $completion');
     }
   }
@@ -55,18 +60,22 @@
   void assertSuggest(CompletionSuggestionKind kind, String completion,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT, bool isDeprecated
       = false, bool isPotential = false]) {
-    var cs;
-    suggestions.forEach((s) {
+    CompletionSuggestion cs;
+    request.suggestions.forEach((s) {
       if (s.completion == completion) {
         if (cs == null) {
           cs = s;
         } else {
-          fail('expected exactly one $completion but found > 1');
+          List<CompletionSuggestion> matchSuggestions =
+              request.suggestions.where((s) => s.completion == completion).toList();
+          fail(
+              'expected exactly one $completion but found > 1\n $matchSuggestions');
         }
       }
     });
     if (cs == null) {
-      var completions = suggestions.map((s) => s.completion).toList();
+      List<CompletionSuggestion> completions =
+          request.suggestions.map((s) => s.completion).toList();
       fail('expected "$completion" but found\n $completions');
     }
     expect(cs.kind, equals(kind));
@@ -92,6 +101,11 @@
     assertSuggest(CompletionSuggestionKind.FUNCTION, completion, relevance);
   }
 
+  void assertSuggestGetter(String className, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    assertSuggest(CompletionSuggestionKind.GETTER, className, relevance);
+  }
+
   void assertSuggestLibraryPrefix(String completion,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     assertSuggest(
@@ -100,6 +114,19 @@
         relevance);
   }
 
+  void assertSuggestLocalVariable(String completion,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    assertSuggest(
+        CompletionSuggestionKind.LOCAL_VARIABLE,
+        completion,
+        relevance);
+  }
+
+  void assertSuggestMethod(String className, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    assertSuggest(CompletionSuggestionKind.METHOD, className, relevance);
+  }
+
   void assertSuggestMethodName(String completion, [CompletionRelevance relevance
       = CompletionRelevance.DEFAULT]) {
     assertSuggest(CompletionSuggestionKind.METHOD_NAME, completion, relevance);
@@ -110,6 +137,11 @@
     assertSuggest(CompletionSuggestionKind.PARAMETER, completion, relevance);
   }
 
+  void assertSuggestSetter(String className, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    assertSuggest(CompletionSuggestionKind.SETTER, className, relevance);
+  }
+
   void assertSuggestTopLevelVar(String completion,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     assertSuggest(
@@ -118,44 +150,52 @@
         relevance);
   }
 
-  void assertSuggestVariable(String completion, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.LOCAL_VARIABLE, completion, relevance);
-  }
-
   bool computeFast() {
     _computeFastCalled = true;
-    computer
-        ..context = context
-        ..searchEngine = searchEngine
-        ..source = testSource
-        ..offset = completionOffset;
-    suggestions = [];
     CompilationUnit unit = context.parseCompilationUnit(testSource);
-    AstNode node = new NodeLocator.con1(completionOffset).searchWithin(unit);
-    return computer.computeFast(unit, node, suggestions);
+    request.unit = unit;
+    request.node = new NodeLocator.con1(completionOffset).searchWithin(unit);
+    return computer.computeFast(request);
   }
 
-  Future<bool> computeFull() {
+  Future<bool> computeFull([bool fullAnalysis = false]) {
     if (!_computeFastCalled) {
       expect(computeFast(), isFalse);
     }
     var result = context.performAnalysisTask();
+    bool resolved = false;
     while (result.hasMoreWork) {
+
+      // Update the index
       result.changeNotices.forEach((ChangeNotice notice) {
         CompilationUnit unit = notice.compilationUnit;
         if (unit != null) {
           index.indexUnit(context, unit);
         }
       });
+
+      // If the unit has been resolved, then finish the completion
+      LibraryElement library = context.getLibraryElement(testSource);
+      if (library != null) {
+        CompilationUnit unit =
+            context.getResolvedCompilationUnit(testSource, library);
+        if (unit != null) {
+          request.unit = unit;
+          request.node = new NodeLocator.con1(
+              completionOffset).searchWithin(unit);
+          resolved = true;
+          if (!fullAnalysis) {
+            break;
+          }
+        }
+      }
+
       result = context.performAnalysisTask();
     }
-    LibraryElement library = context.getLibraryElement(testSource);
-    expect(library, isNotNull);
-    var unit = context.getResolvedCompilationUnit(testSource, library);
-    expect(unit, isNotNull);
-    AstNode node = new NodeLocator.con1(completionOffset).searchWithin(unit);
-    return computer.computeFull(unit, node, suggestions);
+    if (!resolved) {
+      fail('expected unit to be resolved');
+    }
+    return computer.computeFull(request);
   }
 
   @override
diff --git a/pkg/analysis_services/test/completion/imported_type_computer_test.dart b/pkg/analysis_server/test/services/completion/imported_type_computer_test.dart
similarity index 74%
rename from pkg/analysis_services/test/completion/imported_type_computer_test.dart
rename to pkg/analysis_server/test/services/completion/imported_type_computer_test.dart
index a6361f6..f409768 100644
--- a/pkg/analysis_services/test/completion/imported_type_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_type_computer_test.dart
@@ -4,8 +4,8 @@
 
 library test.services.completion.toplevel;
 
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/src/completion/imported_type_computer.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/imported_type_computer.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -107,7 +107,7 @@
   test_class_notImported() {
     addSource('/testA.dart', 'class A {int x;} class _B { }');
     addTestSource('class C {foo(){^}}');
-    return computeFull().then((_) {
+    return computeFull(true).then((_) {
       assertSuggestClass('A', CompletionRelevance.LOW);
       assertNotSuggested('x');
       assertNotSuggested('_B');
@@ -130,6 +130,41 @@
     });
   }
 
+  test_field_name() {
+    addSource('/testA.dart', 'class A { }');
+    addTestSource('import "/testA.dart"; class C {A ^}');
+    return computeFull().then((_) {
+      assertNotSuggested('A');
+    });
+  }
+
+  test_field_name2() {
+    addSource('/testA.dart', 'class A { }');
+    addTestSource('import "/testA.dart"; class C {var ^}');
+    return computeFull().then((_) {
+      assertNotSuggested('A');
+    });
+  }
+
+  test_local_name() {
+    addSource('/testA.dart', 'var T1;');
+    addTestSource('import "/testA.dart"; class C {a() {C ^}}');
+    return computeFull().then((_) {
+      //TODO (danrubel) should not be suggested
+      // but C ^ in this test
+      // parses differently than var ^ in test below
+      assertSuggestTopLevelVar('T1');
+    });
+  }
+
+  test_local_name2() {
+    addSource('/testA.dart', 'var T1;');
+    addTestSource('import "/testA.dart"; class C {a() {var ^}}');
+    return computeFull().then((_) {
+      assertNotSuggested('T1');
+    });
+  }
+
   test_topLevelVar() {
     addSource('/testA.dart', 'var T1; var _T2;');
     addTestSource('import "/testA.dart"; class C {foo(){^}}');
@@ -139,10 +174,26 @@
     });
   }
 
+  test_topLevelVar_name() {
+    addSource('/testA.dart', 'class B { };');
+    addTestSource('import "/testA.dart"; class C {} B ^');
+    return computeFull().then((_) {
+      assertNotSuggested('B');
+    });
+  }
+
+  test_topLevelVar_name2() {
+    addSource('/testA.dart', 'class B { };');
+    addTestSource('import "/testA.dart"; class C {} var ^');
+    return computeFull().then((_) {
+      assertNotSuggested('B');
+    });
+  }
+
   test_topLevelVar_notImported() {
     addSource('/testA.dart', 'var T1; var _T2;');
     addTestSource('class C {foo(){^}}');
-    return computeFull().then((_) {
+    return computeFull(true).then((_) {
       assertSuggestTopLevelVar('T1', CompletionRelevance.LOW);
       assertNotSuggested('_T2');
     });
diff --git a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
new file mode 100644
index 0000000..e191a9a
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.invocation;
+
+
+import 'package:analysis_server/src/services/completion/invocation_computer.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'completion_test_util.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(InvocationComputerTest);
+}
+
+@ReflectiveTestCase()
+class InvocationComputerTest extends AbstractCompletionTest {
+
+  @override
+  void setUp() {
+    super.setUp();
+    computer = new InvocationComputer();
+  }
+
+  test_field() {
+    addTestSource('class A {var b; var _c;} main() {A a; a.^}');
+    return computeFull().then((_) {
+      assertSuggestField('b');
+      assertSuggestField('_c');
+    });
+  }
+
+  test_field_imported() {
+    addSource('/testB.dart', 'lib B; class X {var y; var _z;}');
+    addTestSource('import "/testB.dart"; main() {X x; x.^}');
+    return computeFull().then((_) {
+      assertSuggestField('y');
+      assertNotSuggested('_z');
+    });
+  }
+
+  test_field_superclass() {
+    addTestSource(
+        'class A {var b; var _c;} class B extends A {} main() {B b; b.^}');
+    return computeFull().then((_) {
+      assertSuggestField('b');
+      assertSuggestField('_c');
+    });
+  }
+
+  test_getter() {
+    addTestSource(
+        'class A {A get b => new A();A get _c => new A();} main() {A a; a.^}');
+    return computeFull().then((_) {
+      assertSuggestGetter('b');
+      assertSuggestGetter('_c');
+    });
+  }
+
+  test_getter_imported() {
+    addSource(
+        '/testB.dart',
+        'lib B; class X {X get y => new X(); X get _z => new X();}');
+    addTestSource('import "/testB.dart"; main() {X x; x.^}');
+    return computeFull().then((_) {
+      assertSuggestGetter('y');
+      assertNotSuggested('_z');
+    });
+  }
+
+  test_getter_interface() {
+    addTestSource(
+        '''class A {A get b => new A();A get _c => new A();}
+           class B implements A {A get b => new A();}
+           main() {B b; b.^}''');
+    return computeFull().then((_) {
+      assertSuggestGetter('b');
+      assertSuggestGetter('_c');
+    });
+  }
+
+  test_library_prefix() {
+    addSource('/testB.dart', 'lib B; class X { }');
+    addTestSource('import "/testB.dart" as b; main() {b.^}');
+    return computeFull().then((_) {
+      assertSuggestClass('X');
+    });
+  }
+
+  test_method() {
+    addTestSource('class A {b(X x) {} _c(X x) {}} main() {A a; a.^}');
+    return computeFull().then((_) {
+      assertSuggestMethod('b');
+      assertSuggestMethod('_c');
+    });
+  }
+
+  test_method_imported() {
+    addSource('/testB.dart', 'lib B; class X {y(X x) {} _z(X x) {}}');
+    addTestSource('import "/testB.dart"; main() {X x; x.^}');
+    return computeFull().then((_) {
+      assertSuggestMethod('y');
+      assertNotSuggested('_z');
+    });
+  }
+
+  test_method_imported_mixin() {
+    addSource('/testB.dart', 'lib B; class X {y(X x) {} _z(X x) {}}');
+    addTestSource('''import "/testB.dart";
+      class A extends Object with X {}
+      main() {A a; a.^}''');
+    return computeFull().then((_) {
+      assertSuggestMethod('y');
+      assertNotSuggested('_z');
+    });
+  }
+
+  test_setter() {
+    addTestSource('class A {set b(X x) {} set _c(X x) {}} main() {A a; a.^}');
+    return computeFull().then((_) {
+      assertSuggestSetter('b');
+      assertSuggestSetter('_c');
+    });
+  }
+
+  test_setter_imported() {
+    addSource('/testB.dart', 'lib B; class X {set y(X x) {} set _z(X x) {}}');
+    addTestSource('import "/testB.dart"; main() {X x; x.^}');
+    return computeFull().then((_) {
+      assertSuggestSetter('y');
+      assertNotSuggested('_z');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/keyword_computer_test.dart b/pkg/analysis_server/test/services/completion/keyword_computer_test.dart
new file mode 100644
index 0000000..1f0725e
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/keyword_computer_test.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.dart.keyword;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/keyword_computer.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:unittest/unittest.dart';
+
+import 'completion_test_util.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(KeywordComputerTest);
+}
+
+@ReflectiveTestCase()
+class KeywordComputerTest extends AbstractCompletionTest {
+
+  void assertSuggestKeywords(List<String> names) {
+    Keyword.values.forEach((Keyword keyword) {
+      if (names.contains(keyword.syntax)) {
+        assertSuggest(CompletionSuggestionKind.KEYWORD, keyword.syntax);
+      } else {
+        assertNotSuggested(keyword.syntax);
+      }
+    });
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    computer = new KeywordComputer();
+  }
+
+  test_after_class() {
+    addTestSource('class A {} ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(
+        ['abstract', 'class', 'const', 'final', 'typedef', 'var']);
+  }
+
+  test_before_import() {
+    addTestSource('^ import foo;');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(['export', 'import', 'library', 'part']);
+  }
+
+  test_class() {
+    addTestSource('class A ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(['extends', 'implements']);
+  }
+
+  test_class_extends() {
+    addTestSource('class A extends foo ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(['implements', 'with']);
+  }
+
+  test_class_extends_name() {
+    addTestSource('class A extends ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords([]);
+  }
+
+  test_class_implements() {
+    addTestSource('class A ^ implements foo');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(['extends']);
+  }
+
+  test_class_implements_name() {
+    addTestSource('class A implements ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords([]);
+  }
+
+  test_class_name() {
+    addTestSource('class ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords([]);
+  }
+
+  test_class_with_name() {
+    addTestSource('class A extends foo with ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords([]);
+  }
+
+  test_empty() {
+    addTestSource('^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(
+        [
+            'abstract',
+            'class',
+            'const',
+            'export',
+            'final',
+            'import',
+            'library',
+            'part',
+            'typedef',
+            'var']);
+  }
+
+  test_library() {
+    addTestSource('library foo;^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(
+        [
+            'abstract',
+            'class',
+            'const',
+            'export',
+            'final',
+            'import',
+            'part',
+            'typedef',
+            'var']);
+  }
+
+  test_library_name() {
+    addTestSource('library ^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords([]);
+  }
+
+  test_part_of() {
+    addTestSource('part of foo;^');
+    expect(computeFast(), isTrue);
+    assertSuggestKeywords(
+        [
+            'abstract',
+            'class',
+            'const',
+            'export',
+            'final',
+            'import',
+            'part',
+            'typedef',
+            'var']);
+  }
+}
diff --git a/pkg/analysis_services/test/completion/local_computer_test.dart b/pkg/analysis_server/test/services/completion/local_computer_test.dart
similarity index 68%
rename from pkg/analysis_services/test/completion/local_computer_test.dart
rename to pkg/analysis_server/test/services/completion/local_computer_test.dart
index 47a8ca9..a3bc536 100644
--- a/pkg/analysis_services/test/completion/local_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_computer_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.completion.dart.local;
 
-import 'package:analysis_services/src/completion/local_computer.dart';
+import 'package:analysis_server/src/services/completion/local_computer.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -27,7 +27,7 @@
   test_block() {
     addTestSource('class A {a() {var f; {var x;} ^ var g;}}');
     expect(computeFast(), isTrue);
-    assertSuggestVariable('f');
+    assertSuggestLocalVariable('f');
     assertNotSuggested('g');
     assertNotSuggested('x');
   }
@@ -59,16 +59,28 @@
     assertSuggestLibraryPrefix('x');
   }
 
+  test_field_name() {
+    addTestSource('class A {B ^}}');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('A');
+  }
+
+  test_field_name2() {
+    addTestSource('class A {var ^}}');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('A');
+  }
+
   test_for() {
     addTestSource('main(args) {for (int i; i < 10; ++i) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestVariable('i');
+    assertSuggestLocalVariable('i');
   }
 
   test_forEach() {
     addTestSource('main(args) {for (foo in bar) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestVariable('foo');
+    assertSuggestLocalVariable('foo');
   }
 
   test_function() {
@@ -79,6 +91,25 @@
     assertSuggestParameter('b');
   }
 
+  test_local_name() {
+    addTestSource('class A {a() {var f; A ^}}');
+    expect(computeFast(), isTrue);
+    //TODO (danrubel) should not be suggested
+    // but A ^ in this test
+    // parses differently than var ^ in test below
+    assertSuggestClass('A');
+    assertSuggestMethodName('a');
+    assertSuggestLocalVariable('f');
+  }
+
+  test_local_name2() {
+    addTestSource('class A {a() {var f; var ^}}');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('A');
+    assertNotSuggested('a');
+    assertNotSuggested('f');
+  }
+
   test_members() {
     addTestSource('class A {var f; a() {^} var g;}');
     expect(computeFast(), isTrue);
@@ -103,11 +134,22 @@
     assertSuggestParameter('y');
   }
 
+  test_topLevelVar_name() {
+    addTestSource('class A {} B ^');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('A');
+  }
+
+  test_topLevelVar_name2() {
+    addTestSource('class A {} var ^');
+    expect(computeFast(), isTrue);
+    assertNotSuggested('A');
+  }
+
   test_variableDeclaration() {
     addTestSource('main() {int a = 1, b = 2 + ^;}');
     expect(computeFast(), isTrue);
-    assertSuggestVariable('a');
+    assertSuggestLocalVariable('a');
     assertNotSuggested('b');
   }
 }
-
diff --git a/pkg/analysis_services/test/completion/test_all.dart b/pkg/analysis_server/test/services/completion/test_all.dart
similarity index 60%
rename from pkg/analysis_services/test/completion/test_all.dart
rename to pkg/analysis_server/test/services/completion/test_all.dart
index 7d618bc..1ecac44 100644
--- a/pkg/analysis_services/test/completion/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/test_all.dart
@@ -6,16 +6,22 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'completion_computer_test.dart' as completion_test;
+import 'completion_computer_test.dart' as completion_computer_test;
+import 'completion_manager_test.dart' as completion_manager_test;
 import 'imported_type_computer_test.dart' as importedType_test;
+import 'invocation_computer_test.dart' as invocation_test;
+import 'keyword_computer_test.dart' as keyword_test;
 import 'local_computer_test.dart' as local_test;
 
 /// Utility for manually running all tests.
 main() {
   groupSep = ' | ';
   group('completion', () {
-    completion_test.main();
+    completion_computer_test.main();
+    completion_manager_test.main();
     importedType_test.main();
+    keyword_test.main();
+    invocation_test.main();
     local_test.main();
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_services/test/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
similarity index 93%
rename from pkg/analysis_services/test/correction/assist_test.dart
rename to pkg/analysis_server/test/services/correction/assist_test.dart
index e32aff3..bde3c69 100644
--- a/pkg/analysis_services/test/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -4,14 +4,13 @@
 
 library test.services.correction.assist;
 
-import 'package:analysis_services/correction/assist.dart';
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
-import 'package:collection/collection.dart';
 import 'package:unittest/unittest.dart';
 
 
@@ -30,7 +29,7 @@
   int length;
 
   Assist assist;
-  Change change;
+  SourceChange change;
   String resultCode;
   LinkedEditGroup linkedPositionGroup;
 
@@ -42,9 +41,9 @@
     assist = _assertHasAssist(kind);
     change = assist.change;
     // apply to "file"
-    List<FileEdit> fileEdits = change.fileEdits;
+    List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
-    resultCode = _applyEdits(testCode, change.fileEdits[0].edits);
+    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
     // verify
     expect(resultCode, expected);
   }
@@ -58,20 +57,6 @@
     assertHasAssist(kind, expected);
   }
 
-  void assertHasPositionGroup(String id, int expectedLength,
-      List<Position> expectedPositions) {
-    List<LinkedEditGroup> linkedPositionGroups = change.linkedEditGroups;
-    for (LinkedEditGroup group in linkedPositionGroups) {
-      if (group.id == id) {
-        expect(group.length, expectedLength);
-        expect(group.positions, unorderedEquals(expectedPositions));
-        linkedPositionGroup = group;
-        return;
-      }
-    }
-    fail('No PositionGroup with id=$id found in $linkedPositionGroups');
-  }
-
   /**
    * Asserts that there is no [Assist] of the given [kind] at [offset].
    */
@@ -109,7 +94,7 @@
   List<LinkedEditSuggestion> expectedSuggestions(LinkedEditSuggestionKind kind,
       List<String> values) {
     return values.map((value) {
-      return new LinkedEditSuggestion(kind, value);
+      return new LinkedEditSuggestion(value, kind);
     }).toList();
   }
 
@@ -310,13 +295,12 @@
 }
 List<int> readBytes() => <int>[];
 ''');
-    assertHasPositionGroup('NAME', 9, expectedPositions(['readBytes = ']));
-    expect(
-        linkedPositionGroup.suggestions,
-        unorderedEquals(
-            expectedSuggestions(
-                LinkedEditSuggestionKind.VARIABLE,
-                ['list', 'bytes2', 'readBytes'])));
+    _assertLinkedGroup(
+        change.linkedEditGroups[0],
+        ['readBytes = '],
+        expectedSuggestions(
+            LinkedEditSuggestionKind.VARIABLE,
+            ['list', 'bytes2', 'readBytes']));
   }
 
   void test_assignToLocalVariable_alreadyAssignment() {
@@ -2189,16 +2173,6 @@
 ''');
   }
 
-  String _applyEdits(String code, List<Edit> edits) {
-    mergeSort(edits, compare: (a, b) => a.offset - b.offset);
-    edits.reversed.forEach((Edit edit) {
-      code = code.substring(0, edit.offset) +
-          edit.replacement +
-          code.substring(edit.end);
-    });
-    return code;
-  }
-
   /**
    * Computes assists and verifies that there is an assist of the given kind.
    */
@@ -2213,28 +2187,13 @@
     throw fail('Expected to find assist $kind in\n${assists.join('\n')}');
   }
 
-  void _assertHasLinkedPositions(String groupId, List<String> expectedStrings) {
+  void _assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
+      [List<LinkedEditSuggestion> expectedSuggestions]) {
     List<Position> expectedPositions = _findResultPositions(expectedStrings);
-    List<LinkedEditGroup> groups = change.linkedEditGroups;
-    for (LinkedEditGroup group in groups) {
-      if (group.id == groupId) {
-        List<Position> actualPositions = group.positions;
-        expect(actualPositions, unorderedEquals(expectedPositions));
-        return;
-      }
+    expect(group.positions, unorderedEquals(expectedPositions));
+    if (expectedSuggestions != null) {
+      expect(group.suggestions, unorderedEquals(expectedSuggestions));
     }
-    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
-  }
-
-  void _assertHasLinkedProposals(String groupId, List<String> expected) {
-    List<LinkedEditGroup> groups = change.linkedEditGroups;
-    for (LinkedEditGroup group in groups) {
-      if (group.id == groupId) {
-        expect(group.suggestions, expected);
-        return;
-      }
-    }
-    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
   }
 
   List<Position> _findResultPositions(List<String> searchStrings) {
diff --git a/pkg/analysis_server/test/services/correction/change_test.dart b/pkg/analysis_server/test/services/correction/change_test.dart
new file mode 100644
index 0000000..3a1ad00
--- /dev/null
+++ b/pkg/analysis_server/test/services/correction/change_test.dart
@@ -0,0 +1,337 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.correction.change;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ChangeTest);
+  runReflectiveTests(EditTest);
+  runReflectiveTests(FileEditTest);
+  runReflectiveTests(LinkedEditGroupTest);
+  runReflectiveTests(LinkedEditSuggestionTest);
+  runReflectiveTests(PositionTest);
+}
+
+
+@ReflectiveTestCase()
+class ChangeTest {
+  void test_addEdit() {
+    SourceChange change = new SourceChange('msg');
+    SourceEdit edit1 = new SourceEdit(1, 2, 'a');
+    SourceEdit edit2 = new SourceEdit(1, 2, 'b');
+    expect(change.edits, hasLength(0));
+    change.addEdit('/a.dart', edit1);
+    expect(change.edits, hasLength(1));
+    change.addEdit('/a.dart', edit2);
+    expect(change.edits, hasLength(1));
+    {
+      SourceFileEdit fileEdit = change.getFileEdit('/a.dart');
+      expect(fileEdit, isNotNull);
+      expect(fileEdit.edits, unorderedEquals([edit1, edit2]));
+    }
+  }
+
+  void test_getFileEdit() {
+    SourceChange change = new SourceChange('msg');
+    SourceFileEdit fileEdit = new SourceFileEdit('/a.dart');
+    change.addFileEdit(fileEdit);
+    expect(change.getFileEdit('/a.dart'), fileEdit);
+  }
+
+  void test_getFileEdit_empty() {
+    SourceChange change = new SourceChange('msg');
+    expect(change.getFileEdit('/some.dart'), isNull);
+  }
+
+  void test_toJson() {
+    SourceChange change = new SourceChange('msg');
+    change.addFileEdit(new SourceFileEdit('/a.dart')
+        ..add(new SourceEdit(1, 2, 'aaa'))
+        ..add(new SourceEdit(10, 20, 'bbb')));
+    change.addFileEdit(new SourceFileEdit('/b.dart')
+        ..add(new SourceEdit(21, 22, 'xxx'))
+        ..add(new SourceEdit(210, 220, 'yyy')));
+    {
+      var group = new LinkedEditGroup.empty();
+      change.addLinkedEditGroup(group
+          ..addPosition(new Position('/ga.dart', 1), 2)
+          ..addPosition(new Position('/ga.dart', 10), 2));
+      group.addSuggestion(
+          new LinkedEditSuggestion('AA', LinkedEditSuggestionKind.TYPE));
+      group.addSuggestion(
+          new LinkedEditSuggestion('BB', LinkedEditSuggestionKind.TYPE));
+    }
+    change.addLinkedEditGroup(new LinkedEditGroup.empty()
+        ..addPosition(new Position('/gb.dart', 10), 5)
+        ..addPosition(new Position('/gb.dart', 100), 5));
+    change.selection = new Position('/selection.dart', 42);
+    var expectedJson = {
+      'message': 'msg',
+      'edits': [{
+          'file': '/a.dart',
+          'edits': [{
+              'offset': 10,
+              'length': 20,
+              'replacement': 'bbb'
+            }, {
+              'offset': 1,
+              'length': 2,
+              'replacement': 'aaa'
+            }]
+        }, {
+          'file': '/b.dart',
+          'edits': [{
+              'offset': 210,
+              'length': 220,
+              'replacement': 'yyy'
+            }, {
+              'offset': 21,
+              'length': 22,
+              'replacement': 'xxx'
+            }]
+        }],
+      'linkedEditGroups': [{
+          'length': 2,
+          'positions': [{
+              'file': '/ga.dart',
+              'offset': 1
+            }, {
+              'file': '/ga.dart',
+              'offset': 10
+            }],
+          'suggestions': [{
+              'kind': 'TYPE',
+              'value': 'AA'
+            }, {
+              'kind': 'TYPE',
+              'value': 'BB'
+            }]
+        }, {
+          'length': 5,
+          'positions': [{
+              'file': '/gb.dart',
+              'offset': 10
+            }, {
+              'file': '/gb.dart',
+              'offset': 100
+            }],
+          'suggestions': []
+        }],
+      'selection': {
+        'file': '/selection.dart',
+        'offset': 42
+      }
+    };
+    expect(change.toJson(), expectedJson);
+    // some toString()
+    change.toString();
+  }
+}
+
+
+@ReflectiveTestCase()
+class EditTest {
+  void test_applySequence() {
+    SourceEdit edit1 = new SourceEdit(5, 2, 'abc');
+    SourceEdit edit2 = new SourceEdit(1, 0, '!');
+    expect(SourceEdit.applySequence('0123456789', [edit1, edit2]), '0!1234abc789');
+  }
+
+  void test_eqEq() {
+    SourceEdit a = new SourceEdit(1, 2, 'aaa');
+    SourceEdit a2 = new SourceEdit(1, 2, 'aaa');
+    SourceEdit b = new SourceEdit(1, 2, 'aaa');
+    expect(a == a, isTrue);
+    expect(a == new SourceEdit(1, 2, 'aaa'), isTrue);
+    expect(a == this, isFalse);
+    expect(a == new SourceEdit(1, 2, 'bbb'), isFalse);
+    expect(a == new SourceEdit(10, 2, 'aaa'), isFalse);
+  }
+
+  void test_new() {
+    SourceEdit edit = new SourceEdit(1, 2, 'foo', id: 'my-id');
+    expect(edit.offset, 1);
+    expect(edit.length, 2);
+    expect(edit.replacement, 'foo');
+    expect(
+        edit.toJson(),
+        {'offset': 1, 'length': 2, 'replacement': 'foo', 'id': 'my-id'});
+  }
+
+  void test_editFromRange() {
+    SourceRange range = new SourceRange(1, 2);
+    SourceEdit edit = new SourceEdit.range(range, 'foo');
+    expect(edit.offset, 1);
+    expect(edit.length, 2);
+    expect(edit.replacement, 'foo');
+  }
+  void test_toJson() {
+    SourceEdit edit = new SourceEdit(1, 2, 'foo');
+    var expectedJson = {
+      OFFSET: 1,
+      LENGTH: 2,
+      REPLACEMENT: 'foo'
+    };
+    expect(edit.toJson(), expectedJson);
+  }
+
+}
+
+
+@ReflectiveTestCase()
+class FileEditTest {
+  void test_addAll() {
+    SourceEdit edit1a = new SourceEdit(1, 0, 'a1');
+    SourceEdit edit1b = new SourceEdit(1, 0, 'a2');
+    SourceEdit edit10 = new SourceEdit(10, 1, 'b');
+    SourceEdit edit100 = new SourceEdit(100, 2, 'c');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    fileEdit.addAll([edit100, edit1a, edit10, edit1b]);
+    expect(fileEdit.edits, [edit100, edit10, edit1b, edit1a]);
+  }
+
+  void test_add_sorts() {
+    SourceEdit edit1a = new SourceEdit(1, 0, 'a1');
+    SourceEdit edit1b = new SourceEdit(1, 0, 'a2');
+    SourceEdit edit10 = new SourceEdit(10, 1, 'b');
+    SourceEdit edit100 = new SourceEdit(100, 2, 'c');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    fileEdit.add(edit100);
+    fileEdit.add(edit1a);
+    fileEdit.add(edit1b);
+    fileEdit.add(edit10);
+    expect(fileEdit.edits, [edit100, edit10, edit1b, edit1a]);
+  }
+
+  void test_new() {
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    fileEdit.add(new SourceEdit(1, 2, 'aaa'));
+    fileEdit.add(new SourceEdit(10, 20, 'bbb'));
+    expect(
+        fileEdit.toString(),
+        '{"file":"/test.dart","edits":['
+            '{"offset":10,"length":20,"replacement":"bbb"},'
+            '{"offset":1,"length":2,"replacement":"aaa"}]}');
+  }
+
+  void test_toJson() {
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    fileEdit.add(new SourceEdit(1, 2, 'aaa'));
+    fileEdit.add(new SourceEdit(10, 20, 'bbb'));
+    var expectedJson = {
+      FILE: '/test.dart',
+      EDITS: [{
+          OFFSET: 10,
+          LENGTH: 20,
+          REPLACEMENT: 'bbb'
+        }, {
+          OFFSET: 1,
+          LENGTH: 2,
+          REPLACEMENT: 'aaa'
+        },]
+    };
+    expect(fileEdit.toJson(), expectedJson);
+  }
+}
+
+
+@ReflectiveTestCase()
+class LinkedEditGroupTest {
+  void test_new() {
+    LinkedEditGroup group = new LinkedEditGroup.empty();
+    group.addPosition(new Position('/a.dart', 1), 2);
+    group.addPosition(new Position('/b.dart', 10), 2);
+    expect(
+        group.toString(),
+        '{"positions":['
+            '{"file":"/a.dart","offset":1},'
+            '{"file":"/b.dart","offset":10}],"length":2,"suggestions":[]}');
+  }
+
+  void test_toJson() {
+    LinkedEditGroup group = new LinkedEditGroup.empty();
+    group.addPosition(new Position('/a.dart', 1), 2);
+    group.addPosition(new Position('/b.dart', 10), 2);
+    group.addSuggestion(
+        new LinkedEditSuggestion('AA', LinkedEditSuggestionKind.TYPE));
+    group.addSuggestion(
+        new LinkedEditSuggestion('BB', LinkedEditSuggestionKind.TYPE));
+    expect(group.toJson(), {
+      'length': 2,
+      'positions': [{
+          'file': '/a.dart',
+          'offset': 1
+        }, {
+          'file': '/b.dart',
+          'offset': 10
+        }],
+      'suggestions': [{
+          'kind': 'TYPE',
+          'value': 'AA'
+        }, {
+          'kind': 'TYPE',
+          'value': 'BB'
+        }]
+    });
+  }
+}
+
+
+@ReflectiveTestCase()
+class LinkedEditSuggestionTest {
+  void test_eqEq() {
+    var a = new LinkedEditSuggestion('a', LinkedEditSuggestionKind.METHOD);
+    var a2 = new LinkedEditSuggestion('a', LinkedEditSuggestionKind.METHOD);
+    var b = new LinkedEditSuggestion('a', LinkedEditSuggestionKind.TYPE);
+    var c = new LinkedEditSuggestion('c', LinkedEditSuggestionKind.METHOD);
+    expect(a == a, isTrue);
+    expect(a == a2, isTrue);
+    expect(a == this, isFalse);
+    expect(a == b, isFalse);
+    expect(a == c, isFalse);
+  }
+}
+
+
+@ReflectiveTestCase()
+class PositionTest {
+  void test_eqEq() {
+    Position a = new Position('/a.dart', 1);
+    Position a2 = new Position('/a.dart', 1);
+    Position b = new Position('/b.dart', 1);
+    expect(a == a, isTrue);
+    expect(a == a2, isTrue);
+    expect(a == b, isFalse);
+    expect(a == this, isFalse);
+  }
+
+  void test_hashCode() {
+    Position position = new Position('/test.dart', 1);
+    position.hashCode;
+  }
+
+  void test_new() {
+    Position position = new Position('/test.dart', 1);
+    expect(position.file, '/test.dart');
+    expect(position.offset, 1);
+    expect(position.toString(), '{"file":"/test.dart","offset":1}');
+  }
+
+  void test_toJson() {
+    Position position = new Position('/test.dart', 1);
+    var expectedJson = {
+      FILE: '/test.dart',
+      OFFSET: 1
+    };
+    expect(position.toJson(), expectedJson);
+  }
+}
diff --git a/pkg/analysis_services/test/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
similarity index 91%
rename from pkg/analysis_services/test/correction/fix_test.dart
rename to pkg/analysis_server/test/services/correction/fix_test.dart
index 3d672fc..4c1962f 100644
--- a/pkg/analysis_services/test/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -4,11 +4,11 @@
 
 library test.services.correction.fix;
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/fix.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/protocol.dart' hide AnalysisError;
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_context.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
@@ -31,7 +31,7 @@
   SearchEngineImpl searchEngine;
 
   Fix fix;
-  Change change;
+  SourceChange change;
   String resultCode;
 
   void assertHasFix(FixKind kind, String expected) {
@@ -39,24 +39,13 @@
     fix = _assertHasFix(kind, error);
     change = fix.change;
     // apply to "file"
-    List<FileEdit> fileEdits = change.fileEdits;
+    List<SourceFileEdit> fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
-    resultCode = _applyEdits(testCode, change.fileEdits[0].edits);
+    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
     // verify
     expect(resultCode, expected);
   }
 
-  void assertHasPositionGroup(String id, List<Position> expectedPositions) {
-    List<LinkedEditGroup> linkedPositionGroups = change.linkedEditGroups;
-    for (LinkedEditGroup group in linkedPositionGroups) {
-      if (group.id == id) {
-        expect(group.positions, unorderedEquals(expectedPositions));
-        return;
-      }
-    }
-    fail('No PositionGroup with id=$id found in $linkedPositionGroups');
-  }
-
   void assertNoFix(FixKind kind) {
     AnalysisError error = _findErrorToFix();
     List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
@@ -99,6 +88,13 @@
     return positions;
   }
 
+  List<LinkedEditSuggestion> expectedSuggestions(LinkedEditSuggestionKind kind,
+      List<String> values) {
+    return values.map((value) {
+      return new LinkedEditSuggestion(value, kind);
+    }).toList();
+  }
+
   void setUp() {
     super.setUp();
     index = createLocalMemoryIndex();
@@ -186,7 +182,7 @@
 class Test {
 }
 ''');
-    assertHasPositionGroup('NAME', expectedPositions(['Test v =', 'Test {']));
+    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
   }
 
   void test_createConstructorSuperExplicit() {
@@ -1593,39 +1589,34 @@
 }
 ''');
     // linked positions
-    _assertHasLinkedPositions(
-        'NAME',
+    int index = 0;
+    _assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['void myUndefinedMethod(']);
+    _assertLinkedGroup(
+        change.linkedEditGroups[index++],
         ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
-    _assertHasLinkedPositions('RETURN_TYPE', ['void myUndefinedMethod(']);
-    _assertHasLinkedPositions('TYPE0', ['int i']);
-    _assertHasLinkedPositions('TYPE1', ['double d']);
-    _assertHasLinkedPositions('TYPE2', ['String s']);
-    _assertHasLinkedPositions('ARG0', ['i,']);
-    _assertHasLinkedPositions('ARG1', ['d,']);
-    _assertHasLinkedPositions('ARG2', ['s)']);
-    // linked proposals
-    _assertHasLinkedSuggestions(
-        'TYPE0',
+    _assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['int i'],
         expectedSuggestions(
             LinkedEditSuggestionKind.TYPE,
             ['int', 'num', 'Object', 'Comparable']));
-    _assertHasLinkedSuggestions(
-        'TYPE1',
+    _assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
+    _assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['double d'],
         expectedSuggestions(
             LinkedEditSuggestionKind.TYPE,
             ['double', 'num', 'Object', 'Comparable']));
-    _assertHasLinkedSuggestions(
-        'TYPE2',
+    _assertLinkedGroup(change.linkedEditGroups[index++], ['d,']);
+    _assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['String s'],
         expectedSuggestions(
             LinkedEditSuggestionKind.TYPE,
             ['String', 'Object', 'Comparable']));
-  }
-
-  List<LinkedEditSuggestion> expectedSuggestions(LinkedEditSuggestionKind kind,
-      List<String> values) {
-    return values.map((value) {
-      return new LinkedEditSuggestion(kind, value);
-    }).toList();
+    _assertLinkedGroup(change.linkedEditGroups[index++], ['s)']);
   }
 
   void test_undefinedMethod_createUnqualified_returnType() {
@@ -1647,10 +1638,10 @@
 }
 ''');
     // linked positions
-    _assertHasLinkedPositions(
-        'NAME',
+    _assertLinkedGroup(change.linkedEditGroups[0], ['int myUndefinedMethod(']);
+    _assertLinkedGroup(
+        change.linkedEditGroups[1],
         ['myUndefinedMethod();', 'myUndefinedMethod() {']);
-    _assertHasLinkedPositions('RETURN_TYPE', ['int myUndefinedMethod(']);
   }
 
   void test_undefinedMethod_createUnqualified_staticFromField() {
@@ -1799,16 +1790,6 @@
 ''');
   }
 
-  String _applyEdits(String code, List<Edit> edits) {
-    edits.sort((a, b) => b.offset - a.offset);
-    edits.forEach((Edit edit) {
-      code = code.substring(0, edit.offset) +
-          edit.replacement +
-          code.substring(edit.end);
-    });
-    return code;
-  }
-
   /**
    * Computes fixes and verifies that there is a fix of the given kind.
    */
@@ -1822,29 +1803,13 @@
     throw fail('Expected to find fix $kind in\n${fixes.join('\n')}');
   }
 
-  void _assertHasLinkedPositions(String groupId, List<String> expectedStrings) {
+  void _assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
+      [List<LinkedEditSuggestion> expectedSuggestions]) {
     List<Position> expectedPositions = _findResultPositions(expectedStrings);
-    List<LinkedEditGroup> groups = change.linkedEditGroups;
-    for (LinkedEditGroup group in groups) {
-      if (group.id == groupId) {
-        List<Position> actualPositions = group.positions;
-        expect(actualPositions, unorderedEquals(expectedPositions));
-        return;
-      }
+    expect(group.positions, unorderedEquals(expectedPositions));
+    if (expectedSuggestions != null) {
+      expect(group.suggestions, unorderedEquals(expectedSuggestions));
     }
-    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
-  }
-
-  void _assertHasLinkedSuggestions(String groupId,
-      List<LinkedEditSuggestion> expected) {
-    List<LinkedEditGroup> groups = change.linkedEditGroups;
-    for (LinkedEditGroup group in groups) {
-      if (group.id == groupId) {
-        expect(group.suggestions, expected);
-        return;
-      }
-    }
-    fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
   }
 
   /**
diff --git a/pkg/analysis_services/test/correction/levenshtein_test.dart b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
similarity index 95%
rename from pkg/analysis_services/test/correction/levenshtein_test.dart
rename to pkg/analysis_server/test/services/correction/levenshtein_test.dart
index 4e40bd7..ea3830c 100644
--- a/pkg/analysis_services/test/correction/levenshtein_test.dart
+++ b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.correction.levenshtein;
 
-import 'package:analysis_services/src/correction/levenshtein.dart';
+import 'package:analysis_server/src/services/correction/levenshtein.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analysis_services/test/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
similarity index 98%
rename from pkg/analysis_services/test/correction/name_suggestion_test.dart
rename to pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index 5606937..0f5b831 100644
--- a/pkg/analysis_services/test/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.correction.name_suggestion;
 
-import 'package:analysis_services/src/correction/name_suggestion.dart';
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
diff --git a/pkg/analysis_services/test/correction/source_range_test.dart b/pkg/analysis_server/test/services/correction/source_range_test.dart
similarity index 97%
rename from pkg/analysis_services/test/correction/source_range_test.dart
rename to pkg/analysis_server/test/services/correction/source_range_test.dart
index 53e76d9..c700a0d 100644
--- a/pkg/analysis_services/test/correction/source_range_test.dart
+++ b/pkg/analysis_server/test/services/correction/source_range_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.correction.source_range;
 
-import 'package:analysis_services/src/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
new file mode 100644
index 0000000..88f1da3
--- /dev/null
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -0,0 +1,228 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.correction.status;
+
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_testing/abstract_single_unit.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(RefactoringLocationTest);
+  runReflectiveTests(RefactoringStatusTest);
+}
+
+
+@ReflectiveTestCase()
+class RefactoringLocationTest extends AbstractSingleUnitTest {
+  void test_createLocation_forElement() {
+    resolveTestUnit('class MyClass {}');
+    Element element = findElement('MyClass');
+    // check
+    Location location = new Location.fromElement(element);
+    expect(location.file, '/test.dart');
+    expect(location.offset, 6);
+    expect(location.length, 7);
+    expect(location.startLine, 1);
+    expect(location.startColumn, 7);
+  }
+
+  void test_createLocation_forMatch() {
+    resolveTestUnit('class MyClass {}');
+    Element element = findElement('MyClass');
+    SourceRange range = rangeElementName(element);
+    SearchMatch match = new SearchMatch(null, element, range, true, false);
+    // check
+    Location location = new Location.fromMatch(match);
+    expect(location.file, '/test.dart');
+    expect(location.offset, range.offset);
+    expect(location.length, range.length);
+  }
+
+  void test_createLocation_forNode() {
+    resolveTestUnit('''
+main() {
+}
+''');
+    AstNode node = findNodeAtString('main');
+    // check
+    Location location = new Location.fromNode(node);
+    expect(location.file, '/test.dart');
+    expect(location.offset, node.offset);
+    expect(location.length, node.length);
+  }
+
+  void test_createLocation_forUnit() {
+    resolveTestUnit('');
+    SourceRange range = rangeStartLength(10, 20);
+    // check
+    Location location = new Location.fromUnit(testUnit, range);
+    expect(location.file, '/test.dart');
+    expect(location.offset, range.offset);
+    expect(location.length, range.length);
+  }
+}
+
+
+@ReflectiveTestCase()
+class RefactoringStatusTest {
+  void test_addError() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    // initial state
+    expect(refactoringStatus.severity, null);
+    // add ERROR
+    refactoringStatus.addError('msg');
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
+    expect(refactoringStatus.isOK, isFalse);
+    expect(refactoringStatus.hasFatalError, isFalse);
+    expect(refactoringStatus.hasError, isTrue);
+    // problems
+    List<RefactoringProblem> problems = refactoringStatus.problems;
+    expect(problems, hasLength(1));
+    expect(problems[0].message, 'msg');
+  }
+
+  void test_addFatalError_withLocation() {
+    Location location = new Location('/test.dart', 1, 2, 3, 4);
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    // initial state
+    expect(refactoringStatus.severity, null);
+    // add FATAL
+    refactoringStatus.addFatalError('msg', location);
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL);
+    expect(refactoringStatus.isOK, isFalse);
+    expect(refactoringStatus.hasFatalError, isTrue);
+    expect(refactoringStatus.hasError, isTrue);
+    // problems
+    List<RefactoringProblem> problems = refactoringStatus.problems;
+    expect(problems, hasLength(1));
+    expect(problems[0].message, 'msg');
+    expect(problems[0].location.file, '/test.dart');
+    expect(problems[0].location.offset, 1);
+    expect(problems[0].location.length, 2);
+    // add WARNING, resulting severity is still FATAL
+    refactoringStatus.addWarning("warning");
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL);
+  }
+
+  void test_addFatalError_withoutContext() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    // initial state
+    expect(refactoringStatus.severity, null);
+    // add FATAL
+    refactoringStatus.addFatalError('msg');
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL);
+    expect(refactoringStatus.isOK, isFalse);
+    expect(refactoringStatus.hasFatalError, isTrue);
+    expect(refactoringStatus.hasError, isTrue);
+    // problems
+    List<RefactoringProblem> problems = refactoringStatus.problems;
+    expect(problems, hasLength(1));
+    expect(problems[0].message, 'msg');
+    expect(problems[0].location, isNull);
+  }
+
+  void test_addStatus_Error_withWarning() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    refactoringStatus.addError("err");
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
+    // merge with OK
+    {
+      RefactoringStatus other = new RefactoringStatus();
+      other.addWarning("warn");
+      refactoringStatus.addStatus(other);
+    }
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
+    expect(refactoringStatus.message, 'err');
+  }
+
+  void test_addStatus_Warning_null() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    refactoringStatus.addWarning("warn");
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
+    // merge with "null"
+    refactoringStatus.addStatus(null);
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
+  }
+
+  void test_addStatus_Warning_withError() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    refactoringStatus.addWarning("warn");
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
+    // merge with OK
+    {
+      RefactoringStatus other = new RefactoringStatus();
+      other.addError("err");
+      refactoringStatus.addStatus(other);
+    }
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
+    expect(refactoringStatus.message, 'err');
+  }
+
+  void test_addWarning() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    // initial state
+    expect(refactoringStatus.severity, null);
+    // add WARNING
+    refactoringStatus.addWarning('msg');
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
+    expect(refactoringStatus.isOK, isFalse);
+    expect(refactoringStatus.hasFatalError, isFalse);
+    expect(refactoringStatus.hasError, isFalse);
+    expect(refactoringStatus.hasWarning, isTrue);
+    // problems
+    List<RefactoringProblem> problems = refactoringStatus.problems;
+    expect(problems, hasLength(1));
+    expect(problems[0].message, 'msg');
+  }
+
+  void test_get_problem() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus();
+    // no entries
+    expect(refactoringStatus.problem, isNull);
+    expect(refactoringStatus.message, isNull);
+    // add entries
+    refactoringStatus.addError('msgError');
+    refactoringStatus.addWarning('msgWarning');
+    refactoringStatus.addFatalError('msgFatalError');
+    // get entry
+    {
+      RefactoringProblem problem = refactoringStatus.problem;
+      expect(problem.severity, RefactoringProblemSeverity.FATAL);
+      expect(problem.message, 'msgFatalError');
+    }
+    // get message
+    expect(refactoringStatus.problem.message, 'msgFatalError');
+  }
+
+  void test_newError() {
+    Location location = new Location('/test.dart', 1, 2, 3, 4);
+    RefactoringStatus refactoringStatus =
+        new RefactoringStatus.error('msg', location);
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.ERROR);
+    expect(refactoringStatus.problem.message, 'msg');
+    expect(refactoringStatus.problem.location.file, '/test.dart');
+  }
+
+  void test_newFatalError() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus.fatal('msg');
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.FATAL);
+    expect(refactoringStatus.message, 'msg');
+  }
+
+  void test_newWarning() {
+    RefactoringStatus refactoringStatus = new RefactoringStatus.warning('msg');
+    expect(refactoringStatus.severity, RefactoringProblemSeverity.WARNING);
+    expect(refactoringStatus.message, 'msg');
+  }
+}
diff --git a/pkg/analysis_services/test/correction/strings_test.dart b/pkg/analysis_server/test/services/correction/strings_test.dart
similarity index 97%
rename from pkg/analysis_services/test/correction/strings_test.dart
rename to pkg/analysis_server/test/services/correction/strings_test.dart
index 2dca487..a135ac0 100644
--- a/pkg/analysis_services/test/correction/strings_test.dart
+++ b/pkg/analysis_server/test/services/correction/strings_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.correction.strings;
 
-import 'package:analysis_services/src/correction/strings.dart';
+import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart' hide isEmpty;
 
@@ -19,7 +19,6 @@
 @ReflectiveTestCase()
 class StringsTest {
   void test_capitalize() {
-    expect(capitalize(null), null);
     expect(capitalize(''), '');
     expect(capitalize('a'), 'A');
     expect(capitalize('abc'), 'Abc');
diff --git a/pkg/analysis_services/test/correction/test_all.dart b/pkg/analysis_server/test/services/correction/test_all.dart
similarity index 100%
rename from pkg/analysis_services/test/correction/test_all.dart
rename to pkg/analysis_server/test/services/correction/test_all.dart
diff --git a/pkg/analysis_services/test/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
similarity index 99%
rename from pkg/analysis_services/test/index/dart_index_contributor_test.dart
rename to pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index c02d898..bdc0ccf 100644
--- a/pkg/analysis_services/test/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -4,9 +4,9 @@
 
 library test.services.src.index.dart_index_contributor;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/index_store.dart';
-import 'package:analysis_services/src/index/index_contributor.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/index_store.dart';
+import 'package:analysis_server/src/services/index/index_contributor.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
diff --git a/pkg/analysis_services/test/index/local_file_index_test.dart b/pkg/analysis_server/test/services/index/local_file_index_test.dart
similarity index 77%
rename from pkg/analysis_services/test/index/local_file_index_test.dart
rename to pkg/analysis_server/test/services/index/local_file_index_test.dart
index cc0dbf4..e9f3abd 100644
--- a/pkg/analysis_services/test/index/local_file_index_test.dart
+++ b/pkg/analysis_server/test/services/index/local_file_index_test.dart
@@ -4,8 +4,8 @@
 
 library test.services.src.index.local_file_index;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_file_index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_file_index.dart';
 import 'package:unittest/unittest.dart';
 
 
diff --git a/pkg/analysis_services/test/index/local_index_test.dart b/pkg/analysis_server/test/services/index/local_index_test.dart
similarity index 94%
rename from pkg/analysis_services/test/index/local_index_test.dart
rename to pkg/analysis_server/test/services/index/local_index_test.dart
index 30076e9..24e108f 100644
--- a/pkg/analysis_services/test/index/local_index_test.dart
+++ b/pkg/analysis_server/test/services/index/local_index_test.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/src/index/local_index.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/index/local_index.dart';
 import 'package:analysis_testing/abstract_context.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
diff --git a/pkg/analysis_services/test/index/store/codec_test.dart b/pkg/analysis_server/test/services/index/store/codec_test.dart
similarity index 97%
rename from pkg/analysis_services/test/index/store/codec_test.dart
rename to pkg/analysis_server/test/services/index/store/codec_test.dart
index e0b6a03..80a8ca5 100644
--- a/pkg/analysis_services/test/index/store/codec_test.dart
+++ b/pkg/analysis_server/test/services/index/store/codec_test.dart
@@ -4,8 +4,8 @@
 
 library test.services.src.index.store.codec;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/mocks.dart';
 import 'package:analysis_testing/reflective_tests.dart';
diff --git a/pkg/analysis_services/test/index/store/collection_test.dart b/pkg/analysis_server/test/services/index/store/collection_test.dart
similarity index 95%
rename from pkg/analysis_services/test/index/store/collection_test.dart
rename to pkg/analysis_server/test/services/index/store/collection_test.dart
index 0872624..5b4ce82 100644
--- a/pkg/analysis_services/test/index/store/collection_test.dart
+++ b/pkg/analysis_server/test/services/index/store/collection_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.src.index.store.collection;
 
-import 'package:analysis_services/src/index/store/collection.dart';
+import 'package:analysis_server/src/services/index/store/collection.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analysis_services/test/index/store/mocks.dart b/pkg/analysis_server/test/services/index/store/mocks.dart
similarity index 89%
rename from pkg/analysis_services/test/index/store/mocks.dart
rename to pkg/analysis_server/test/services/index/store/mocks.dart
index 8505114..4aec3c6 100644
--- a/pkg/analysis_services/test/index/store/mocks.dart
+++ b/pkg/analysis_server/test/services/index/store/mocks.dart
@@ -4,8 +4,8 @@
 
 library test.services.index.store.mocks;
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:typed_mock/typed_mock.dart';
 
diff --git a/pkg/analysis_services/test/index/store/single_source_container.dart b/pkg/analysis_server/test/services/index/store/single_source_container.dart
similarity index 100%
rename from pkg/analysis_services/test/index/store/single_source_container.dart
rename to pkg/analysis_server/test/services/index/store/single_source_container.dart
diff --git a/pkg/analysis_services/test/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart
similarity index 98%
rename from pkg/analysis_services/test/index/store/split_store_test.dart
rename to pkg/analysis_server/test/services/index/store/split_store_test.dart
index d4fd5a94..f44bacb 100644
--- a/pkg/analysis_services/test/index/store/split_store_test.dart
+++ b/pkg/analysis_server/test/services/index/store/split_store_test.dart
@@ -6,10 +6,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/store/codec.dart';
-import 'package:analysis_services/src/index/store/memory_node_manager.dart';
-import 'package:analysis_services/src/index/store/split_store.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/store/codec.dart';
+import 'package:analysis_server/src/services/index/store/memory_node_manager.dart';
+import 'package:analysis_server/src/services/index/store/split_store.dart';
 import 'package:analysis_testing/mocks.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
diff --git a/pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart b/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
similarity index 95%
rename from pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart
rename to pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
index 99aae9b..ea91e33 100644
--- a/pkg/analysis_services/test/index/store/temporary_folder_file_manager_test.dart
+++ b/pkg/analysis_server/test/services/index/store/temporary_folder_file_manager_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:io';
 
-import 'package:analysis_services/src/index/store/temporary_folder_file_manager.dart';
+import 'package:analysis_server/src/services/index/store/temporary_folder_file_manager.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
diff --git a/pkg/analysis_services/test/index/store/test_all.dart b/pkg/analysis_server/test/services/index/store/test_all.dart
similarity index 100%
rename from pkg/analysis_services/test/index/store/test_all.dart
rename to pkg/analysis_server/test/services/index/store/test_all.dart
diff --git a/pkg/analysis_services/test/index/test_all.dart b/pkg/analysis_server/test/services/index/test_all.dart
similarity index 100%
rename from pkg/analysis_services/test/index/test_all.dart
rename to pkg/analysis_server/test/services/index/test_all.dart
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
new file mode 100644
index 0000000..2114144
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
+import 'package:analysis_testing/abstract_single_unit.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+
+int findIdentifierLength(String search) {
+  int length = 0;
+  while (length < search.length) {
+    int c = search.codeUnitAt(length);
+    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
+        c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
+        c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
+      break;
+    }
+    length++;
+  }
+  return length;
+}
+
+
+/**
+ * The base class for all [Refactoring] tests.
+ */
+abstract class RefactoringTest extends AbstractSingleUnitTest {
+  Index index;
+  SearchEngineImpl searchEngine;
+
+  SourceChange refactoringChange;
+
+  Refactoring get refactoring;
+
+  /**
+   * Asserts that [refactoring] initial/final conditions status is OK.
+   */
+  Future assertRefactoringConditionsOK() {
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatusOK(status);
+      return refactoring.checkFinalConditions().then((status) {
+        assertRefactoringStatusOK(status);
+      });
+    });
+  }
+
+  /**
+   * Asserts that [refactoring] final conditions status is OK.
+   */
+  Future assertRefactoringFinalConditionsOK() {
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  /**
+   * Asserts that [status] has expected severity and message.
+   */
+  void assertRefactoringStatus(RefactoringStatus status,
+      RefactoringProblemSeverity expectedSeverity, {String expectedMessage,
+      SourceRange expectedContextRange, String expectedContextSearch}) {
+    expect(status.severity, expectedSeverity, reason: status.toString());
+    if (expectedSeverity != null) {
+      RefactoringProblem problem = status.problem;
+      expect(problem.severity, expectedSeverity);
+      if (expectedMessage != null) {
+        expect(problem.message, expectedMessage);
+      }
+      if (expectedContextRange != null) {
+        expect(problem.location.offset, expectedContextRange.offset);
+        expect(problem.location.length, expectedContextRange.length);
+      }
+      if (expectedContextSearch != null) {
+        int expectedOffset = findOffset(expectedContextSearch);
+        int expectedLength = findIdentifierLength(expectedContextSearch);
+        expect(problem.location.offset, expectedOffset);
+        expect(problem.location.length, expectedLength);
+      }
+    }
+  }
+
+  /**
+   * Asserts that [refactoring] status is OK.
+   */
+  void assertRefactoringStatusOK(RefactoringStatus status) {
+    assertRefactoringStatus(status, null);
+  }
+
+  /**
+   * Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
+   * it results the [expectedCode].
+   */
+  void assertTestChangeResult(String expectedCode) {
+    // prepare FileEdit
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(testFile);
+    expect(fileEdit, isNotNull);
+    // validate resulting code
+    String actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+    expect(actualCode, expectedCode);
+  }
+
+  void indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(context, testUnit);
+  }
+
+  void indexUnit(String file, String code) {
+    Source source = addSource(file, code);
+    CompilationUnit unit = resolveLibraryUnit(source);
+    index.indexUnit(context, unit);
+  }
+
+  void setUp() {
+    super.setUp();
+    index = createLocalMemoryIndex();
+    searchEngine = new SearchEngineImpl(index);
+  }
+}
diff --git a/pkg/analysis_services/test/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
similarity index 63%
rename from pkg/analysis_services/test/refactoring/abstract_rename.dart
rename to pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 4c8e402..e3e2cbb 100644
--- a/pkg/analysis_services/test/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/namespace.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:collection/collection.dart';
 import 'package:unittest/unittest.dart';
 
 import 'abstract_refactoring.dart';
@@ -30,23 +30,52 @@
    */
   void assertFileChangeResult(String path, String expectedCode) {
     // prepare FileEdit
-    FileEdit fileEdit = refactoringChange.getFileEdit(path);
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
     expect(fileEdit, isNotNull);
     // validate resulting code
     File file = provider.getResource(path);
     Source source = file.createSource();
     String ini = context.getContents(source).data;
-    String actualCode = _applyEdits(ini, fileEdit.edits);
+    String actualCode = SourceEdit.applySequence(ini, fileEdit.edits);
     expect(actualCode, expectedCode);
   }
 
   /**
+   * Asserts that [refactoringChange] does not contain a [FileEdit] for the file
+   * with the given [path].
+   */
+  void assertNoFileChange(String path) {
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
+    expect(fileEdit, isNull);
+  }
+
+  /**
+   * Asserts that [refactoring] has potential edits in [testFile] at offset
+   * of the given [searches].
+   */
+  void assertPotentialEdits(List<String> searches) {
+    Set<int> expectedOffsets = new Set<int>();
+    for (String search in searches) {
+      int offset = findOffset(search);
+      expectedOffsets.add(offset);
+    }
+    // remove offset marked as potential
+    for (String potentialId in refactoring.potentialEditIds) {
+      SourceEdit edit = findEditById(potentialId);
+      expect(edit, isNotNull);
+      expectedOffsets.remove(edit.offset);
+    }
+    // all potential offsets are marked as such
+    expect(expectedOffsets, isEmpty);
+  }
+
+  /**
    * Checks that all conditions are OK and the result of applying the [Change]
    * to [testUnit] is [expectedCode].
    */
   Future assertSuccessfulRename(String expectedCode) {
     return assertRefactoringConditionsOK().then((_) {
-      return refactoring.createChange().then((Change refactoringChange) {
+      return refactoring.createChange().then((SourceChange refactoringChange) {
         this.refactoringChange = refactoringChange;
         assertTestChangeResult(expectedCode);
       });
@@ -54,29 +83,15 @@
   }
 
   /**
-   * Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
-   * it results the [expectedCode].
-   */
-  void assertTestChangeResult(String expectedCode) {
-    // prepare FileEdit
-    FileEdit fileEdit = refactoringChange.getFileEdit(testFile);
-    expect(fileEdit, isNotNull);
-    // validate resulting code
-    String actualCode = _applyEdits(testCode, fileEdit.edits);
-    expect(actualCode, expectedCode);
-  }
-
-  /**
    * Creates a new [RenameRefactoring] in [refactoring] for the [Element] of
    * the [SimpleIdentifier] at the given [search] pattern.
    */
   void createRenameRefactoringAtString(String search) {
     SimpleIdentifier identifier = findIdentifier(search);
     Element element = identifier.bestElement;
-    // TODO(scheglov) uncomment later
-//    if (element instanceof PrefixElement) {
-//      element = IndexContributor.getImportElement(identifier);
-//    }
+    if (element is PrefixElement) {
+      element = getImportElement(identifier);
+    }
     createRenameRefactoringForElement(element);
   }
 
@@ -89,6 +104,20 @@
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
 
+  /**
+   * Returns the [Edit] with the given [id], maybe `null`.
+   */
+  SourceEdit findEditById(String id) {
+    for (SourceFileEdit fileEdit in refactoringChange.edits) {
+      for (SourceEdit edit in fileEdit.edits) {
+        if (edit.id == id) {
+          return edit;
+        }
+      }
+    }
+    return null;
+  }
+
 //  /**
 //   * Asserts result of applying [change] to [testCode].
 //   */
@@ -109,15 +138,4 @@
 ////    AnalysisContext context = getAnalysisContext();
 ////    assertChangeResult(context, compositeChange, source, expected);
 //  }
-
-  String _applyEdits(String code, List<Edit> edits) {
-    // TODO(scheglov) extract and reuse in assists and fixes tests
-    mergeSort(edits, compare: (a, b) => a.offset - b.offset);
-    edits.reversed.forEach((Edit edit) {
-      code = code.substring(0, edit.offset) +
-          edit.replacement +
-          code.substring(edit.end);
-    });
-    return code;
-  }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
new file mode 100644
index 0000000..a36a538
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -0,0 +1,905 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.extract_local;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/refactoring/extract_local.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_refactoring.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ExtractLocalTest);
+}
+
+
+@ReflectiveTestCase()
+class ExtractLocalTest extends RefactoringTest {
+  ExtractLocalRefactoringImpl refactoring;
+
+  test_checkFinalConditions_sameVariable_after() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+  var res;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // conflicting name
+    return refactoring.checkAllConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.WARNING,
+          expectedMessage:
+              "A variable with name 'res' is already defined in the visible scope.");
+    });
+  }
+
+  test_checkFinalConditions_sameVariable_before() {
+    indexTestUnit('''
+main() {
+  var res;
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // conflicting name
+    return refactoring.checkAllConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.WARNING,
+          expectedMessage:
+              "A variable with name 'res' is already defined in the visible scope.");
+    });
+  }
+
+  test_checkInitialConditions_assignmentLeftHandSize() {
+    indexTestUnit('''
+main() {
+  var v = 0;
+  v = 1;
+}
+''');
+    _createRefactoringWithSuffix('v', ' = 1;');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Cannot extract the left-hand side of an assignment.');
+    });
+  }
+
+  test_checkInitialConditions_methodName_reference() {
+    indexTestUnit('''
+main() {
+  main();
+}
+''');
+    _createRefactoringWithSuffix('main', '();');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Cannot extract a single method name.');
+    });
+  }
+
+  test_checkInitialConditions_nameOfProperty_prefixedIdentifier() {
+    indexTestUnit('''
+main(p) {
+  p.value; // marker
+}
+''');
+    _createRefactoringWithSuffix('value', '; // marker');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Cannot extract name part of a property access.');
+    });
+  }
+
+  test_checkInitialConditions_nameOfProperty_propertyAccess() {
+    indexTestUnit('''
+main() {
+  foo().length; // marker
+}
+String foo() => '';
+''');
+    _createRefactoringWithSuffix('length', '; // marker');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Cannot extract name part of a property access.');
+    });
+  }
+
+  test_checkInitialConditions_namePartOfDeclaration_variable() {
+    indexTestUnit('''
+main() {
+  int vvv = 0;
+}
+''');
+    _createRefactoringWithSuffix('vvv', ' = 0;');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Cannot extract the name part of a declaration.');
+    });
+  }
+
+  test_checkInitialConditions_notPartOfFunction() {
+    indexTestUnit('''
+int a = 1 + 2;
+''');
+    _createRefactoringForString('1 + 2');
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage:
+              'Expression inside of function must be selected to activate this refactoring.');
+    });
+  }
+
+  test_checkInitialConditions_stringSelection_leadingQuote() {
+    indexTestUnit('''
+main() {
+  var vvv = 'abc';
+}
+''');
+    _createRefactoringForString("'a");
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage:
+              'Cannot extract only leading or trailing quote of string literal.');
+    });
+  }
+
+  test_checkInitialConditions_stringSelection_trailingQuote() {
+    indexTestUnit('''
+main() {
+  var vvv = 'abc';
+}
+''');
+    _createRefactoringForString("c'");
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage:
+              'Cannot extract only leading or trailing quote of string literal.');
+    });
+  }
+
+  test_checkLocalName() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.refactoringName, 'Extract Local Variable');
+    // null
+    refactoring.name = null;
+    assertRefactoringStatus(
+        refactoring.checkName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Variable name must not be null.");
+    // empty
+    refactoring.name = '';
+    assertRefactoringStatus(
+        refactoring.checkName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Variable name must not be empty.");
+    // OK
+    refactoring.name = 'res';
+    assertRefactoringStatusOK(refactoring.checkName());
+  }
+
+  test_completeStatementExpression() {
+    indexTestUnit('''
+main(p) {
+  p.toString();
+}
+''');
+    _createRefactoringForString('p.toString()');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main(p) {
+  var res = p.toString();
+}
+''');
+  }
+
+  test_const_argument_inConstInstanceCreation() {
+    indexTestUnit('''
+class A {
+  const A(int a, int b);
+}
+main() {
+  const A(1, 2);
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  const A(int a, int b);
+}
+main() {
+  const res = 1;
+  const A(res, 2);
+}
+''');
+  }
+
+  test_const_inList() {
+    indexTestUnit('''
+main() {
+  const [1, 2];
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = 1;
+  const [res, 2];
+}
+''');
+  }
+
+  test_const_inList_inBinaryExpression() {
+    indexTestUnit('''
+main() {
+  const [1 + 2, 3];
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = 1;
+  const [res + 2, 3];
+}
+''');
+  }
+
+  test_const_inList_inConditionalExpression() {
+    indexTestUnit('''
+main(bool b) {
+  const [b ? 1 : 2, 3];
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main(bool b) {
+  const res = 1;
+  const [b ? res : 2, 3];
+}
+''');
+  }
+
+  test_const_inList_inParenthesis() {
+    indexTestUnit('''
+main() {
+  const [(1), 2];
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = 1;
+  const [(res), 2];
+}
+''');
+  }
+
+  test_const_inList_inPrefixExpression() {
+    indexTestUnit('''
+main() {
+  const [!true, 2];
+}
+''');
+    _createRefactoringForString('true');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = true;
+  const [!res, 2];
+}
+''');
+  }
+
+  test_const_inMap_key() {
+    indexTestUnit('''
+main() {
+  const {1: 2};
+}
+''');
+    _createRefactoringForString('1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = 1;
+  const {res: 2};
+}
+''');
+  }
+
+  test_const_inMap_value() {
+    indexTestUnit('''
+main() {
+  const {1: 2};
+}
+''');
+    _createRefactoringForString('2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  const res = 2;
+  const {1: res};
+}
+''');
+  }
+
+  test_fragmentExpression() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('2 + 3');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 2 + 3;
+  int a = 1 + res + 4;
+}
+''');
+  }
+
+  test_fragmentExpression_leadingNotWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('+ 2');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_fragmentExpression_leadingPartialSelection() {
+    indexTestUnit('''
+main() {
+  int a = 111 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('11 + 2');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_fragmentExpression_leadingWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString(' 2 + 3');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res =  2 + 3;
+  int a = 1 +res + 4;
+}
+''');
+  }
+
+  test_fragmentExpression_notAssociativeOperator() {
+    indexTestUnit('''
+main() {
+  int a = 1 - 2 - 3 - 4;
+}
+''');
+    _createRefactoringForString('2 - 3');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_fragmentExpression_trailingNotWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('2 + 3 +');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_fragmentExpression_trailingPartialSelection() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 444;
+}
+''');
+    _createRefactoringForString('2 + 3 + 44');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_fragmentExpression_trailingWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('2 + 3 ');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 2 + 3 ;
+  int a = 1 + res+ 4;
+}
+''');
+  }
+
+  test_guessNames_fragmentExpression() {
+    indexTestUnit('''
+main() {
+  var a = 111 + 222 + 333 + 444;
+}
+''');
+    _createRefactoringForString('222 + 333');
+    // check guesses
+    return refactoring.checkInitialConditions().then((_) {
+      expect(refactoring.names, isEmpty);
+    });
+  }
+
+  test_guessNames_singleExpression() {
+    indexTestUnit('''
+class TreeItem {}
+TreeItem getSelectedItem() => null;
+process(my) {}
+main() {
+  process(getSelectedItem()); // marker
+}
+''');
+    _createRefactoringWithSuffix('getSelectedItem()', '); // marker');
+    // check guesses
+    return refactoring.checkInitialConditions().then((_) {
+      expect(
+          refactoring.names,
+          unorderedEquals(['selectedItem', 'item', 'my', 'treeItem']));
+    });
+  }
+
+  test_guessNames_stringPart() {
+    indexTestUnit('''
+main() {
+  var s = 'Hello Bob... welcome to Dart!';
+}
+''');
+    _createRefactoringForString('Hello Bob');
+    // check guesses
+    return refactoring.checkInitialConditions().then((_) {
+      expect(refactoring.names, unorderedEquals(['helloBob', 'bob']));
+    });
+  }
+
+  test_occurences_disableOccurences() {
+    indexTestUnit('''
+int foo() => 42;
+main() {
+  int a = 1 + foo();
+  int b = 2 + foo(); // marker
+}
+''');
+    _createRefactoringWithSuffix('foo()', '; // marker');
+    refactoring.extractAll = false;
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int foo() => 42;
+main() {
+  int a = 1 + foo();
+  var res = foo();
+  int b = 2 + res; // marker
+}
+''');
+  }
+
+  test_occurences_ignore_assignmentLeftHandSize() {
+    indexTestUnit('''
+main() {
+  int v = 1;
+  v = 2;
+  print(() {v = 2;});
+  print(1 + (() {v = 2; return 3;})());
+  print(v); // marker
+}
+''');
+    _createRefactoringWithSuffix('v', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v = 1;
+  v = 2;
+  print(() {v = 2;});
+  print(1 + (() {v = 2; return 3;})());
+  var res = v;
+  print(res); // marker
+}
+''');
+  }
+
+  test_occurences_ignore_nameOfVariableDeclariton() {
+    indexTestUnit('''
+main() {
+  int v = 1;
+  print(v); // marker
+}
+''');
+    _createRefactoringWithSuffix('v', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v = 1;
+  var res = v;
+  print(res); // marker
+}
+''');
+  }
+
+  test_occurences_singleExpression() {
+    indexTestUnit('''
+int foo() => 42;
+main() {
+  int a = 1 + foo();
+  int b = 2 +  foo(); // marker
+}
+''');
+    _createRefactoringWithSuffix('foo()', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int foo() => 42;
+main() {
+  var res = foo();
+  int a = 1 + res;
+  int b = 2 +  res; // marker
+}
+''');
+  }
+
+  test_occurences_useDominator() {
+    indexTestUnit('''
+main() {
+  if (true) {
+    print(42);
+  } else {
+    print(42);
+  }
+}
+''');
+    _createRefactoringForString('42');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 42;
+  if (true) {
+    print(res);
+  } else {
+    print(res);
+  }
+}
+''');
+  }
+
+  test_occurences_whenComment() {
+    indexTestUnit('''
+int foo() => 42;
+main() {
+  /*int a = 1 + foo();*/
+  int b = 2 + foo(); // marker
+}
+''');
+    _createRefactoringWithSuffix('foo()', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int foo() => 42;
+main() {
+  /*int a = 1 + foo();*/
+  var res = foo();
+  int b = 2 + res; // marker
+}
+''');
+  }
+
+  test_occurences_withSpace() {
+    indexTestUnit('''
+int foo(String s) => 42;
+main() {
+  int a = 1 + foo('has space');
+  int b = 2 + foo('has space'); // marker
+}
+''');
+    _createRefactoringWithSuffix("foo('has space')", '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int foo(String s) => 42;
+main() {
+  var res = foo('has space');
+  int a = 1 + res;
+  int b = 2 + res; // marker
+}
+''');
+  }
+
+  test_offsets_lengths() {
+    indexTestUnit('''
+int foo() => 42;
+main() {
+  int a = 1 + foo(); // marker
+  int b = 2 + foo( );
+}
+''');
+    _createRefactoringWithSuffix('foo()', '; // marker');
+    // apply refactoring
+    return refactoring.checkInitialConditions().then((_) {
+      expect(
+          refactoring.offsets,
+          unorderedEquals([findOffset('foo();'), findOffset('foo( );')]));
+      expect(refactoring.lengths, unorderedEquals([5, 6]));
+    });
+  }
+
+  test_singleExpression() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 1 + 2;
+  int a = res;
+}
+''');
+  }
+
+  test_singleExpression_getter() {
+    indexTestUnit('''
+class A {
+  int get foo => 42;
+}
+main() {
+  A a = new A();
+  int b = 1 + a.foo; // marker
+}
+''');
+    _createRefactoringWithSuffix('a.foo', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  int get foo => 42;
+}
+main() {
+  A a = new A();
+  var res = a.foo;
+  int b = 1 + res; // marker
+}
+''');
+  }
+
+  test_singleExpression_inMethod() {
+    indexTestUnit('''
+class A {
+  main() {
+    print(1 + 2);
+  }
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  main() {
+    var res = 1 + 2;
+    print(res);
+  }
+}
+''');
+  }
+
+  test_singleExpression_leadingNotWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 12 + 345;
+}
+''');
+    _createRefactoringForString('+ 345');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_singleExpression_leadingWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 12 /*abc*/ + 345;
+}
+''');
+    _createRefactoringForString('12 /*abc*/');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 12 /*abc*/;
+  int a = res + 345;
+}
+''');
+  }
+
+  /**
+   * Here we use knowledge how exactly `1 + 2 + 3 + 41 is parsed. We know that
+   * `1 + 2` will be a separate and complete binary expression, so it can be
+   * handled as a single expression.
+   */
+  test_singleExpression_partOfBinaryExpression() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 + 3 + 4;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 1 + 2;
+  int a = res + 3 + 4;
+}
+''');
+  }
+
+  test_singleExpression_trailingComment() {
+    indexTestUnit('''
+main() {
+  int a =  1 + 2;
+}
+''');
+    _createRefactoringForString(' 1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res =  1 + 2;
+  int a = res;
+}
+''');
+  }
+
+  test_singleExpression_trailingNotWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 12 + 345;
+}
+''');
+    _createRefactoringForString('12 +');
+    // check conditions
+    return _assertInitialConditions_fatal_selection();
+  }
+
+  test_singleExpression_trailingWhitespace() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2 ;
+}
+''');
+    _createRefactoringForString('1 + 2 ');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 1 + 2 ;
+  int a = res;
+}
+''');
+  }
+
+  test_stringLiteral_part() {
+    indexTestUnit('''
+main() {
+  print('abcdefgh');
+}
+''');
+    _createRefactoringForString('cde');
+    // apply refactoring
+    return _assertSuccessfulRefactoring(r'''
+main() {
+  var res = 'cde';
+  print('ab${res}fgh');
+}
+''');
+  }
+
+  test_stringLiteral_whole() {
+    indexTestUnit('''
+main() {
+  print('abc');
+}
+''');
+    _createRefactoringForString("'abc'");
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var res = 'abc';
+  print(res);
+}
+''');
+  }
+
+  Future _assertInitialConditions_fatal_selection() {
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: 'Expression must be selected to activate this refactoring.');
+    });
+  }
+
+  /**
+   * Checks that all conditions are OK and the result of applying the [Change]
+   * to [testUnit] is [expectedCode].
+   */
+  Future _assertSuccessfulRefactoring(String expectedCode) {
+    return assertRefactoringConditionsOK().then((_) {
+      return refactoring.createChange().then((SourceChange refactoringChange) {
+        this.refactoringChange = refactoringChange;
+        assertTestChangeResult(expectedCode);
+      });
+    });
+  }
+
+  void _createRefactoring(int offset, int length) {
+    refactoring = new ExtractLocalRefactoringImpl(testUnit, offset, length);
+    refactoring.name = 'res';
+  }
+
+  /**
+   * Creates a new refactoring in [refactoring] for the selection range of the
+   * given [search] pattern.
+   */
+  void _createRefactoringForString(String search) {
+    int offset = findOffset(search);
+    int length = search.length;
+    _createRefactoring(offset, length);
+  }
+
+  void _createRefactoringWithSuffix(String selectionSearch, String suffix) {
+    int offset = findOffset(selectionSearch + suffix);
+    int length = selectionSearch.length;
+    _createRefactoring(offset, length);
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
new file mode 100644
index 0000000..b155665
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -0,0 +1,2224 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.extract_method;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/refactoring/extract_method.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_refactoring.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ExtractMethodTest);
+}
+
+
+@ReflectiveTestCase()
+class ExtractMethodTest extends RefactoringTest {
+  ExtractMethodRefactoringImpl refactoring;
+
+  test_bad_assignmentLeftHandSide() {
+    indexTestUnit('''
+main() {
+  int aaa;
+  aaa = 0;
+}
+''');
+    _createRefactoringForString('aaa ');
+    return _assertConditionsFatal(
+        'Cannot extract the left-hand side of an assignment.');
+  }
+
+  test_bad_comment_selectionEndsInside() {
+    indexTestUnit('''
+main() {
+// start
+  print(0);
+/*
+// end
+*/
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal('Selection ends inside a comment.');
+  }
+
+  test_bad_comment_selectionStartsInside() {
+    indexTestUnit('''
+main() {
+/*
+// start
+*/
+  print(0);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal('Selection begins inside a comment.');
+  }
+
+  test_bad_conflict_method_alreadyDeclaresMethod() {
+    indexTestUnit('''
+class A {
+  void res() {}
+  main() {
+// start
+    print(0);
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsError(
+        "Class 'A' already declares method with name 'res'.");
+  }
+
+  test_bad_conflict_method_shadowsSuperDeclaration() {
+    indexTestUnit('''
+class A {
+  void res() {} // marker
+}
+class B extends A {
+  main() {
+    res();
+// start
+    print(0);
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsError("Created method will shadow method 'A.res'.");
+  }
+
+  test_bad_conflict_topLevel_alreadyDeclaresFunction() {
+    indexTestUnit('''
+library my.lib;
+
+void res() {}
+main() {
+// start
+  print(0);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsError(
+        "Library already declares function with name 'res'.");
+  }
+
+  test_bad_conflict_topLevel_willHideInheritedMemberUsage() {
+    indexTestUnit('''
+class A {
+  void res() {}
+}
+class B extends A {
+  foo() {
+    res(); // marker
+  }
+}
+main() {
+// start
+  print(0);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsError("Created function will shadow method 'A.res'.");
+  }
+
+  test_bad_constructor_initializer() {
+    indexTestUnit('''
+class A {
+  int f;
+  A() : f = 0 {}
+}
+''');
+    _createRefactoringForString('f = 0');
+    return _assertConditionsFatal(
+        'Cannot extract a constructor initializer. Select expression part of initializer.');
+  }
+
+  test_bad_constructor_redirectingConstructor() {
+    indexTestUnit('''
+class A {
+  A() : this.named();
+  A.named() {}
+}
+''');
+    _createRefactoringForString('this.named()');
+    return _assertConditionsFatal(
+        'Cannot extract a constructor initializer. Select expression part of initializer.');
+  }
+
+  test_bad_constructor_superConstructor() {
+    indexTestUnit('''
+class A {}
+class B extends A {
+  B() : super();
+}
+''');
+    _createRefactoringForString('super()');
+    return _assertConditionsFatal(
+        'Cannot extract a constructor initializer. Select expression part of initializer.');
+  }
+
+  test_bad_doWhile_body() {
+    indexTestUnit('''
+main() {
+  do 
+// start
+  { 
+  }
+// end
+  while (true);
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Operation not applicable to a 'do' statement's body and expression.");
+  }
+
+  test_bad_emptySelection() {
+    indexTestUnit('''
+main() {
+// start
+// end
+  print(0);
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Can only extract a single expression or a set of statements.");
+  }
+
+  test_bad_forLoop_conditionAndUpdaters() {
+    indexTestUnit('''
+main() {
+  for ( 
+    int i = 0;
+// start
+    i < 10; 
+    i++
+// end
+  ) {}
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Operation not applicable to a 'for' statement's condition and updaters.");
+  }
+
+  test_bad_forLoop_init() {
+    indexTestUnit('''
+main() {
+  for ( 
+// start
+    int i = 0
+// end
+    ; i < 10;
+    i++
+  ) {}
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Cannot extract initialization part of a 'for' statement.");
+  }
+
+  test_bad_forLoop_initAndCondition() {
+    indexTestUnit('''
+main() {
+  for ( 
+// start
+    int i = 0;
+    i < 10;
+// end
+    i++
+  ) {}
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Operation not applicable to a 'for' statement's initializer and condition.");
+  }
+
+  test_bad_forLoop_updaters() {
+    indexTestUnit('''
+main() {
+  for ( 
+    int i = 0;
+    i < 10;
+// start
+    i++
+// end
+  ) {}
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Cannot extract increment part of a 'for' statement.");
+  }
+
+  test_bad_forLoop_updatersAndBody() {
+    indexTestUnit('''
+main() {
+  for ( 
+    int i = 0;
+    i < 10;
+// start
+    i++
+  ) {}
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Operation not applicable to a 'for' statement's updaters and body.");
+  }
+
+  test_bad_methodName_reference() {
+    indexTestUnit('''
+main() {
+  main();
+}
+''');
+    _createRefactoringWithSuffix('main', '();');
+    return _assertConditionsFatal("Cannot extract a single method name.");
+  }
+
+  test_bad_namePartOfDeclaration_function() {
+    indexTestUnit('''
+main() {
+}
+''');
+    _createRefactoringForString('main');
+    return _assertConditionsFatal(
+        "Cannot extract the name part of a declaration.");
+  }
+
+  test_bad_namePartOfDeclaration_variable() {
+    indexTestUnit('''
+main() {
+  int vvv = 0;
+}
+''');
+    _createRefactoringForString('vvv');
+    return _assertConditionsFatal(
+        "Cannot extract the name part of a declaration.");
+  }
+
+  test_bad_namePartOfQualified() {
+    indexTestUnit('''
+class A {
+  var fff;
+}
+main() {
+  A a;
+  a.fff = 1;
+}
+''');
+    _createRefactoringWithSuffix('fff', ' = 1');
+    return _assertConditionsFatal(
+        "Can not extract name part of a property access.");
+  }
+
+  test_bad_newMethodName_notIdentifier() {
+    indexTestUnit('''
+main() {
+// start
+  print(0);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    refactoring.name = 'bad-name';
+    // check conditions
+    return _assertConditionsError("Method name must not contain '-'.");
+  }
+
+  test_bad_notSameParent() {
+    indexTestUnit('''
+main() {
+  while (false) 
+// start
+  { 
+  } 
+  print(0);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        'Not all selected statements are enclosed by the same parent statement.');
+  }
+
+  test_bad_parameterName_duplicate() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+// start
+  int a = v1 + v2; // marker
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // update parameters
+    return refactoring.checkInitialConditions().then((_) {
+      {
+        var parameters = refactoring.parameters.toList();
+        expect(parameters, hasLength(2));
+        parameters[0].name = 'dup';
+        parameters[1].name = 'dup';
+        refactoring.parameters = parameters;
+      }
+      return _assertFinalConditionsError("Parameter 'dup' already exists");
+    });
+  }
+
+  test_bad_parameterName_inUse() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+// start
+  int a = v1 + v2; // marker
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // update parameters
+    return refactoring.checkInitialConditions().then((_) {
+      {
+        var parameters = refactoring.parameters.toList();
+        expect(parameters, hasLength(2));
+        parameters[0].name = 'a';
+        refactoring.parameters = parameters;
+      }
+      return _assertFinalConditionsError(
+          "'a' is already used as a name in the selected code");
+    });
+  }
+
+  test_bad_selectionEndsInSomeNode() {
+    indexTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    _createRefactoringForStartEndString('print(0', 'rint(1)');
+    return _assertConditionsFatal(
+        "The selection does not cover a set of statements or an expression. "
+            "Extend selection to a valid range.");
+  }
+
+  test_bad_statements_return_andAssignsVariable() {
+    indexTestUnit('''
+main() {
+// start
+  var v = 0;
+  return 42;
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Ambiguous return value: Selected block contains assignment(s) to "
+            "local variables and return statement.");
+  }
+
+  test_bad_switchCase() {
+    indexTestUnit('''
+main() {
+  switch (1) { 
+// start
+    case 0: break;
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Selection must either cover whole switch statement "
+            "or parts of a single case block.");
+  }
+
+  test_bad_tokensBetweenLastNodeAndSelectionEnd() {
+    indexTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+}
+// end
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "The end of the selection contains characters that do not belong to a statement.");
+  }
+
+  test_bad_tokensBetweenSelectionStartAndFirstNode() {
+    indexTestUnit('''
+main() {
+// start
+  print(0); // marker
+  print(1);
+// end
+}
+''');
+    _createRefactoringForStartEndString('); // marker', '// end');
+    return _assertConditionsFatal(
+        "The beginning of the selection contains characters that do not belong to a statement.");
+  }
+
+  test_bad_try_catchBlock_block() {
+    indexTestUnit('''
+main() {
+  try
+  {} 
+  catch (e)
+// start
+  {}
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Selection must either cover whole try statement or "
+            "parts of try, catch, or finally block.");
+  }
+
+  test_bad_try_catchBlock_complete() {
+    indexTestUnit('''
+main() {
+  try
+  {} 
+// start
+  catch (e)
+  {}
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Selection must either cover whole try statement or "
+            "parts of try, catch, or finally block.");
+  }
+
+  test_bad_try_catchBlock_exception() {
+    indexTestUnit('''
+main() {
+  try {
+  } catch ( 
+// start
+  e
+// end
+  ) {
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        'Cannot extract the name part of a declaration.');
+  }
+
+  test_bad_try_finallyBlock() {
+    indexTestUnit('''
+main() {
+  try
+  {} 
+  finally
+// start
+  {}
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Selection must either cover whole try statement or "
+            "parts of try, catch, or finally block.");
+  }
+
+  test_bad_try_tryBlock() {
+    indexTestUnit('''
+main() {
+  try
+// start
+  {} 
+// end
+  finally
+  {}
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Selection must either cover whole try statement or "
+            "parts of try, catch, or finally block.");
+  }
+
+  test_bad_typeReference() {
+    indexTestUnit('''
+main() {
+  int a = 0;
+}
+''');
+    _createRefactoringForString("int");
+    return _assertConditionsFatal("Cannot extract a single type reference.");
+  }
+
+  test_bad_variableDeclarationFragment() {
+    indexTestUnit('''
+main() {
+  int 
+// start
+    a = 1
+// end
+    ,b = 2;
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Cannot extract a variable declaration fragment. Select whole declaration statement.");
+  }
+
+  test_bad_while_conditionAndBody() {
+    indexTestUnit('''
+main() {
+  while 
+// start
+    (false) 
+  { 
+  } 
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    return _assertConditionsFatal(
+        "Operation not applicable to a while statement's expression and body.");
+  }
+
+  test_canExtractGetter_false_fieldAssignment() {
+    indexTestUnit('''
+class A {
+  var f;
+  main() {
+// start
+    f = 1;
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, false);
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_canExtractGetter_false_hasParameters() {
+    indexTestUnit('''
+main(int p) {
+  int a = p + 1;
+}
+''');
+    _createRefactoringForString('p + 1');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, false);
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_canExtractGetter_false_returnNotUsed_assignment() {
+    indexTestUnit('''
+var topVar = 0;
+f(int p) {
+  topVar = 5;
+}
+''');
+    _createRefactoringForString('topVar = 5');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, false);
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_canExtractGetter_false_returnNotUsed_noReturn() {
+    indexTestUnit('''
+var topVar = 0;
+main() {
+// start
+  int a = 1;
+  int b = 2;
+  topVar = a + b;
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, false);
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_canExtractGetter_true() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, true);
+      expect(refactoring.createGetter, true);
+    });
+  }
+
+  test_checkName() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // null
+    refactoring.name = null;
+    assertRefactoringStatus(
+        refactoring.checkName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Method name must not be null.");
+    // empty
+    refactoring.name = '';
+    assertRefactoringStatus(
+        refactoring.checkName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Method name must not be empty.");
+    // OK
+    refactoring.name = 'res';
+    assertRefactoringStatusOK(refactoring.checkName());
+  }
+
+  test_closure_asFunction_singleExpression() {
+    indexTestUnit('''
+process(f(x)) {}
+main() {
+  process((x) => x * 2);
+}
+''');
+    _createRefactoringForString('(x) => x * 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+process(f(x)) {}
+main() {
+  process(res);
+}
+
+res(x) => x * 2;
+''');
+  }
+
+  test_closure_asFunction_statements() {
+    indexTestUnit('''
+process(f(x)) {}
+main() {
+  process((x) {
+    print(x);
+    return x * 2;
+  }); // marker
+}
+''');
+    _createRefactoringForStartEndString('(x) {', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+process(f(x)) {}
+main() {
+  process(res); // marker
+}
+
+res(x) {
+  print(x);
+  return x * 2;
+}
+''');
+  }
+
+  test_closure_asMethod_statements() {
+    indexTestUnit('''
+process(f(x)) {}
+class A {
+  int k = 2;
+  main() {
+    process((x) {
+      print(x);
+      return x * k;
+    }); // marker
+  }
+}
+''');
+    _createRefactoringForStartEndString('(x) {', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+process(f(x)) {}
+class A {
+  int k = 2;
+  main() {
+    process(res); // marker
+  }
+
+  res(x) {
+    print(x);
+    return x * k;
+  }
+}
+''');
+  }
+
+  test_closure_bad_referencesLocalVariable() {
+    indexTestUnit('''
+process(f(x)) {}
+main() {
+  int k = 2;
+  process((x) => x * k);
+}
+''');
+    _createRefactoringForString('(x) => x * k');
+    // check
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage:
+              'Cannot extract closure as method, it references 1 external variable(s).');
+    });
+  }
+
+  test_closure_bad_referencesParameter() {
+    indexTestUnit('''
+process(f(x)) {}
+main(int k) {
+  process((x) => x * k);
+}
+''');
+    _createRefactoringForString('(x) => x * k');
+    // check
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage:
+              'Cannot extract closure as method, it references 1 external variable(s).');
+    });
+  }
+
+  test_fromTopLevelVariableInitializerClosure() {
+    indexTestUnit('''
+var X = 1;
+
+var Y = () {
+  return 1 + X;
+};
+''');
+    _createRefactoringForString('1 + X');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+var X = 1;
+
+var Y = () {
+  return res();
+};
+
+num res() => 1 + X;
+''');
+  }
+
+  test_getExtractGetter_false_do() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 0;
+  do {
+    v++;
+  } while (v < 10);
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_false_for() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 0;
+  for (int i = 0; i < 10; i++) {
+    v += i;
+  }
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_false_forEach() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 0;
+  for (int i in [1, 2, 3]) {
+    v += i;
+  }
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_false_methodInvocation_expression() {
+    indexTestUnit('''
+main() {
+  int v = calculateSomething() + 5;
+}
+int calculateSomething() => 42;
+''');
+    _createRefactoringForString('calculateSomething() + 5');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_false_methodInvocation_statements() {
+    indexTestUnit('''
+main() {
+// start
+  int v = calculateSomething();
+// end
+  print(v);
+}
+int calculateSomething() => 42;
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_false_while() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 0;
+  while (v < 10) {
+    v++;
+  }
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, false);
+    });
+  }
+
+  test_getExtractGetter_true_simpleBlock() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 1 + 2;
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, true);
+    });
+  }
+
+  test_getExtractGetter_true_singleExpression() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 1 + 2;
+// end
+  print(v);
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.createGetter, true);
+    });
+  }
+
+  test_getRefactoringName_function() {
+    indexTestUnit('''
+main() {
+  print(1 + 2);
+}
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.refactoringName, 'Extract Function');
+  }
+
+  test_getRefactoringName_method() {
+    indexTestUnit('''
+class A {
+  main() {
+    print(1 + 2);
+  }
+}
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.refactoringName, 'Extract Method');
+  }
+
+  test_setExtractGetter() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return assertRefactoringConditionsOK().then((_) {
+      expect(refactoring.canCreateGetter, true);
+      expect(refactoring.createGetter, true);
+      return refactoring.createChange().then((SourceChange refactoringChange) {
+        this.refactoringChange = refactoringChange;
+        assertTestChangeResult('''
+main() {
+  int a = res;
+}
+
+int get res => 1 + 2;
+''');
+      });
+    });
+  }
+
+  test_singleExpression() {
+    indexTestUnit('''
+main() {
+  int a = 1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int a = res();
+}
+
+int res() => 1 + 2;
+''');
+  }
+
+  test_singleExpression_cascade() {
+    indexTestUnit('''
+main() {
+  String s = '';
+  var v = s..length;
+}
+''');
+    _createRefactoringForString('s..length');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  String s = '';
+  var v = res(s);
+}
+
+String res(String s) => s..length;
+''');
+  }
+
+  test_singleExpression_dynamic() {
+    indexTestUnit('''
+dynaFunction() {}
+main() {
+  var v = dynaFunction(); // marker
+}
+''');
+    _createRefactoringWithSuffix('dynaFunction()', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+dynaFunction() {}
+main() {
+  var v = res(); // marker
+}
+
+res() => dynaFunction();
+''');
+  }
+
+  test_singleExpression_ignore_assignmentLeftHandSize() {
+    indexTestUnit('''
+main() {
+  getButton().text = 'txt';
+  print(getButton().text); // marker
+}
+getButton() {}
+''');
+    _createRefactoringWithSuffix('getButton().text', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  getButton().text = 'txt';
+  print(res()); // marker
+}
+
+res() => getButton().text;
+getButton() {}
+''');
+  }
+
+  test_singleExpression_occurrences() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int positiveA = v1 + v2; // marker
+  int positiveB = v2 + v3;
+  int positiveC = v1 +  v2;
+  int positiveD = v1/*abc*/ + v2;
+  int negA = 1 + 2;
+  int negB = 1 + v2;
+  int negC = v1 + 2;
+  int negD = v1 * v2;
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int positiveA = res(v1, v2); // marker
+  int positiveB = res(v2, v3);
+  int positiveC = res(v1, v2);
+  int positiveD = res(v1, v2);
+  int negA = 1 + 2;
+  int negB = 1 + v2;
+  int negC = v1 + 2;
+  int negD = v1 * v2;
+}
+
+int res(int v1, int v2) => v1 + v2;
+''');
+  }
+
+  test_singleExpression_occurrences_disabled() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = v1 + v2; // marker
+  int b = v2 + v3;
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    refactoring.extractAll = false;
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = res(v1, v2); // marker
+  int b = v2 + v3;
+}
+
+int res(int v1, int v2) => v1 + v2;
+''');
+  }
+
+  test_singleExpression_occurrences_inClassOnly() {
+    indexTestUnit('''
+class A {
+  myMethod() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = v1 + v2; // marker
+  }
+}
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int negA = v1 + v2;
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  myMethod() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = res(v1, v2); // marker
+  }
+
+  int res(int v1, int v2) => v1 + v2;
+}
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int negA = v1 + v2;
+}
+''');
+  }
+
+  test_singleExpression_occurrences_inWholeUnit() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int positiveA = v1 + v2; // marker
+}
+class A {
+  myMethod() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = v1 + v2;
+  }
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int positiveA = res(v1, v2); // marker
+}
+
+int res(int v1, int v2) => v1 + v2;
+class A {
+  myMethod() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = res(v1, v2);
+  }
+}
+''');
+  }
+
+  test_singleExpression_returnTypeGeneric() {
+    indexTestUnit('''
+main() {
+  var v = new List<String>();
+}
+''');
+    _createRefactoringForString('new List<String>()');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var v = res();
+}
+
+List<String> res() => new List<String>();
+''');
+  }
+
+  test_singleExpression_returnTypePrefix() {
+    indexTestUnit('''
+import 'dart:math' as pref;
+main() {
+  var v = new pref.Random();
+}
+''');
+    _createRefactoringForString('new pref.Random()');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+import 'dart:math' as pref;
+main() {
+  var v = res();
+}
+
+pref.Random res() => new pref.Random();
+''');
+  }
+
+  test_singleExpression_staticContext_extractFromInitializer() {
+    indexTestUnit('''
+class A {
+  A(int v) {}
+}
+class B extends A {
+  B() : super(1 + 2) {}
+}
+''');
+    _createRefactoringForString('1 + 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  A(int v) {}
+}
+class B extends A {
+  B() : super(res()) {}
+
+  static int res() => 1 + 2;
+}
+''');
+  }
+
+  test_singleExpression_staticContext_extractFromInstance() {
+    indexTestUnit('''
+class A {
+  instanceMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = v1 + v2; // marker
+  }
+  instanceMethodB() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = v1 + v2;
+  }
+  static staticMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = v1 + v2;
+  }
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  instanceMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = res(v1, v2); // marker
+  }
+
+  static int res(int v1, int v2) => v1 + v2;
+  instanceMethodB() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = res(v1, v2);
+  }
+  static staticMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = res(v1, v2);
+  }
+}
+''');
+  }
+
+  test_singleExpression_staticContext_extractFromStatic() {
+    indexTestUnit('''
+class A {
+  static staticMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = v1 + v2; // marker
+  }
+  static staticMethodB() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = v1 + v2;
+  }
+  instanceMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = v1 + v2;
+  }
+}
+''');
+    _createRefactoringWithSuffix('v1 + v2', '; // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  static staticMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = res(v1, v2); // marker
+  }
+
+  static int res(int v1, int v2) => v1 + v2;
+  static staticMethodB() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveB = res(v1, v2);
+  }
+  instanceMethodA() {
+    int v1 = 1;
+    int v2 = 2;
+    int positiveA = res(v1, v2);
+  }
+}
+''');
+  }
+
+  test_singleExpression_staticContext_hasInInitializer() {
+    indexTestUnit('''
+class A {
+  A(int v) {}
+}
+class B extends A {
+  B() : super(1 + 2) {}
+  foo() {
+    print(1 + 2); // marker
+  }
+}
+''');
+    _createRefactoringWithSuffix('1 + 2', '); // marker');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  A(int v) {}
+}
+class B extends A {
+  B() : super(res()) {}
+  foo() {
+    print(res()); // marker
+  }
+
+  static int res() => 1 + 2;
+}
+''');
+  }
+
+  test_singleExpression_usesParameter() {
+    indexTestUnit('''
+fooA(int a1) {
+  int a2 = 2;
+  int a = a1 + a2;
+}
+fooB(int b1) {
+  int b2 = 2;
+  int b = b1 + b2;
+}
+''');
+    _createRefactoringForString('a1 + a2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+fooA(int a1) {
+  int a2 = 2;
+  int a = res(a1, a2);
+}
+
+int res(int a1, int a2) => a1 + a2;
+fooB(int b1) {
+  int b2 = 2;
+  int b = res(b1, b2);
+}
+''');
+  }
+
+  test_singleExpression_withVariables() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int a = v1 + v2 + v1;
+}
+''');
+    _createRefactoringForString('v1 + v2 + v1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int a = res(v1, v2);
+}
+
+int res(int v1, int v2) => v1 + v2 + v1;
+''');
+  }
+
+  test_singleExpression_withVariables_doRename() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = v1 + v2 + v1; // marker
+  int b = v2 + v3 + v2;
+}
+''');
+    _createRefactoringForString('v1 + v2 + v1');
+    // apply refactoring
+    return refactoring.checkInitialConditions().then((_) {
+      {
+        var parameters = refactoring.parameters.toList();
+        expect(parameters, hasLength(2));
+        expect(parameters[0].name, 'v1');
+        expect(parameters[1].name, 'v2');
+        parameters[0].name = 'par1';
+        parameters[1].name = 'param2';
+        refactoring.parameters = parameters;
+      }
+      return assertRefactoringFinalConditionsOK().then((_) {
+        refactoring.createGetter = false;
+        return _assertRefactoringChange('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = res(v1, v2); // marker
+  int b = res(v2, v3);
+}
+
+int res(int par1, int param2) => par1 + param2 + par1;
+''');
+      });
+    });
+  }
+
+  test_singleExpression_withVariables_doReorder() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = v1 + v2; // marker
+  int b = v2 + v3;
+}
+''');
+    _createRefactoringForString('v1 + v2');
+    // apply refactoring
+    return refactoring.checkInitialConditions().then((_) {
+      {
+        var parameters = refactoring.parameters.toList();
+        expect(parameters, hasLength(2));
+        expect(parameters[0].name, 'v1');
+        expect(parameters[1].name, 'v2');
+        var parameter = parameters.removeAt(1);
+        parameters.insert(0, parameter);
+        refactoring.parameters = parameters;
+      }
+      return assertRefactoringFinalConditionsOK().then((_) {
+        refactoring.createGetter = false;
+        return _assertRefactoringChange('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = res(v2, v1); // marker
+  int b = res(v3, v2);
+}
+
+int res(int v2, int v1) => v1 + v2;
+''');
+      });
+    });
+  }
+
+  test_singleExpression_withVariables_namedExpression() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int a = process(arg: v1 + v2);
+}
+process({arg}) {}
+''');
+    _createRefactoringForString('process(arg: v1 + v2)');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int a = res(v1, v2);
+}
+
+res(int v1, int v2) => process(arg: v1 + v2);
+process({arg}) {}
+''');
+  }
+
+  test_singleExpression_withVariables_newType() {
+    indexTestUnit('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = v1 + v2 + v3;
+}
+''');
+    _createRefactoringForString('v1 + v2 + v3');
+    // apply refactoring
+    return refactoring.checkInitialConditions().then((_) {
+      {
+        var parameters = refactoring.parameters.toList();
+        expect(parameters, hasLength(3));
+        expect(parameters[0].name, 'v1');
+        expect(parameters[1].name, 'v2');
+        expect(parameters[2].name, 'v3');
+        parameters[0].type = 'num';
+        parameters[1].type = 'dynamic';
+        parameters[2].type = '';
+        refactoring.parameters = parameters;
+      }
+      return assertRefactoringFinalConditionsOK().then((_) {
+        refactoring.createGetter = false;
+        return _assertRefactoringChange('''
+main() {
+  int v1 = 1;
+  int v2 = 2;
+  int v3 = 3;
+  int a = res(v1, v2, v3);
+}
+
+int res(num v1, v2, v3) => v1 + v2 + v3;
+''');
+      });
+    });
+  }
+
+  test_singleExpression_withVariables_useBestType() {
+    indexTestUnit('''
+main() {
+  var v1 = 1;
+  var v2 = 2;
+  var a = v1 + v2 + v1; // marker
+}
+''');
+    _createRefactoringForString('v1 + v2 + v1');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  var v1 = 1;
+  var v2 = 2;
+  var a = res(v1, v2); // marker
+}
+
+num res(int v1, int v2) => v1 + v2 + v1;
+''');
+  }
+
+  test_statements_assignment() {
+    indexTestUnit('''
+main() {
+  int v;
+// start
+  v = 5;
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int v;
+// start
+  v = res(v);
+// end
+  print(v);
+}
+
+int res(int v) {
+  v = 5;
+  return v;
+}
+''');
+  }
+
+  test_statements_changeIndentation() {
+    indexTestUnit('''
+main() {
+  {
+// start
+    if (true) {
+      print(0);
+    }
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  {
+// start
+    res();
+// end
+  }
+}
+
+void res() {
+  if (true) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statements_changeIndentation_multilineString() {
+    indexTestUnit('''
+main() {
+  {
+// start
+    print("""
+first line
+second line
+    """);
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  {
+// start
+    res();
+// end
+  }
+}
+
+void res() {
+  print("""
+first line
+second line
+    """);
+}
+''');
+  }
+
+  test_statements_definesVariable_notUsedOutside() {
+    indexTestUnit('''
+main() {
+  int a = 1;
+  int b = 1;
+// start
+  int v = a + b;
+  print(v);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int a = 1;
+  int b = 1;
+// start
+  res(a, b);
+// end
+}
+
+void res(int a, int b) {
+  int v = a + b;
+  print(v);
+}
+''');
+  }
+
+  test_statements_definesVariable_oneUsedOutside_assignment() {
+    indexTestUnit('''
+myFunctionA() {
+  int a = 1;
+// start
+  a += 10;
+// end
+  print(a);
+}
+myFunctionB() {
+  int b = 2;
+  b += 10;
+  print(b);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+myFunctionA() {
+  int a = 1;
+// start
+  a = res(a);
+// end
+  print(a);
+}
+
+int res(int a) {
+  a += 10;
+  return a;
+}
+myFunctionB() {
+  int b = 2;
+  b = res(b);
+  print(b);
+}
+''');
+  }
+
+  test_statements_definesVariable_oneUsedOutside_declaration() {
+    indexTestUnit('''
+myFunctionA() {
+  int a = 1;
+  int b = 2;
+// start
+  int v1 = a + b;
+// end
+  print(v1);
+}
+myFunctionB() {
+  int a = 3;
+  int b = 4;
+  int v2 = a + b;
+  print(v2);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+myFunctionA() {
+  int a = 1;
+  int b = 2;
+// start
+  int v1 = res(a, b);
+// end
+  print(v1);
+}
+
+int res(int a, int b) {
+  int v1 = a + b;
+  return v1;
+}
+myFunctionB() {
+  int a = 3;
+  int b = 4;
+  int v2 = res(a, b);
+  print(v2);
+}
+''');
+  }
+
+  test_statements_definesVariable_twoUsedOutside() {
+    indexTestUnit('''
+main() {
+// start
+  int varA = 1;
+  int varB = 2;
+// end
+  int v = varA + varB;
+}
+''');
+    _createRefactoringForStartEndComments();
+    // check conditions
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+    });
+  }
+
+  test_statements_duplicate_absolutelySame() {
+    indexTestUnit('''
+myFunctionA() {
+  print(0);
+  print(1);
+}
+myFunctionB() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+myFunctionA() {
+  res();
+}
+myFunctionB() {
+// start
+  res();
+// end
+}
+
+void res() {
+  print(0);
+  print(1);
+}
+''');
+  }
+
+  test_statements_duplicate_declaresDifferentlyNamedVariable() {
+    indexTestUnit('''
+myFunctionA() {
+  int varA = 1;
+  print(varA);
+}
+myFunctionB() {
+// start
+  int varB = 1;
+  print(varB);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+myFunctionA() {
+  res();
+}
+myFunctionB() {
+// start
+  res();
+// end
+}
+
+void res() {
+  int varB = 1;
+  print(varB);
+}
+''');
+  }
+
+  test_statements_dynamic() {
+    indexTestUnit('''
+dynaFunction(p) => 0;
+main() {
+// start
+  var a = 1;
+  var v = dynaFunction(a);
+// end
+  print(v);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+dynaFunction(p) => 0;
+main() {
+// start
+  var v = res();
+// end
+  print(v);
+}
+
+res() {
+  var a = 1;
+  var v = dynaFunction(a);
+  return v;
+}
+''');
+  }
+
+  /**
+   * We should always add ";" when invoke method with extracted statements.
+   */
+  test_statements_endsWithBlock() {
+    indexTestUnit('''
+main() {
+// start
+  if (true) {
+    print(0);
+  }
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+// start
+  res();
+// end
+}
+
+void res() {
+  if (true) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statements_inSwitchMember() {
+    indexTestUnit('''
+class A {
+  foo(int p) {
+    switch (p) {
+      case 0:
+// start
+        print(0);
+// end
+        break;
+      default:
+        break;
+    }
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  foo(int p) {
+    switch (p) {
+      case 0:
+// start
+        res();
+// end
+        break;
+      default:
+        break;
+    }
+  }
+
+  void res() {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statements_method() {
+    indexTestUnit('''
+class A {
+  foo() {
+// start
+    print(0);
+// end
+  }
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  foo() {
+// start
+    res();
+// end
+  }
+
+  void res() {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statements_noDuplicates() {
+    indexTestUnit('''
+main() {
+  int a = 1;
+  int b = 1;
+// start
+  print(a);
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+  int a = 1;
+  int b = 1;
+// start
+  res(a);
+// end
+}
+
+void res(int a) {
+  print(a);
+}
+''');
+  }
+
+  test_statements_return_last() {
+    indexTestUnit('''
+main() {
+// start
+  int v = 5;
+  return v + 1;
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+// start
+  return res();
+// end
+}
+
+int res() {
+  int v = 5;
+  return v + 1;
+}
+''');
+  }
+
+  test_statements_return_single() {
+    indexTestUnit('''
+main() {
+// start
+  return 42;
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+// start
+  return res();
+// end
+}
+
+int res() {
+  return 42;
+}
+''');
+  }
+
+  /**
+   * We have 3 identical statements, but select only 2.
+   * This should not cause problems.
+   */
+  test_statements_twoOfThree() {
+    indexTestUnit('''
+main() {
+// start
+  print(0);
+  print(0);
+// end
+  print(0);
+}
+''');
+    _createRefactoringForStartEndComments();
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+main() {
+// start
+  res();
+// end
+  print(0);
+}
+
+void res() {
+  print(0);
+  print(0);
+}
+''');
+  }
+
+  Future _assertConditionsError(String message) {
+    return refactoring.checkAllConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: message);
+    });
+  }
+
+  Future _assertConditionsFatal(String message) {
+    return refactoring.checkAllConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: message);
+    });
+  }
+
+  Future _assertFinalConditionsError(String message) {
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: message);
+    });
+  }
+
+  Future _assertRefactoringChange(String expectedCode) {
+    return refactoring.createChange().then((SourceChange refactoringChange) {
+      this.refactoringChange = refactoringChange;
+      assertTestChangeResult(expectedCode);
+    });
+  }
+
+  /**
+   * Checks that all conditions are OK and the result of applying the [Change]
+   * to [testUnit] is [expectedCode].
+   */
+  Future _assertSuccessfulRefactoring(String expectedCode) {
+    return assertRefactoringConditionsOK().then((_) {
+      refactoring.createGetter = false;
+      return _assertRefactoringChange(expectedCode);
+    });
+  }
+
+  void _createRefactoring(int offset, int length) {
+    refactoring =
+        new ExtractMethodRefactoringImpl(searchEngine, testUnit, offset, length);
+    refactoring.name = 'res';
+  }
+
+  void _createRefactoringForStartEndComments() {
+    int offset = findEnd('// start') + '\n'.length;
+    int end = findOffset('// end');
+    _createRefactoring(offset, end - offset);
+  }
+
+  void _createRefactoringForStartEndString(String startSearch,
+      String endSearch) {
+    int offset = findOffset(startSearch);
+    int end = findOffset(endSearch);
+    _createRefactoring(offset, end - offset);
+  }
+
+  /**
+   * Creates a new refactoring in [refactoring] for the selection range of the
+   * given [search] pattern.
+   */
+  void _createRefactoringForString(String search) {
+    int offset = findOffset(search);
+    int length = search.length;
+    _createRefactoring(offset, length);
+  }
+
+  void _createRefactoringWithSuffix(String selectionSearch, String suffix) {
+    int offset = findOffset(selectionSearch + suffix);
+    int length = selectionSearch.length;
+    _createRefactoring(offset, length);
+  }
+}
diff --git a/pkg/analysis_services/test/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
similarity index 85%
rename from pkg/analysis_services/test/refactoring/naming_conventions_test.dart
rename to pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 52cfd67..472947d 100644
--- a/pkg/analysis_services/test/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -4,9 +4,10 @@
 
 library test.services.refactoring.naming_conventions;
 
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/src/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/protocol.dart' show
+    RefactoringProblemSeverity;
+import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -43,35 +44,35 @@
   void test_validateClassName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateClassName("newName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Class name should start with an uppercase letter.");
   }
 
   void test_validateClassName_empty() {
     assertRefactoringStatus(
         validateClassName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not be empty.");
   }
 
   void test_validateClassName_leadingBlanks() {
     assertRefactoringStatus(
         validateClassName(" NewName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Class name must not start or end with a blank.");
   }
 
   void test_validateClassName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateClassName("New-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Class name must not contain '-'.");
   }
 
   void test_validateClassName_notIdentifierStart() {
     assertRefactoringStatus(
         validateClassName("-NewName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Class name must begin with an uppercase letter or underscore.");
   }
@@ -79,14 +80,14 @@
   void test_validateClassName_null() {
     assertRefactoringStatus(
         validateClassName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not be null.");
   }
 
   void test_validateClassName_trailingBlanks() {
     assertRefactoringStatus(
         validateClassName("NewName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Class name must not start or end with a blank.");
   }
   void test_validateConstantName_OK() {
@@ -108,35 +109,35 @@
   void test_validateConstantName_empty() {
     assertRefactoringStatus(
         validateConstantName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not be empty.");
   }
 
   void test_validateConstantName_leadingBlanks() {
     assertRefactoringStatus(
         validateConstantName(" NewName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constant name must not start or end with a blank.");
   }
 
   void test_validateConstantName_notAllCaps() {
     assertRefactoringStatus(
         validateConstantName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Constant name should be all uppercase with underscores.");
   }
 
   void test_validateConstantName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateConstantName("NA-ME"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constant name must not contain '-'.");
   }
 
   void test_validateConstantName_notIdentifierStart() {
     assertRefactoringStatus(
         validateConstantName("99_RED_BALLOONS"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Constant name must begin with an uppercase letter or underscore.");
   }
@@ -144,14 +145,14 @@
   void test_validateConstantName_null() {
     assertRefactoringStatus(
         validateConstantName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not be null.");
   }
 
   void test_validateConstantName_trailingBlanks() {
     assertRefactoringStatus(
         validateConstantName("NewName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constant name must not start or end with a blank.");
   }
 
@@ -166,7 +167,7 @@
   void test_validateConstructorName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateConstructorName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Constructor name should start with a lowercase letter.");
   }
 
@@ -177,21 +178,21 @@
   void test_validateConstructorName_leadingBlanks() {
     assertRefactoringStatus(
         validateConstructorName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constructor name must not start or end with a blank.");
   }
 
   void test_validateConstructorName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateConstructorName("na-me"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constructor name must not contain '-'.");
   }
 
   void test_validateConstructorName_notIdentifierStart() {
     assertRefactoringStatus(
         validateConstructorName("2name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Constructor name must begin with a lowercase letter or underscore.");
   }
@@ -199,14 +200,14 @@
   void test_validateConstructorName_null() {
     assertRefactoringStatus(
         validateConstructorName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constructor name must not be null.");
   }
 
   void test_validateConstructorName_trailingBlanks() {
     assertRefactoringStatus(
         validateConstructorName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Constructor name must not start or end with a blank.");
   }
 
@@ -225,35 +226,35 @@
   void test_validateFieldName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateFieldName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Field name should start with a lowercase letter.");
   }
 
   void test_validateFieldName_empty() {
     assertRefactoringStatus(
         validateFieldName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not be empty.");
   }
 
   void test_validateFieldName_leadingBlanks() {
     assertRefactoringStatus(
         validateFieldName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Field name must not start or end with a blank.");
   }
 
   void test_validateFieldName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFieldName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Field name must not contain '-'.");
   }
 
   void test_validateFieldName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFieldName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Field name must begin with a lowercase letter or underscore.");
   }
@@ -261,14 +262,14 @@
   void test_validateFieldName_null() {
     assertRefactoringStatus(
         validateFieldName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not be null.");
   }
 
   void test_validateFieldName_trailingBlanks() {
     assertRefactoringStatus(
         validateFieldName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Field name must not start or end with a blank.");
   }
 
@@ -287,35 +288,35 @@
   void test_validateFunctionName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateFunctionName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Function name should start with a lowercase letter.");
   }
 
   void test_validateFunctionName_empty() {
     assertRefactoringStatus(
         validateFunctionName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not be empty.");
   }
 
   void test_validateFunctionName_leadingBlanks() {
     assertRefactoringStatus(
         validateFunctionName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Function name must not start or end with a blank.");
   }
 
   void test_validateFunctionName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFunctionName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Function name must not contain '-'.");
   }
 
   void test_validateFunctionName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFunctionName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Function name must begin with a lowercase letter or underscore.");
   }
@@ -323,14 +324,14 @@
   void test_validateFunctionName_null() {
     assertRefactoringStatus(
         validateFunctionName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not be null.");
   }
 
   void test_validateFunctionName_trailingBlanks() {
     assertRefactoringStatus(
         validateFunctionName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Function name must not start or end with a blank.");
   }
 
@@ -353,7 +354,7 @@
   void test_validateFunctionTypeAliasName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("newName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage:
             "Function type alias name should start with an uppercase letter.");
   }
@@ -361,14 +362,14 @@
   void test_validateFunctionTypeAliasName_empty() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function type alias name must not be empty.");
   }
 
   void test_validateFunctionTypeAliasName_leadingBlanks() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName(" NewName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Function type alias name must not start or end with a blank.");
   }
@@ -376,14 +377,14 @@
   void test_validateFunctionTypeAliasName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("New-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Function type alias name must not contain '-'.");
   }
 
   void test_validateFunctionTypeAliasName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("-NewName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Function type alias name must begin with an uppercase letter or underscore.");
   }
@@ -391,14 +392,14 @@
   void test_validateFunctionTypeAliasName_null() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function type alias name must not be null.");
   }
 
   void test_validateFunctionTypeAliasName_trailingBlanks() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("NewName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Function type alias name must not start or end with a blank.");
   }
@@ -418,7 +419,7 @@
   void test_validateImportPrefixName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateImportPrefixName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Import prefix name should start with a lowercase letter.");
   }
 
@@ -429,21 +430,21 @@
   void test_validateImportPrefixName_leadingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Import prefix name must not start or end with a blank.");
   }
 
   void test_validateImportPrefixName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateImportPrefixName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Import prefix name must not contain '-'.");
   }
 
   void test_validateImportPrefixName_notIdentifierStart() {
     assertRefactoringStatus(
         validateImportPrefixName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Import prefix name must begin with a lowercase letter or underscore.");
   }
@@ -451,14 +452,14 @@
   void test_validateImportPrefixName_null() {
     assertRefactoringStatus(
         validateImportPrefixName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not be null.");
   }
 
   void test_validateImportPrefixName_trailingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Import prefix name must not start or end with a blank.");
   }
 
@@ -473,29 +474,29 @@
   void test_validateLibraryName_blank() {
     assertRefactoringStatus(
         validateLibraryName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name must not be blank.");
     assertRefactoringStatus(
         validateLibraryName(" "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name must not be blank.");
   }
 
   void test_validateLibraryName_blank_identifier() {
     assertRefactoringStatus(
         validateLibraryName("my..name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not be empty.");
     assertRefactoringStatus(
         validateLibraryName("my. .name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
   void test_validateLibraryName_hasUpperCase() {
     assertRefactoringStatus(
         validateLibraryName("my.newName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage:
             "Library name should consist of lowercase identifier separated by dots.");
   }
@@ -503,21 +504,21 @@
   void test_validateLibraryName_leadingBlanks() {
     assertRefactoringStatus(
         validateLibraryName("my. name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
   void test_validateLibraryName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateLibraryName("my.ba-d.name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Library name identifier must not contain '-'.");
   }
 
   void test_validateLibraryName_notIdentifierStart() {
     assertRefactoringStatus(
         validateLibraryName("my.2bad.name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Library name identifier must begin with a lowercase letter or underscore.");
   }
@@ -525,14 +526,14 @@
   void test_validateLibraryName_null() {
     assertRefactoringStatus(
         validateLibraryName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name must not be null.");
   }
 
   void test_validateLibraryName_trailingBlanks() {
     assertRefactoringStatus(
         validateLibraryName("my.bad .name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
@@ -551,35 +552,35 @@
   void test_validateMethodName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateMethodName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Method name should start with a lowercase letter.");
   }
 
   void test_validateMethodName_empty() {
     assertRefactoringStatus(
         validateMethodName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not be empty.");
   }
 
   void test_validateMethodName_leadingBlanks() {
     assertRefactoringStatus(
         validateMethodName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Method name must not start or end with a blank.");
   }
 
   void test_validateMethodName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateMethodName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Method name must not contain '-'.");
   }
 
   void test_validateMethodName_notIdentifierStart() {
     assertRefactoringStatus(
         validateMethodName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Method name must begin with a lowercase letter or underscore.");
   }
@@ -587,14 +588,14 @@
   void test_validateMethodName_null() {
     assertRefactoringStatus(
         validateMethodName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not be null.");
   }
 
   void test_validateMethodName_trailingBlanks() {
     assertRefactoringStatus(
         validateMethodName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Method name must not start or end with a blank.");
   }
 
@@ -613,35 +614,35 @@
   void test_validateParameterName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateParameterName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Parameter name should start with a lowercase letter.");
   }
 
   void test_validateParameterName_empty() {
     assertRefactoringStatus(
         validateParameterName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not be empty.");
   }
 
   void test_validateParameterName_leadingBlanks() {
     assertRefactoringStatus(
         validateParameterName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Parameter name must not start or end with a blank.");
   }
 
   void test_validateParameterName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateParameterName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Parameter name must not contain '-'.");
   }
 
   void test_validateParameterName_notIdentifierStart() {
     assertRefactoringStatus(
         validateParameterName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Parameter name must begin with a lowercase letter or underscore.");
   }
@@ -649,14 +650,14 @@
   void test_validateParameterName_null() {
     assertRefactoringStatus(
         validateParameterName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not be null.");
   }
 
   void test_validateParameterName_trailingBlanks() {
     assertRefactoringStatus(
         validateParameterName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Parameter name must not start or end with a blank.");
   }
 
@@ -679,35 +680,35 @@
   void test_validateVariableName_doesNotStartWithLowerCase() {
     assertRefactoringStatus(
         validateVariableName("NewName"),
-        RefactoringStatusSeverity.WARNING,
+        RefactoringProblemSeverity.WARNING,
         expectedMessage: "Variable name should start with a lowercase letter.");
   }
 
   void test_validateVariableName_empty() {
     assertRefactoringStatus(
         validateVariableName(""),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not be empty.");
   }
 
   void test_validateVariableName_leadingBlanks() {
     assertRefactoringStatus(
         validateVariableName(" newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Variable name must not start or end with a blank.");
   }
 
   void test_validateVariableName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateVariableName("new-Name"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Variable name must not contain '-'.");
   }
 
   void test_validateVariableName_notIdentifierStart() {
     assertRefactoringStatus(
         validateVariableName("2newName"),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage:
             "Variable name must begin with a lowercase letter or underscore.");
   }
@@ -715,14 +716,14 @@
   void test_validateVariableName_null() {
     assertRefactoringStatus(
         validateVariableName(null),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not be null.");
   }
 
   void test_validateVariableName_trailingBlanks() {
     assertRefactoringStatus(
         validateVariableName("newName "),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.ERROR,
         expectedMessage: "Variable name must not start or end with a blank.");
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
new file mode 100644
index 0000000..a587410
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -0,0 +1,734 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.rename_class_member;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_rename.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(RenameClassMemberTest);
+}
+
+
+@ReflectiveTestCase()
+class RenameClassMemberTest extends RenameRefactoringTest {
+  test_checkFinalConditions_OK_noShadow() {
+    indexTestUnit('''
+class A {
+  int newName;
+}
+class B {
+  test() {}
+}
+class C extends A {
+  main() {
+    print(newName);
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_hasMember_MethodElement() {
+    indexTestUnit('''
+class A {
+  test() {}
+  newName() {} // existing
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Class 'A' already declares method with name 'newName'.",
+          expectedContextSearch: 'newName() {} // existing');
+    });
+  }
+
+  test_checkFinalConditions_shadowed_byLocal_OK_qualifiedReference() {
+    indexTestUnit('''
+class A {
+  test() {}
+  main() {
+    var newName;
+    this.test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_shadowed_byLocal_OK_renamedNotUsed() {
+    indexTestUnit('''
+class A {
+  test() {}
+  main() {
+    var newName;
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_shadowed_byLocal_inSameClass() {
+    indexTestUnit('''
+class A {
+  test() {}
+  main() {
+    var newName;
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage:
+              "Usage of renamed method will be shadowed by local variable 'newName'.",
+          expectedContextSearch: 'test(); // marker');
+    });
+  }
+
+  test_checkFinalConditions_shadowed_byLocal_inSubClass() {
+    indexTestUnit('''
+class A {
+  test() {}
+}
+class B extends A {
+  main() {
+    var newName;
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage:
+              "Usage of renamed method will be shadowed by local variable 'newName'.",
+          expectedContextSearch: 'test(); // marker');
+    });
+  }
+
+  test_checkFinalConditions_shadowed_byParameter_inSameClass() {
+    indexTestUnit('''
+class A {
+  test() {}
+  main(newName) {
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage:
+              "Usage of renamed method will be shadowed by parameter 'newName'.",
+          expectedContextSearch: 'test(); // marker');
+    });
+  }
+
+  test_checkFinalConditions_shadowed_inSubClass() {
+    indexTestUnit('''
+class A {
+  newName() {} // marker
+}
+class B extends A {
+  test() {}
+  main() {
+    newName();
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Renamed method will shadow method 'A.newName'.",
+          expectedContextSearch: 'newName() {} // marker');
+    });
+  }
+
+  test_checkFinalConditions_shadowsSuper_MethodElement() {
+    indexTestUnit('''
+class A {
+  test() {}
+}
+class B extends A {
+  newName() {} // marker
+  main() {
+    test();
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Renamed method will be shadowed by method 'B.newName'.",
+          expectedContextSearch: 'newName() {} // marker');
+    });
+  }
+
+  test_checkFinalConditions_shadowsSuper_inSubClass_FieldElement() {
+    indexTestUnit('''
+class A {
+  int newName; // marker
+}
+class B extends A {
+  test() {}
+}
+class C extends B {
+  main() {
+    print(newName);
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Renamed method will shadow field 'A.newName'.",
+          expectedContextSearch: 'newName; // marker');
+    });
+  }
+
+  test_checkInitialConditions_operator() {
+    indexTestUnit('''
+class A {
+  operator -(other) => this;
+}
+''');
+    createRenameRefactoringAtString('-(other)');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+    });
+  }
+
+  test_checkNewName_FieldElement() {
+    indexTestUnit('''
+class A {
+  int test;
+}
+''');
+    createRenameRefactoringAtString('test;');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Field name must not be null.");
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_FieldElement_const() {
+    indexTestUnit('''
+class A {
+  static const int TEST = 0;
+}
+''');
+    createRenameRefactoringAtString('TEST =');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Constant name must not be null.");
+    // not upper case
+    refactoring.newName = 'newName';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.WARNING);
+    // OK
+    refactoring.newName = 'NEW_NAME';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_MethodElement() {
+    indexTestUnit('''
+class A {
+  test() {}
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Method name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Method name must not be empty.");
+    // same
+    refactoring.newName = 'test';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "The new name must be different than the current name.");
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_createChange_FieldElement() {
+    indexTestUnit('''
+class A {
+  int test; // marker
+  main() {
+    print(test);
+    test = 1;
+    test += 2;
+  }
+}
+class B extends A {
+}
+class C extends B {
+  get test => 1;
+  set test(x) {}
+}
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+  print(a.test);
+  a.test = 1;
+  a.test += 2;
+  print(b.test);
+  b.test = 1;
+  print(c.test);
+  c.test = 1;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test; // marker');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  int newName; // marker
+  main() {
+    print(newName);
+    newName = 1;
+    newName += 2;
+  }
+}
+class B extends A {
+}
+class C extends B {
+  get newName => 1;
+  set newName(x) {}
+}
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+  print(a.newName);
+  a.newName = 1;
+  a.newName += 2;
+  print(b.newName);
+  b.newName = 1;
+  print(c.newName);
+  c.newName = 1;
+}
+''');
+  }
+
+  test_createChange_FieldElement_constructorFieldInitializer() {
+    indexTestUnit('''
+class A {
+  final test;
+  A() : test = 5;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  final newName;
+  A() : newName = 5;
+}
+''');
+  }
+
+  test_createChange_FieldElement_fieldFormalParameter() {
+    indexTestUnit('''
+class A {
+  final test;
+  A(this.test);
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  final newName;
+  A(this.newName);
+}
+''');
+  }
+
+  test_createChange_FieldElement_invocation() {
+    indexTestUnit('''
+typedef F(a);
+class A {
+  F test;
+  main() {
+    test(1);
+  }
+}
+main() {
+  A a = new A();
+  a.test(2);
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test(2);');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+typedef F(a);
+class A {
+  F newName;
+  main() {
+    newName(1);
+  }
+}
+main() {
+  A a = new A();
+  a.newName(2);
+}
+''');
+  }
+
+  test_createChange_MethodElement() {
+    indexTestUnit('''
+class A {
+  test() {}
+}
+class B extends A {
+  test() {} // marker
+}
+class C extends B {
+  test() {}
+}
+class D implements A {
+  test() {}
+}
+class E {
+  test() {}
+}
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+  D d = new D();
+  E e = new E();
+  a.test();
+  b.test();
+  c.test();
+  d.test();
+  e.test();
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {} // marker');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  newName() {}
+}
+class B extends A {
+  newName() {} // marker
+}
+class C extends B {
+  newName() {}
+}
+class D implements A {
+  newName() {}
+}
+class E {
+  test() {}
+}
+main() {
+  A a = new A();
+  B b = new B();
+  C c = new C();
+  D d = new D();
+  E e = new E();
+  a.newName();
+  b.newName();
+  c.newName();
+  d.newName();
+  e.test();
+}
+''');
+  }
+
+  test_createChange_MethodElement_potential() {
+    indexTestUnit('''
+class A {
+  test() {}
+}
+main(var a) {
+  a.test(); // 1
+  new A().test();
+  a.test(); // 2
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {}');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  newName() {}
+}
+main(var a) {
+  a.newName(); // 1
+  new A().newName();
+  a.newName(); // 2
+}
+''').then((_) {
+      assertPotentialEdits(['test(); // 1', 'test(); // 2']);
+    });
+  }
+
+  test_createChange_MethodElement_potential_private_otherLibrary() {
+    indexUnit('/lib.dart', '''
+library lib;
+main(p) {
+  p._test();
+}
+''');
+    indexTestUnit('''
+class A {
+  _test() {}
+}
+main(var a) {
+  a._test();
+  new A()._test();
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('_test() {}');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.oldName, '_test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  newName() {}
+}
+main(var a) {
+  a.newName();
+  new A().newName();
+}
+''').then((_) {
+      assertNoFileChange('/lib.dart');
+    });
+  }
+
+  test_createChange_PropertyAccessorElement_getter() {
+    indexTestUnit('''
+class A {
+  get test {} // marker
+  set test(x) {}
+  main() {
+    print(test);
+    test = 1;
+  }
+}
+class B extends A {
+  get test {}
+  set test(x) {}
+}
+main() {
+  A a = new A();
+  print(a.test);
+  a.test = 2;
+
+  B b = new B();
+  print(b.test);
+  b.test = 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test {} // marker');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  get newName {} // marker
+  set newName(x) {}
+  main() {
+    print(newName);
+    newName = 1;
+  }
+}
+class B extends A {
+  get newName {}
+  set newName(x) {}
+}
+main() {
+  A a = new A();
+  print(a.newName);
+  a.newName = 2;
+
+  B b = new B();
+  print(b.newName);
+  b.newName = 2;
+}
+''');
+  }
+
+  test_createChange_PropertyAccessorElement_setter() {
+    indexTestUnit('''
+class A {
+  get test {}
+  set test(x) {} // marker
+  main() {
+    print(test);
+    test = 1;
+  }
+}
+class B extends A {
+  get test {}
+  set test(x) {}
+}
+main() {
+  A a = new A();
+  print(a.test);
+  a.test = 2;
+
+  B b = new B();
+  print(b.test);
+  b.test = 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test(x) {} // marker');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {
+  get newName {}
+  set newName(x) {} // marker
+  main() {
+    print(newName);
+    newName = 1;
+  }
+}
+class B extends A {
+  get newName {}
+  set newName(x) {}
+}
+main() {
+  A a = new A();
+  print(a.newName);
+  a.newName = 2;
+
+  B b = new B();
+  print(b.newName);
+  b.newName = 2;
+}
+''');
+  }
+
+  test_createChange_TypeParameterElement() {
+    indexTestUnit('''
+class A<Test> {
+  Test field;
+  List<Test> items;
+  Test method(Test p) => null;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('Test> {');
+    expect(refactoring.refactoringName, 'Rename Type Parameter');
+    expect(refactoring.oldName, 'Test');
+    refactoring.newName = 'NewName';
+    // validate change
+    return assertSuccessfulRename('''
+class A<NewName> {
+  NewName field;
+  List<NewName> items;
+  NewName method(NewName p) => null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
new file mode 100644
index 0000000..71a7ace
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.rename_constructor;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_rename.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(RenameConstructorTest);
+}
+
+
+@ReflectiveTestCase()
+class RenameConstructorTest extends RenameRefactoringTest {
+  test_checkFinalConditions_hasMember_constructor() {
+    indexTestUnit('''
+class A {
+  A.test() {}
+  A.newName() {} // existing
+}
+''');
+    _createConstructorDeclarationRefactoring('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Class 'A' already declares constructor with name 'newName'.",
+          expectedContextSearch: 'newName() {} // existing');
+    });
+  }
+
+  test_checkFinalConditions_hasMember_method() {
+    indexTestUnit('''
+class A {
+  A.test() {}
+  newName() {} // existing
+}
+''');
+    _createConstructorDeclarationRefactoring('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Class 'A' already declares method with name 'newName'.",
+          expectedContextSearch: 'newName() {} // existing');
+    });
+  }
+
+  test_checkNewName() {
+    indexTestUnit('''
+class A {
+  A.test() {}
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    expect(refactoring.oldName, 'test');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Constructor name must not be null.");
+    // same
+    refactoring.newName = 'test';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "The new name must be different than the current name.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_createChange_add() {
+    indexTestUnit('''
+class A {
+  A() {} // marker
+}
+class B extends A {
+  B() : super() {}
+  factory B._() = A;
+}
+main() {
+  new A();
+}
+''');
+    // configure refactoring
+    _createConstructorDeclarationRefactoring('() {} // marker');
+    expect(refactoring.refactoringName, 'Rename Constructor');
+    expect(refactoring.oldName, '');
+    // validate change
+    refactoring.newName = 'newName';
+    return assertSuccessfulRename('''
+class A {
+  A.newName() {} // marker
+}
+class B extends A {
+  B() : super.newName() {}
+  factory B._() = A.newName;
+}
+main() {
+  new A.newName();
+}
+''');
+  }
+
+  test_createChange_change() {
+    indexTestUnit('''
+class A {
+  A.test() {} // marker
+}
+class B extends A {
+  B() : super.test() {}
+  factory B._() = A.test;
+}
+main() {
+  new A.test();
+}
+''');
+    // configure refactoring
+    _createConstructorDeclarationRefactoring('test() {} // marker');
+    expect(refactoring.refactoringName, 'Rename Constructor');
+    expect(refactoring.oldName, 'test');
+    // validate change
+    refactoring.newName = 'newName';
+    return assertSuccessfulRename('''
+class A {
+  A.newName() {} // marker
+}
+class B extends A {
+  B() : super.newName() {}
+  factory B._() = A.newName;
+}
+main() {
+  new A.newName();
+}
+''');
+  }
+
+  test_createChange_remove() {
+    indexTestUnit('''
+class A {
+  A.test() {} // marker
+}
+class B extends A {
+  B() : super.test() {}
+  factory B._() = A.test;
+}
+main() {
+  new A.test();
+}
+''');
+    // configure refactoring
+    _createConstructorDeclarationRefactoring('test() {} // marker');
+    expect(refactoring.refactoringName, 'Rename Constructor');
+    expect(refactoring.oldName, 'test');
+    // validate change
+    refactoring.newName = '';
+    return assertSuccessfulRename('''
+class A {
+  A() {} // marker
+}
+class B extends A {
+  B() : super() {}
+  factory B._() = A;
+}
+main() {
+  new A();
+}
+''');
+  }
+
+  void _createConstructorDeclarationRefactoring(String search) {
+    ConstructorElement element =
+        findNodeElementAtString(search, (node) => node is ConstructorDeclaration);
+    createRenameRefactoringForElement(element);
+  }
+}
diff --git a/pkg/analysis_services/test/refactoring/rename_import_test.dart b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
similarity index 83%
rename from pkg/analysis_services/test/refactoring/rename_import_test.dart
rename to pkg/analysis_server/test/services/refactoring/rename_import_test.dart
index 1374c55..b1d1a21 100644
--- a/pkg/analysis_services/test/refactoring/rename_import_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.refactoring.rename_import;
 
-import 'package:analysis_services/correction/status.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:unittest/unittest.dart';
@@ -28,13 +28,13 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not be null.");
     // same
     refactoring.newName = 'test';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.FATAL,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "The new name must be different than the current name.");
     // empty
     refactoring.newName = '';
@@ -118,6 +118,33 @@
 ''');
   }
 
+  test_createChange_change_onPrefixElement() {
+    indexTestUnit('''
+import 'dart:async' as test;
+import 'dart:math' as test;
+main() {
+  test.Future f;
+  test.PI;
+  test.E;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test.PI');
+    expect(refactoring.refactoringName, 'Rename Import Prefix');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+import 'dart:async' as test;
+import 'dart:math' as newName;
+main() {
+  test.Future f;
+  newName.PI;
+  newName.E;
+}
+''');
+  }
+
   test_createChange_remove() {
     indexTestUnit('''
 import 'dart:math' as test;
diff --git a/pkg/analysis_services/test/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
similarity index 91%
rename from pkg/analysis_services/test/refactoring/rename_library_test.dart
rename to pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index de0a438..e42ec41 100644
--- a/pkg/analysis_services/test/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.refactoring.rename_library;
 
-import 'package:analysis_services/correction/status.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
@@ -30,19 +30,19 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name must not be null.");
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name must not be blank.");
     // same name
     refactoring.newName = 'my.app';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.FATAL,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "The new name must be different than the current name.");
   }
 
diff --git a/pkg/analysis_services/test/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
similarity index 94%
rename from pkg/analysis_services/test/refactoring/rename_local_test.dart
rename to pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 5947a56..ea11b18 100644
--- a/pkg/analysis_services/test/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.refactoring.rename_local;
 
-import 'package:analysis_services/correction/status.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
@@ -32,7 +32,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedMessage: "Duplicate function 'newName'.",
           expectedContextSearch: 'newName() => 1');
     });
@@ -51,7 +51,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedMessage: "Duplicate function 'newName'.");
     });
   }
@@ -69,7 +69,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedMessage: "Duplicate local variable 'newName'.",
           expectedContextSearch: 'newName = 1;');
     });
@@ -88,7 +88,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedMessage: "Duplicate local variable 'newName'.",
           expectedContextSearch: 'newName = 1;');
     });
@@ -142,7 +142,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedMessage: 'Usage of field "A.newName" declared in "test.dart" '
               'will be shadowed by renamed local variable.',
           expectedContextSearch: 'newName);');
@@ -179,7 +179,7 @@
     return refactoring.checkFinalConditions().then((status) {
       assertRefactoringStatus(
           status,
-          RefactoringStatusSeverity.ERROR,
+          RefactoringProblemSeverity.ERROR,
           expectedContextSearch: 'newName(); // ref');
     });
   }
@@ -195,7 +195,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not be null.");
     // OK
     refactoring.newName = 'newName';
@@ -213,13 +213,13 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not be null.");
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not be empty.");
     // OK
     refactoring.newName = 'newName';
@@ -237,19 +237,19 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not be null.");
     // empty
     refactoring.newName = '';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not be empty.");
     // same
     refactoring.newName = 'TEST';
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.FATAL,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "The new name must be different than the current name.");
     // OK
     refactoring.newName = 'NEW_NAME';
@@ -266,7 +266,7 @@
     refactoring.newName = null;
     assertRefactoringStatus(
         refactoring.checkNewName(),
-        RefactoringStatusSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not be null.");
     // OK
     refactoring.newName = 'newName';
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
new file mode 100644
index 0000000..11a617d
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -0,0 +1,521 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.rename_unit_member;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_rename.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(RenameUnitMemberTest);
+}
+
+
+@ReflectiveTestCase()
+class RenameUnitMemberTest extends RenameRefactoringTest {
+  test_checkFinalConditions_OK_qualifiedSuper_MethodElement() {
+    indexTestUnit('''
+class Test {}
+class A {
+  NewName() {}
+}
+class B extends A {
+  main() {
+    super.NewName(); // super-ref
+  }
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_hasTopLevel_ClassElement() {
+    indexTestUnit('''
+class Test {}
+class NewName {} // existing
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Library already declares class with name 'NewName'.",
+          expectedContextSearch: 'NewName {} // existing');
+    });
+  }
+
+  test_checkFinalConditions_hasTopLevel_FunctionTypeAliasElement() {
+    indexTestUnit('''
+class Test {}
+typedef NewName(); // existing
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage:
+              "Library already declares function type alias with name 'NewName'.",
+          expectedContextSearch: 'NewName(); // existing');
+    });
+  }
+
+  test_checkFinalConditions_shadowedBy_MethodElement() {
+    indexTestUnit('''
+class Test {}
+class A {
+  void NewName() {}
+  main() {
+    new Test();
+  }
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage:
+              "Reference to renamed class will be shadowed by method 'A.NewName'.",
+          expectedContextSearch: 'NewName() {}');
+    });
+  }
+
+  test_checkFinalConditions_shadowsInSubClass_MethodElement() {
+    indexTestUnit('''
+class Test {}
+class A {
+  NewName() {}
+}
+class B extends A {
+  main() {
+    NewName(); // super-ref
+  }
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Renamed class will shadow method 'A.NewName'.",
+          expectedContextSearch: 'NewName(); // super-ref');
+    });
+  }
+
+  test_checkFinalConditions_shadowsInSubClass_importedLib() {
+    indexTestUnit('''
+class Test {}
+''');
+    indexUnit('/lib.dart', '''
+library my.lib;
+import 'test.dart';
+class A {
+  NewName() {}
+}
+class B extends A {
+  main() {
+    NewName(); // super-ref
+  }",
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.ERROR,
+          expectedMessage: "Renamed class will shadow method 'A.NewName'.");
+    });
+  }
+
+  test_checkFinalConditions_shadowsInSubClass_importedLib_hideCombinator() {
+    indexTestUnit('''
+class Test {}
+''');
+    indexUnit('/lib.dart', '''
+library my.lib;
+import 'test.dart' hide Test;
+class A {
+  NewName() {}
+}
+class B extends A {
+  main() {
+    NewName(); // super-ref
+  }",
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_shadowsInSubClass_notImportedLib() {
+    indexTestUnit('''
+class Test {}
+''');
+    indexUnit('/lib.dart', '''
+library my.lib;
+class A {
+  NewName() {}
+}
+class B extends A {
+  main() {
+    NewName(); // super-ref
+  }",
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkFinalConditions_shadowsInSubClass_notSubClass() {
+    indexTestUnit('''
+class Test {}
+class A {
+  NewName() {}
+}
+class B {
+  main(A a) {
+    a.NewName();
+  }
+}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // check status
+    refactoring.newName = 'NewName';
+    return refactoring.checkFinalConditions().then((status) {
+      assertRefactoringStatusOK(status);
+    });
+  }
+
+  test_checkNewName_ClassElement() {
+    indexTestUnit('''
+class Test {}
+''');
+    createRenameRefactoringAtString('Test {}');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Class name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Class name must not be empty.");
+    // same
+    refactoring.newName = 'Test';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "The new name must be different than the current name.");
+    // OK
+    refactoring.newName = 'NewName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_FunctionElement() {
+    indexTestUnit('''
+test() {}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Function name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Function name must not be empty.");
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_FunctionTypeAliasElement() {
+    indexTestUnit('''
+typedef Test();
+''');
+    createRenameRefactoringAtString('Test();');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Function type alias name must not be null.");
+    // OK
+    refactoring.newName = 'NewName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_TopLevelVariableElement() {
+    indexTestUnit('''
+var test;
+''');
+    createRenameRefactoringAtString('test;');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Variable name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Variable name must not be empty.");
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_checkNewName_TopLevelVariableElement_const() {
+    indexTestUnit('''
+const TEST = 0;
+''');
+    createRenameRefactoringAtString('TEST =');
+    // null
+    refactoring.newName = null;
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Constant name must not be null.");
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(),
+        RefactoringProblemSeverity.FATAL,
+        expectedMessage: "Constant name must not be empty.");
+    // OK
+    refactoring.newName = 'NEW_NAME';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  test_createChange_ClassElement() {
+    indexTestUnit('''
+class Test implements Other {
+  Test() {}
+  Test.named() {}
+}
+class Other {
+  factory Other.a() = Test;
+  factory Other.b() = Test.named;
+}
+main() {
+  Test t1 = new Test();
+  Test t2 = new Test.named();
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('Test implements');
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.oldName, 'Test');
+    refactoring.newName = 'NewName';
+    // validate change
+    return assertSuccessfulRename('''
+class NewName implements Other {
+  NewName() {}
+  NewName.named() {}
+}
+class Other {
+  factory Other.a() = NewName;
+  factory Other.b() = NewName.named;
+}
+main() {
+  NewName t1 = new NewName();
+  NewName t2 = new NewName.named();
+}
+''');
+  }
+
+  test_createChange_ClassElement_parameterTypeNested() {
+    indexTestUnit('''
+class Test {
+}
+main(f(Test p)) {
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('Test {');
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.oldName, 'Test');
+    refactoring.newName = 'NewName';
+    // validate change
+    return assertSuccessfulRename('''
+class NewName {
+}
+main(f(NewName p)) {
+}
+''');
+  }
+
+  test_createChange_ClassElement_typeAlias() {
+    indexTestUnit('''
+class A {}
+class Test = Object with A;
+main(Test t) {
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('Test =');
+    expect(refactoring.refactoringName, 'Rename Class');
+    expect(refactoring.oldName, 'Test');
+    refactoring.newName = 'NewName';
+    // validate change
+    return assertSuccessfulRename('''
+class A {}
+class NewName = Object with A;
+main(NewName t) {
+}
+''');
+  }
+
+  test_createChange_FunctionElement() {
+    indexTestUnit('''
+test() {}
+foo() {}
+main() {
+  print(test);
+  print(test());
+  foo();
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {}');
+    expect(refactoring.refactoringName, 'Rename Top-Level Function');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+newName() {}
+foo() {}
+main() {
+  print(newName);
+  print(newName());
+  foo();
+}
+''');
+  }
+
+  test_createChange_PropertyAccessorElement_getter_declaration() {
+    return _test_createChange_PropertyAccessorElement("test {}");
+  }
+
+  test_createChange_PropertyAccessorElement_getter_usage() {
+    return _test_createChange_PropertyAccessorElement("test);");
+  }
+
+  test_createChange_PropertyAccessorElement_mix() {
+    return _test_createChange_PropertyAccessorElement("test += 2");
+  }
+
+  test_createChange_PropertyAccessorElement_setter_declaration() {
+    return _test_createChange_PropertyAccessorElement("test(x) {}");
+  }
+
+  test_createChange_PropertyAccessorElement_setter_usage() {
+    return _test_createChange_PropertyAccessorElement("test = 1");
+  }
+
+  test_createChange_TopLevelVariableElement_field() {
+    return _test_createChange_TopLevelVariableElement("test = 0");
+  }
+
+  test_createChange_TopLevelVariableElement_getter() {
+    return _test_createChange_TopLevelVariableElement("test);");
+  }
+
+  test_createChange_TopLevelVariableElement_mix() {
+    return _test_createChange_TopLevelVariableElement("test += 2");
+  }
+
+  test_createChange_TopLevelVariableElement_setter() {
+    return _test_createChange_TopLevelVariableElement("test = 1");
+  }
+
+  _test_createChange_PropertyAccessorElement(String search) {
+    indexTestUnit('''
+get test {}
+set test(x) {}
+main() {
+  print(test);
+  test = 1;
+  test += 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString(search);
+    expect(refactoring.refactoringName, 'Rename Top-Level Variable');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+get newName {}
+set newName(x) {}
+main() {
+  print(newName);
+  newName = 1;
+  newName += 2;
+}
+''');
+  }
+
+  _test_createChange_TopLevelVariableElement(String search) {
+    indexTestUnit('''
+int test = 0;
+main() {
+  print(test);
+  test = 1;
+  test += 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString(search);
+    expect(refactoring.refactoringName, 'Rename Top-Level Variable');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRename('''
+int newName = 0;
+main() {
+  print(newName);
+  newName = 1;
+  newName += 2;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/test_all.dart b/pkg/analysis_server/test/services/refactoring/test_all.dart
new file mode 100644
index 0000000..a4fbb4b
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/test_all.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring;
+
+import 'package:unittest/unittest.dart';
+
+import 'extract_local_test.dart' as extract_local_test;
+import 'extract_method_test.dart' as extract_method_test;
+import 'naming_conventions_test.dart' as naming_conventions_test;
+import 'rename_class_member_test.dart' as rename_class_member_test;
+import 'rename_constructor_test.dart' as rename_constructor_test;
+import 'rename_import_test.dart' as rename_import_test;
+import 'rename_library_test.dart' as rename_library_test;
+import 'rename_local_test.dart' as rename_local_test;
+import 'rename_unit_member_test.dart' as rename_unit_member_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('refactoring', () {
+    extract_local_test.main();
+    extract_method_test.main();
+    naming_conventions_test.main();
+    rename_class_member_test.main();
+    rename_constructor_test.main();
+    rename_import_test.main();
+    rename_library_test.main();
+    rename_local_test.main();
+    rename_unit_member_test.main();
+  });
+}
diff --git a/pkg/analysis_services/test/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
similarity index 96%
rename from pkg/analysis_services/test/search/hierarchy_test.dart
rename to pkg/analysis_server/test/services/search/hierarchy_test.dart
index aea5f89..aa5ccfe 100644
--- a/pkg/analysis_services/test/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -6,10 +6,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/search/hierarchy.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:analyzer/src/generated/element.dart';
diff --git a/pkg/analysis_services/test/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
similarity index 94%
rename from pkg/analysis_services/test/search/search_engine_test.dart
rename to pkg/analysis_server/test/services/search/search_engine_test.dart
index c60f00d..e4adc70 100644
--- a/pkg/analysis_services/test/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -6,10 +6,10 @@
 
 import 'dart:async';
 
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_testing/abstract_single_unit.dart';
 import 'package:analysis_testing/mocks.dart';
 import 'package:analysis_testing/reflective_tests.dart';
@@ -94,38 +94,53 @@
   Index index;
   SearchEngineImpl searchEngine;
 
-//  void mockLocation(Element element, Relationship relationship,
-//      Location location) {
-//    mockLocations(element, relationship, [location]);
-//  }
-//
-//  void mockLocations(Element element, Relationship relationship,
-//      List<Location> locations) {
-//    index.getRelationships(element, relationship);
-//    when(null).thenReturn(new Future.value(locations));
-//  }
-
   void setUp() {
     super.setUp();
     index = createLocalMemoryIndex();
     searchEngine = new SearchEngineImpl(index);
   }
 
+  Future test_searchElementDeclarations() {
+    _indexTestUnit('''
+class A {
+  test() {}
+}
+class B {
+  int test = 1;
+  main() {
+    int test = 2;
+  }
+}
+''');
+    ClassElement elementA = findElement('A');
+    ClassElement elementB = findElement('B');
+    Element element_test = findElement('test', ElementKind.LOCAL_VARIABLE);
+    var expected = [
+        _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
+        _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;'),
+        _expectId(element_test, MatchKind.DECLARATION, 'test = 2;'),];
+    return searchEngine.searchElementDeclarations('test').then((matches) {
+      _assertMatches(matches, expected);
+    });
+  }
+
   Future test_searchMemberDeclarations() {
     _indexTestUnit('''
 class A {
   test() {}
 }
 class B {
-  int test = 42;
+  int test = 1;
+  main() {
+    int test = 2;
+  }
 }
 ''');
-    NameElement element = new NameElement('test');
     ClassElement elementA = findElement('A');
     ClassElement elementB = findElement('B');
     var expected = [
         _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
-        _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 42;')];
+        _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;')];
     return searchEngine.searchMemberDeclarations('test').then((matches) {
       _assertMatches(matches, expected);
     });
@@ -287,8 +302,7 @@
         _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
         _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
         _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
-        _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
-        ];
+        _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),];
     return _verifyReferences(element, expected);
   }
 
@@ -531,8 +545,7 @@
         _expectId(main, MatchKind.INVOCATION, 'V(); // q'),
         _expectId(main, MatchKind.WRITE, 'V = 1; // nq'),
         _expectId(main, MatchKind.READ, 'V); // nq'),
-        _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),
-        ];
+        _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),];
     return _verifyReferences(variable, expected);
   }
 
diff --git a/pkg/analysis_services/test/search/test_all.dart b/pkg/analysis_server/test/services/search/test_all.dart
similarity index 100%
rename from pkg/analysis_services/test/search/test_all.dart
rename to pkg/analysis_server/test/services/search/test_all.dart
diff --git a/pkg/analysis_services/test/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
similarity index 96%
rename from pkg/analysis_services/test/test_all.dart
rename to pkg/analysis_server/test/services/test_all.dart
index 170b39a..fcc4f1ca 100644
--- a/pkg/analysis_services/test/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library test.services;
+
 import 'package:unittest/unittest.dart';
 
 import 'completion/test_all.dart' as completion_all;
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 4f39c6a..4ba4979 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -30,9 +30,8 @@
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
     expect(channel.notificationsReceived[0].event, SERVER_CONNECTED);
-    expect(channel.notificationsReceived[0].params, isEmpty);
     return channel.sendRequest(
-        new Request('0', SERVER_SHUTDOWN)
+        new ServerShutdownParams().toRequest('0')
     ).then((Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNull);
@@ -46,7 +45,6 @@
     MockServerChannel channel2 = new MockServerChannel();
     server.createAnalysisServer(channel1);
     expect(channel1.notificationsReceived[0].event, SERVER_CONNECTED);
-    expect(channel1.notificationsReceived[0].params, isEmpty);
     server.createAnalysisServer(channel2);
     channel1.expectMsgCount(notificationCount: 1);
     channel2.expectMsgCount(responseCount: 1);
@@ -54,7 +52,8 @@
     expect(channel2.responsesReceived[0].error, isNotNull);
     expect(channel2.responsesReceived[0].error.code, equals(
         RequestError.CODE_SERVER_ALREADY_STARTED));
-    channel2.sendRequest(new Request('0', SERVER_SHUTDOWN)).then((Response response) {
+    channel2.sendRequest(new ServerShutdownParams().toRequest('0')).then(
+        (Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNotNull);
       expect(response.error.code, equals(
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 1526889..3ef7993 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -23,6 +23,7 @@
 import 'package_map_provider_test.dart' as package_map_provider_test;
 import 'protocol_test.dart' as protocol_test;
 import 'search/test_all.dart' as search_all;
+import 'services/test_all.dart' as services_all;
 import 'socket_server_test.dart' as socket_server_test;
 
 /**
@@ -50,6 +51,7 @@
     package_map_provider_test.main();
     protocol_test.main();
     search_all.main();
+    services_all.main();
     socket_server_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/tool/spec/api.dart b/pkg/analysis_server/tool/spec/api.dart
index 5b70f14..0c660a7 100644
--- a/pkg/analysis_server/tool/spec/api.dart
+++ b/pkg/analysis_server/tool/spec/api.dart
@@ -17,6 +17,7 @@
  */
 abstract class ApiVisitor<T> {
   T visitTypeReference(TypeReference typeReference);
+  T visitTypeUnion(TypeUnion typeUnion);
   T visitTypeObject(TypeObject typeObject);
   T visitTypeList(TypeList typeList);
   T visitTypeMap(TypeMap typeMap);
@@ -118,6 +119,11 @@
   void visitTypeReference(TypeReference typeReference) {
   }
 
+  @override
+  void visitTypeUnion(TypeUnion typeUnion) {
+    typeUnion.choices.forEach(visitTypeDecl);
+  }
+
   /**
    * If [type] is a [TypeReference] that is defined in the API, follow the
    * chain until a non-[TypeReference] is found, if possible.
@@ -366,6 +372,22 @@
 }
 
 /**
+ * Type which represents a union among multiple choices.
+ */
+class TypeUnion extends TypeDecl {
+  final List<TypeDecl> choices;
+
+  /**
+   * The field that is used to disambiguate this union
+   */
+  final String field;
+
+  TypeUnion(this.choices, this.field, dom.Element html) : super(html);
+
+  accept(ApiVisitor visitor) => visitor.visitTypeUnion(this);
+}
+
+/**
  * Type of a JSON object with specified fields, some of which may be optional.
  */
 class TypeObject extends TypeDecl {
@@ -374,6 +396,18 @@
   TypeObject(this.fields, dom.Element html) : super(html);
 
   accept(ApiVisitor visitor) => visitor.visitTypeObject(this);
+
+  /**
+   * Return the field with the given [name], or null if there is no such field.
+   */
+  TypeObjectField getField(String name) {
+    for (TypeObjectField field in fields) {
+      if (field.name == name) {
+        return field;
+      }
+    }
+    return null;
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/tool/spec/check_all_test.dart b/pkg/analysis_server/tool/spec/check_all_test.dart
new file mode 100644
index 0000000..f068f42
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/check_all_test.dart
@@ -0,0 +1,42 @@
+// 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 check.all;
+
+import 'dart:io';
+
+import 'package:path/path.dart';
+
+import 'codegen_tools.dart';
+import 'generate_all.dart';
+
+/**
+ * Check that all targets have been code generated.  If they haven't tell the
+ * user to run generate_all.dart.
+ */
+main() {
+  String script = Platform.script.toFilePath(windows: Platform.isWindows);
+  Directory.current = new Directory(dirname(script));
+  bool generateAllNeeded = false;
+  for (GeneratedContent generatedContent in allTargets) {
+    if (!generatedContent.check()) {
+      print(
+          '${generatedContent.outputFile.absolute} does not have expected contents.');
+      generateAllNeeded = true;
+    }
+  }
+  if (generateAllNeeded) {
+    print('Please regenerate using:');
+    String executable = Platform.executable;
+    String packageRoot = '';
+    if (Platform.packageRoot.isNotEmpty) {
+      packageRoot = ' --package-root=${Platform.packageRoot}';
+    }
+    String generateScript = join(dirname(script), 'generate_all.dart');
+    print('  $executable$packageRoot $generateScript');
+    exit(1);
+  } else {
+    print('All generated files up to date.');
+  }
+}
diff --git a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
index cab7c03..4cd81a9 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -5,12 +5,11 @@
 /**
  * Code generation for the file "AnalysisServer.java".
  */
-library server.generator.java;
+library java.generator.server;
 
 import 'api.dart';
 import 'codegen_java.dart';
 import 'codegen_tools.dart';
-import 'from_html.dart';
 
 class CodegenAnalysisServer extends CodegenJavaVisitor {
   CodegenAnalysisServer(Api api) : super(api);
@@ -20,52 +19,64 @@
     outputHeader(javaStyle: true);
     writeln('package com.google.dart.server;');
     writeln();
+    writeln('import com.google.dart.server.generated.types.*;');
+    writeln();
     writeln('import java.util.List;');
     writeln('import java.util.Map;');
     writeln();
-    writeln('''/**
+    writeln(
+        '''/**
  * The interface {@code AnalysisServer} defines the behavior of objects that interface to an
  * analysis server.
  * 
  * @coverage dart.server
- */''');
+ */'''
+        );
     makeClass('public interface AnalysisServer', () {
       //
       // addAnalysisServerListener(..)
       //
       publicMethod('addAnalysisServerListener', () {
-        writeln('''/**
+        writeln(
+            '''/**
  * Add the given listener to the list of listeners that will receive notification when new
  * analysis results become available.
  * 
  * @param listener the listener to be added
- */''');
-        writeln('public void addAnalysisServerListener(AnalysisServerListener listener);');
+ */'''
+            );
+        writeln(
+            'public void addAnalysisServerListener(AnalysisServerListener listener);');
       });
 
       //
       // removeAnalysisServerListener(..)
       //
       publicMethod('removeAnalysisServerListener', () {
-        writeln('''/**
+        writeln(
+            '''/**
  * Remove the given listener from the list of listeners that will receive notification when new
    * analysis results become available.
  * 
  * @param listener the listener to be removed
- */''');
-        writeln('public void removeAnalysisServerListener(AnalysisServerListener listener);');
+ */'''
+            );
+        writeln(
+            'public void removeAnalysisServerListener(AnalysisServerListener listener);');
       });
 
       //
       // start(..)
       //
       publicMethod('start', () {
-        writeln('''/**
+        writeln(
+            '''/**
  * Start the analysis server.
  * 
  * @param millisToRestart the number of milliseconds to wait for an unresponsive server before
  *          restarting it, or zero if the server should not be restarted.
- */''');
+ */'''
+            );
         writeln('public void start(long millisToRestart) throws Exception;');
       });
       super.visitApi();
@@ -100,13 +111,17 @@
    * Get the name of the consumer class for responses to this request.
    */
   String consumerName(Request request) {
-    return camelJoin([request.method, 'consumer'], capitalize: true);
+    return camelJoin([request.method, 'consumer'], doCapitalize: true);
   }
 }
 
+final GeneratedFile target = javaGeneratedFile(
+    '../../../../editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/AnalysisServer.java',
+    (Api api) => new CodegenAnalysisServer(api));
+
 /**
  * Translate spec_input.html into AnalysisServer.java.
  */
 main() {
-  createJavaCode('../../../../editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/AnalysisServer.java', new CodegenAnalysisServer(readApi()));
+  target.generate();
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
new file mode 100644
index 0000000..2136f0d
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -0,0 +1,1275 @@
+// 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 codegen.protocol;
+
+import 'dart:convert';
+
+import 'api.dart';
+import 'codegen_tools.dart';
+import 'from_html.dart';
+import 'implied_types.dart';
+import 'to_html.dart';
+
+import 'package:html5lib/dom.dart' as dom;
+
+/**
+ * Container for code that can be used to translate a data type from JSON.
+ */
+abstract class FromJsonCode {
+  /**
+   * True if the data type is already in JSON form, so the translation is the
+   * identity function.
+   */
+  bool get isIdentity;
+
+  /**
+   * Get the translation code in the form of a closure.
+   */
+  String get asClosure;
+
+  /**
+   * Get the translation code in the form of a code snippet, where [jsonPath]
+   * is the variable holding the JSON path, and [json] is the variable holding
+   * the raw JSON.
+   */
+  String asSnippet(String jsonPath, String json);
+}
+
+/**
+ * Representation of FromJsonCode for a function defined elsewhere.
+ */
+class FromJsonFunction extends FromJsonCode {
+  final String asClosure;
+
+  FromJsonFunction(this.asClosure);
+
+  @override
+  bool get isIdentity => false;
+
+  @override
+  String asSnippet(String jsonPath, String json) =>
+      '$asClosure($jsonPath, $json)';
+}
+
+typedef String FromJsonSnippetCallback(String jsonPath, String json);
+
+/**
+ * Representation of FromJsonCode for a snippet of inline code.
+ */
+class FromJsonSnippet extends FromJsonCode {
+  /**
+   * Callback that can be used to generate the code snippet, once the names
+   * of the [jsonPath] and [json] variables are known.
+   */
+  final FromJsonSnippetCallback callback;
+
+  FromJsonSnippet(this.callback);
+
+  @override
+  bool get isIdentity => false;
+
+  @override
+  String get asClosure =>
+      '(String jsonPath, Object json) => ${callback('jsonPath', 'json')}';
+
+  @override
+  String asSnippet(String jsonPath, String json) => callback(jsonPath, json);
+}
+
+/**
+ * Representation of FromJsonCode for the identity transformation.
+ */
+class FromJsonIdentity extends FromJsonSnippet {
+  FromJsonIdentity() : super((String jsonPath, String json) => json);
+
+  @override
+  bool get isIdentity => true;
+}
+
+/**
+ * Container for code that can be used to translate a data type to JSON.
+ */
+abstract class ToJsonCode {
+  /**
+   * True if the data type is already in JSON form, so the translation is the
+   * identity function.
+   */
+  bool get isIdentity;
+
+  /**
+   * Get the translation code in the form of a closure.
+   */
+  String get asClosure;
+
+  /**
+   * Get the translation code in the form of a code snippet, where [value]
+   * is the variable holding the object to be translated.
+   */
+  String asSnippet(String value);
+}
+
+/**
+ * Representation of ToJsonCode for a function defined elsewhere.
+ */
+class ToJsonFunction extends ToJsonCode {
+  final String asClosure;
+
+  ToJsonFunction(this.asClosure);
+
+  @override
+  bool get isIdentity => false;
+
+  @override
+  String asSnippet(String value) => '$asClosure($value)';
+}
+
+typedef String ToJsonSnippetCallback(String value);
+
+/**
+ * Representation of ToJsonCode for a snippet of inline code.
+ */
+class ToJsonSnippet extends ToJsonCode {
+  /**
+   * Callback that can be used to generate the code snippet, once the name
+   * of the [value] variable is known.
+   */
+  final ToJsonSnippetCallback callback;
+
+  /**
+   * Dart type of the [value] variable.
+   */
+  final String type;
+
+  ToJsonSnippet(this.type, this.callback);
+
+  @override
+  bool get isIdentity => false;
+
+  @override
+  String get asClosure => '($type value) => ${callback('value')}';
+
+  @override
+  String asSnippet(String value) => callback(value);
+}
+
+/**
+ * Representation of FromJsonCode for the identity transformation.
+ */
+class ToJsonIdentity extends ToJsonSnippet {
+  ToJsonIdentity(String type) : super(type, (String value) => value);
+
+  @override
+  bool get isIdentity => true;
+}
+
+/**
+ * Special flags that need to be inserted into the declaration of the Element
+ * class.
+ */
+const Map<String, String> specialElementFlags = const {
+  'abstract': '0x01',
+  'const': '0x02',
+  'final': '0x04',
+  'static': '0x08',
+  'private': '0x10',
+  'deprecated': '0x20'
+};
+
+/**
+ * Callback type used to represent arbitrary code generation.
+ */
+typedef void CodegenCallback();
+
+/**
+ * Visitor which produces Dart code representing the API.
+ */
+class CodegenProtocolVisitor extends HierarchicalApiVisitor with CodeGenerator {
+  /**
+   * Type references in the spec that are named something else in Dart.
+   */
+  static const Map<String, String> _typeRenames = const {
+    'object': 'Object',
+  };
+
+  /**
+   * Class members for which the constructor argument should be optional, even
+   * if the member is not an optional part of the protocol.  For list types,
+   * the constructor will default the member to the empty list.
+   */
+  static const Map<String, List<String>> _optionalConstructorArguments = const {
+    'ErrorFixes': const ['fixes'],
+    'SourceChange': const ['edits', 'linkedEditGroups'],
+    'SourceFileEdit': const ['edits'],
+    'TypeHierarchyItem': const ['interfaces', 'mixins', 'subclasses'],
+  };
+
+  /**
+   * Visitor used to produce doc comments.
+   */
+  final ToHtmlVisitor toHtmlVisitor;
+
+  /**
+   * Types implied by the API.  This includes types explicitly named in the
+   * API as well as those implied by the definitions of requests, responses,
+   * notifications, etc.
+   */
+  final Map<String, ImpliedType> impliedTypes;
+
+  CodegenProtocolVisitor(Api api)
+      : super(api),
+        toHtmlVisitor = new ToHtmlVisitor(api),
+        impliedTypes = computeImpliedTypes(api);
+
+  @override
+  visitApi() {
+    outputHeader();
+    writeln();
+    writeln('part of protocol;');
+    emitClasses();
+  }
+
+  /**
+   * Translate each type implied by the API to a class.
+   */
+  void emitClasses() {
+    for (ImpliedType impliedType in impliedTypes.values) {
+      TypeDecl type = impliedType.type;
+      String dartTypeName = capitalize(impliedType.camelName);
+      if (type == null) {
+        emitEmptyObjectClass(dartTypeName, impliedType);
+      } else if (type is TypeObject || type == null) {
+        writeln();
+        emitObjectClass(dartTypeName, type, impliedType);
+      } else if (type is TypeEnum) {
+        writeln();
+        emitEnumClass(dartTypeName, type, impliedType);
+      }
+    }
+  }
+
+  /**
+   * Emit a class representing an data structure that doesn't exist in the
+   * protocol because it is empty (e.g. the "params" object for a request that
+   * doesn't have any parameters).
+   */
+  void emitEmptyObjectClass(String className, ImpliedType impliedType) {
+    docComment(toHtmlVisitor.collectHtml(() {
+      toHtmlVisitor.p(() {
+        toHtmlVisitor.write(impliedType.humanReadableName);
+      });
+    }));
+    writeln('class $className {');
+    indent(() {
+      if (emitToRequestMember(impliedType)) {
+        writeln();
+      }
+      if (emitToResponseMember(impliedType)) {
+        writeln();
+      }
+      if (emitToNotificationMember(impliedType)) {
+        writeln();
+      }
+      emitObjectEqualsMember(null, className);
+      writeln();
+      emitObjectHashCode(null, className);
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit the class to encapsulate an object type.
+   */
+  void emitObjectClass(String className, TypeObject type,
+      ImpliedType impliedType) {
+    docComment(toHtmlVisitor.collectHtml(() {
+      toHtmlVisitor.p(() {
+        toHtmlVisitor.write(impliedType.humanReadableName);
+      });
+      if (impliedType.type != null) {
+        toHtmlVisitor.showType(null, impliedType.type);
+      }
+    }));
+    writeln('class $className {');
+    indent(() {
+      if (emitSpecialStaticMembers(className)) {
+        writeln();
+      }
+      for (TypeObjectField field in type.fields) {
+        if (field.value != null) {
+          continue;
+        }
+        docComment(toHtmlVisitor.collectHtml(() {
+          toHtmlVisitor.translateHtml(field.html);
+        }));
+        writeln('${dartType(field.type)} ${field.name};');
+        writeln();
+      }
+      emitObjectConstructor(type, className);
+      writeln();
+      emitObjectFromJsonConstructor(className, type, impliedType);
+      writeln();
+      if (emitConvenienceConstructor(className, impliedType)) {
+        writeln();
+      }
+      if (emitSpecialConstructors(className)) {
+        writeln();
+      }
+      if (emitSpecialGetters(className)) {
+        writeln();
+      }
+      emitToJsonMember(type);
+      writeln();
+      if (emitToRequestMember(impliedType)) {
+        writeln();
+      }
+      if (emitToResponseMember(impliedType)) {
+        writeln();
+      }
+      if (emitToNotificationMember(impliedType)) {
+        writeln();
+      }
+      if (emitSpecialMethods(className)) {
+        writeln();
+      }
+      writeln('@override');
+      writeln('String toString() => JSON.encode(toJson());');
+      writeln();
+      emitObjectEqualsMember(type, className);
+      writeln();
+      emitObjectHashCode(type, className);
+    });
+    writeln('}');
+  }
+
+  /**
+   * If the class named [className] requires special static members, emit them
+   * and return true.
+   */
+  bool emitSpecialStaticMembers(String className) {
+    switch (className) {
+      case 'AnalysisError':
+        docComment(
+            [
+                new dom.Text(
+                    'Returns a list of AnalysisErrors ' +
+                        'correponding to the given list of Engine errors.')]);
+        writeln(
+            'static List<AnalysisError> listFromEngine(engine.LineInfo lineInfo, List<engine.AnalysisError> errors) =>');
+        writeln('    _analysisErrorListFromEngine(lineInfo, errors);');
+        return true;
+      case 'Element':
+        List<String> makeFlagsArgs = <String>[];
+        List<String> makeFlagsStatements = <String>[];
+        specialElementFlags.forEach((String name, String value) {
+          String flag = 'FLAG_${name.toUpperCase()}';
+          String camelName = camelJoin(['is', name]);
+          writeln('static const int $flag = $value;');
+          makeFlagsArgs.add('$camelName: false');
+          makeFlagsStatements.add('if ($camelName) flags |= $flag;');
+        });
+        writeln();
+        writeln('static int makeFlags({${makeFlagsArgs.join(', ')}}) {');
+        indent(() {
+          writeln('int flags = 0;');
+          for (String statement in makeFlagsStatements) {
+            writeln(statement);
+          }
+          writeln('return flags;');
+        });
+        writeln('}');
+        return true;
+      case 'SourceEdit':
+        docComment(
+            [
+                new dom.Text(
+                    'Get the result of applying a set of ' +
+                        '[edits] to the given [code].  Edits are applied in the order ' +
+                        'they appear in [edits].')]);
+        writeln(
+            'static String applySequence(String code, Iterable<SourceEdit> edits) =>');
+        writeln('    _applySequence(code, edits);');
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * If the class named [className] requires special constructors, emit them
+   * and return true.
+   */
+  bool emitSpecialConstructors(String className) {
+    switch (className) {
+      case 'AnalysisError':
+        docComment(
+            [
+                new dom.Text(
+                    'Construct based on error information from the analyzer engine.')]);
+        writeln(
+            'factory AnalysisError.fromEngine(engine.LineInfo lineInfo, engine.AnalysisError error) =>');
+        writeln('    _analysisErrorFromEngine(lineInfo, error);');
+        return true;
+      case 'CompletionSuggestionKind':
+        docComment(
+            [new dom.Text('Construct from an analyzer engine element kind.')]);
+        writeln(
+            'factory CompletionSuggestionKind.fromElementKind(engine.ElementKind kind) =>');
+        writeln('    _completionSuggestionKindFromElementKind(kind);');
+        return true;
+      case 'Element':
+        docComment(
+            [new dom.Text('Construct based on a value from the analyzer engine.')]);
+        writeln('factory Element.fromEngine(engine.Element element) =>');
+        writeln('    elementFromEngine(element);');
+        return true;
+      case 'ElementKind':
+        docComment(
+            [new dom.Text('Construct based on a value from the analyzer engine.')]);
+        writeln('factory ElementKind.fromEngine(engine.ElementKind kind) =>');
+        writeln('    _elementKindFromEngine(kind);');
+        return true;
+      case 'LinkedEditGroup':
+        docComment([new dom.Text('Construct an empty LinkedEditGroup.')]);
+        writeln(
+            'LinkedEditGroup.empty() : this(<Position>[], 0, <LinkedEditSuggestion>[]);');
+        return true;
+      case 'Location':
+        docComment(
+            [new dom.Text('Create a Location based on an [engine.Element].')]);
+        writeln('factory Location.fromElement(engine.Element element) =>');
+        writeln('    _locationFromElement(element);');
+        writeln();
+        docComment(
+            [new dom.Text('Create a Location based on an [engine.SearchMatch].')]);
+        writeln('factory Location.fromMatch(engine.SearchMatch match) =>');
+        writeln('    _locationFromMatch(match);');
+        writeln();
+        docComment(
+            [new dom.Text('Create a Location based on an [engine.AstNode].')]);
+        writeln('factory Location.fromNode(engine.AstNode node) =>');
+        writeln('    _locationFromNode(node);');
+        writeln();
+        docComment(
+            [new dom.Text('Create a Location based on an [engine.CompilationUnit].')]);
+        writeln(
+            'factory Location.fromUnit(engine.CompilationUnit unit, engine.SourceRange range) =>');
+        writeln('    _locationFromUnit(unit, range);');
+        return true;
+      case 'OverriddenMember':
+        docComment(
+            [new dom.Text('Construct based on an element from the analyzer engine.')]);
+        writeln(
+            'factory OverriddenMember.fromEngine(engine.Element member) =>');
+        writeln('    _overriddenMemberFromEngine(member);');
+        return true;
+      case 'RefactoringProblemSeverity':
+        docComment(
+            [
+                new dom.Text(
+                    'Returns the [RefactoringProblemSeverity] with the maximal severity.')]);
+        writeln(
+            'static RefactoringProblemSeverity max(RefactoringProblemSeverity a, RefactoringProblemSeverity b) =>');
+        writeln('    _maxRefactoringProblemSeverity(a, b);');
+        return true;
+      case 'SearchResult':
+        docComment(
+            [new dom.Text('Construct based on a value from the search engine.')]);
+        writeln('factory SearchResult.fromMatch(engine.SearchMatch match) =>');
+        writeln('    searchResultFromMatch(match);');
+        return true;
+      case 'SearchResultKind':
+        docComment(
+            [new dom.Text('Construct based on a value from the search engine.')]);
+        writeln(
+            'factory SearchResultKind.fromEngine(engine.MatchKind kind) =>');
+        writeln('    _searchResultKindFromEngine(kind);');
+        return true;
+      case 'SourceEdit':
+        docComment([new dom.Text('Construct based on a SourceRange.')]);
+        writeln(
+            'SourceEdit.range(engine.SourceRange range, String replacement, {String id})');
+        writeln('    : this(range.offset, range.length, replacement, id: id);');
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * If the class named [className] requires special getters, emit them and
+   * return true.
+   */
+  bool emitSpecialGetters(String className) {
+    switch (className) {
+      case 'Element':
+        for (String name in specialElementFlags.keys) {
+          String flag = 'FLAG_${name.toUpperCase()}';
+          writeln(
+              'bool get ${camelJoin(['is', name])} => (flags & $flag) != 0;');
+        }
+        return true;
+      case 'SourceEdit':
+        docComment([new dom.Text('The end of the region to be modified.')]);
+        writeln('int get end => offset + length;');
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * If the class named [className] requires special methods, emit them and
+   * return true.
+   */
+  bool emitSpecialMethods(String className) {
+    switch (className) {
+      case 'ErrorFixes':
+        docComment([new dom.Text('Add a [Fix]')]);
+        writeln('void addFix(Fix fix) {');
+        indent(() {
+          writeln('fixes.add(fix.change);');
+        });
+        writeln('}');
+        return true;
+      case 'LinkedEditGroup':
+        docComment([new dom.Text('Add a new position and change the length.')]);
+        writeln('void addPosition(Position position, int length) {');
+        indent(() {
+          writeln('positions.add(position);');
+          writeln('this.length = length;');
+        });
+        writeln('}');
+        writeln();
+        docComment([new dom.Text('Add a new suggestion.')]);
+        writeln('void addSuggestion(LinkedEditSuggestion suggestion) {');
+        indent(() {
+          writeln('suggestions.add(suggestion);');
+        });
+        writeln('}');
+        return true;
+      case 'SourceChange':
+        docComment(
+            [new dom.Text('Adds [edit] to the [FileEdit] for the given [file].')]);
+        writeln('void addEdit(String file, SourceEdit edit) =>');
+        writeln('    _addEditToSourceChange(this, file, edit);');
+        writeln();
+        docComment([new dom.Text('Adds the given [FileEdit].')]);
+        writeln('void addFileEdit(SourceFileEdit edit) {');
+        indent(() {
+          writeln('edits.add(edit);');
+        });
+        writeln('}');
+        writeln();
+        docComment([new dom.Text('Adds the given [LinkedEditGroup].')]);
+        writeln('void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) {');
+        indent(() {
+          writeln('linkedEditGroups.add(linkedEditGroup);');
+        });
+        writeln('}');
+        writeln();
+        docComment(
+            [new dom.Text('Returns the [FileEdit] for the given [file], maybe `null`.')]);
+        writeln('SourceFileEdit getFileEdit(String file) =>');
+        writeln('    _getChangeFileEdit(this, file);');
+        return true;
+      case 'SourceEdit':
+        docComment(
+            [new dom.Text('Get the result of applying the edit to the given [code].')]);
+        writeln('String apply(String code) => _applyEdit(code, this);');
+        return true;
+      case 'SourceFileEdit':
+        docComment([new dom.Text('Adds the given [Edit] to the list.')]);
+        writeln('void add(SourceEdit edit) => _addEditForSource(this, edit);');
+        writeln();
+        docComment([new dom.Text('Adds the given [Edit]s.')]);
+        writeln('void addAll(Iterable<SourceEdit> edits) =>');
+        writeln('    _addAllEditsForSource(this, edits);');
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * Emit the constructor for an object class.
+   */
+  void emitObjectConstructor(TypeObject type, String className) {
+    List<String> args = <String>[];
+    List<String> optionalArgs = <String>[];
+    List<CodegenCallback> extraInitCode = <CodegenCallback>[];
+    for (TypeObjectField field in type.fields) {
+      if (field.value != null) {
+        continue;
+      }
+      String arg = 'this.${field.name}';
+      if (isOptionalConstructorArg(className, field)) {
+        optionalArgs.add(arg);
+        TypeDecl fieldType = field.type;
+        if (fieldType is TypeList) {
+          extraInitCode.add(() {
+            writeln('if (${field.name} == null) {');
+            indent(() {
+              writeln('${field.name} = <${dartType(fieldType.itemType)}>[];');
+            });
+            writeln('}');
+          });
+        }
+      } else {
+        args.add(arg);
+      }
+    }
+    if (optionalArgs.isNotEmpty) {
+      args.add('{${optionalArgs.join(', ')}}');
+    }
+    write('$className(${args.join(', ')})');
+    if (extraInitCode.isEmpty) {
+      writeln(';');
+    } else {
+      writeln(' {');
+      indent(() {
+        for (CodegenCallback callback in extraInitCode) {
+          callback();
+        }
+      });
+      writeln('}');
+    }
+  }
+
+  /**
+   * True if the constructor argument for the given field should be optional.
+   */
+  bool isOptionalConstructorArg(String className, TypeObjectField field) {
+    if (field.optional) {
+      return true;
+    }
+    List<String> forceOptional = _optionalConstructorArguments[className];
+    if (forceOptional != null && forceOptional.contains(field.name)) {
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Emit the toJson() code for an object class.
+   */
+  void emitToJsonMember(TypeObject type) {
+    writeln('Map<String, dynamic> toJson() {');
+    indent(() {
+      writeln('Map<String, dynamic> result = {};');
+      for (TypeObjectField field in type.fields) {
+        String fieldNameString = literalString(field.name);
+        if (field.value != null) {
+          writeln('result[$fieldNameString] = ${literalString(field.value)};');
+          continue;
+        }
+        String fieldToJson = toJsonCode(field.type).asSnippet(field.name);
+        String populateField = 'result[$fieldNameString] = $fieldToJson;';
+        if (field.optional) {
+          String condition;
+          if (field.type is TypeList) {
+            condition = '${field.name}.isNotEmpty';
+          } else {
+            condition = '${field.name} != null';
+          }
+          writeln('if ($condition) {');
+          indent(() {
+            writeln(populateField);
+          });
+          writeln('}');
+        } else {
+          writeln(populateField);
+        }
+      }
+      writeln('return result;');
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit the toRequest() code for a class, if appropriate.  Returns true if
+   * code was emitted.
+   */
+  bool emitToRequestMember(ImpliedType impliedType) {
+    if (impliedType.kind == 'requestParams') {
+      writeln('Request toRequest(String id) {');
+      indent(() {
+        String methodString =
+            literalString((impliedType.apiNode as Request).longMethod);
+        String jsonPart = impliedType.type != null ? 'toJson()' : 'null';
+        writeln('return new Request(id, $methodString, $jsonPart);');
+      });
+      writeln('}');
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Emit the toResponse() code for a class, if appropriate.  Returns true if
+   * code was emitted.
+   */
+  bool emitToResponseMember(ImpliedType impliedType) {
+    if (impliedType.kind == 'requestResult') {
+      writeln('Response toResponse(String id) {');
+      indent(() {
+        String jsonPart = impliedType.type != null ? 'toJson()' : 'null';
+        writeln('return new Response(id, result: $jsonPart);');
+      });
+      writeln('}');
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Emit the toNotification() code for a class, if appropriate.  Returns true
+   * if code was emitted.
+   */
+  bool emitToNotificationMember(ImpliedType impliedType) {
+    if (impliedType.kind == 'notificationParams') {
+      writeln('Notification toNotification() {');
+      indent(() {
+        String eventString =
+            literalString((impliedType.apiNode as Notification).longEvent);
+        String jsonPart = impliedType.type != null ? 'toJson()' : 'null';
+        writeln('return new Notification($eventString, $jsonPart);');
+      });
+      writeln('}');
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Emit the operator== code for an object class.
+   */
+  void emitObjectEqualsMember(TypeObject type, String className) {
+    writeln('@override');
+    writeln('bool operator==(other) {');
+    indent(() {
+      writeln('if (other is $className) {');
+      indent(() {
+        var comparisons = <String>[];
+        if (type != null) {
+          for (TypeObjectField field in type.fields) {
+            if (field.value != null) {
+              continue;
+            }
+            comparisons.add(
+                compareEqualsCode(field.type, field.name, 'other.${field.name}'));
+          }
+        }
+        if (comparisons.isEmpty) {
+          writeln('return true;');
+        } else {
+          String concatenated = comparisons.join(' &&\n    ');
+          writeln('return $concatenated;');
+        }
+      });
+      writeln('}');
+      writeln('return false;');
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit the hashCode getter for an object class.
+   */
+  void emitObjectHashCode(TypeObject type, String className) {
+    writeln('@override');
+    writeln('int get hashCode {');
+    indent(() {
+      if (type == null) {
+        writeln('return ${className.hashCode};');
+      } else {
+        writeln('int hash = 0;');
+        for (TypeObjectField field in type.fields) {
+          String valueToCombine;
+          if (field.value != null) {
+            valueToCombine = field.value.hashCode.toString();
+          } else {
+            valueToCombine = '${field.name}.hashCode';
+          }
+          writeln('hash = _JenkinsSmiHash.combine(hash, $valueToCombine);');
+        }
+        writeln('return _JenkinsSmiHash.finish(hash);');
+      }
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit a class to encapsulate an enum.
+   */
+  void emitEnumClass(String className, TypeEnum type, ImpliedType impliedType) {
+    docComment(toHtmlVisitor.collectHtml(() {
+      toHtmlVisitor.p(() {
+        toHtmlVisitor.write(impliedType.humanReadableName);
+      });
+      if (impliedType.type != null) {
+        toHtmlVisitor.showType(null, impliedType.type);
+      }
+    }));
+    writeln('class $className {');
+    indent(() {
+      if (emitSpecialStaticMembers(className)) {
+        writeln();
+      }
+      for (TypeEnumValue value in type.values) {
+        docComment(toHtmlVisitor.collectHtml(() {
+          toHtmlVisitor.translateHtml(value.html);
+        }));
+        String valueString = literalString(value.value);
+        writeln(
+            'static const ${value.value} = const $className._($valueString);');
+        writeln();
+      }
+      writeln('final String name;');
+      writeln();
+      writeln('const $className._(this.name);');
+      writeln();
+      emitEnumClassConstructor(className, type);
+      writeln();
+      emitEnumFromJsonConstructor(className, type, impliedType);
+      writeln();
+      if (emitSpecialConstructors(className)) {
+        writeln();
+      }
+      if (emitSpecialGetters(className)) {
+        writeln();
+      }
+      if (emitSpecialMethods(className)) {
+        writeln();
+      }
+      writeln('@override');
+      writeln('String toString() => "$className.\$name";');
+      writeln();
+      writeln('String toJson() => name;');
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit the constructor for an enum class.
+   */
+  void emitEnumClassConstructor(String className, TypeEnum type) {
+    writeln('factory $className(String name) {');
+    indent(() {
+      writeln('switch (name) {');
+      indent(() {
+        for (TypeEnumValue value in type.values) {
+          String valueString = literalString(value.value);
+          writeln('case $valueString:');
+          indent(() {
+            writeln('return ${value.value};');
+          });
+        }
+      });
+      writeln('}');
+      writeln(r"throw new Exception('Illegal enum value: $name');");
+    });
+    writeln('}');
+  }
+
+  /**
+   * Compute the code necessary to convert [type] to JSON.
+   */
+  ToJsonCode toJsonCode(TypeDecl type) {
+    TypeDecl resolvedType = resolveTypeReferenceChain(type);
+    if (resolvedType is TypeReference) {
+      return new ToJsonIdentity(dartType(type));
+    } else if (resolvedType is TypeList) {
+      ToJsonCode itemCode = toJsonCode(resolvedType.itemType);
+      if (itemCode.isIdentity) {
+        return new ToJsonIdentity(dartType(type));
+      } else {
+        return new ToJsonSnippet(
+            dartType(type),
+            (String value) => '$value.map(${itemCode.asClosure}).toList()');
+      }
+    } else if (resolvedType is TypeMap) {
+      ToJsonCode keyCode;
+      if (dartType(resolvedType.keyType) != 'String') {
+        keyCode = toJsonCode(resolvedType.keyType);
+      } else {
+        keyCode = new ToJsonIdentity(dartType(resolvedType.keyType));
+      }
+      ToJsonCode valueCode = toJsonCode(resolvedType.valueType);
+      if (keyCode.isIdentity && valueCode.isIdentity) {
+        return new ToJsonIdentity(dartType(resolvedType));
+      } else {
+        return new ToJsonSnippet(dartType(type), (String value) {
+          StringBuffer result = new StringBuffer();
+          result.write('mapMap($value');
+          if (!keyCode.isIdentity) {
+            result.write(', keyCallback: ${keyCode.asClosure}');
+          }
+          if (!valueCode.isIdentity) {
+            result.write(', valueCallback: ${valueCode.asClosure}');
+          }
+          result.write(')');
+          return result.toString();
+        });
+      }
+    } else if (resolvedType is TypeUnion) {
+      for (TypeDecl choice in resolvedType.choices) {
+        if (resolveTypeReferenceChain(choice) is! TypeObject) {
+          throw new Exception('Union types must be unions of objects');
+        }
+      }
+      return new ToJsonSnippet(
+          dartType(type),
+          (String value) => '$value.toJson()');
+    } else if (resolvedType is TypeObject || resolvedType is TypeEnum) {
+      return new ToJsonSnippet(
+          dartType(type),
+          (String value) => '$value.toJson()');
+    } else {
+      throw new Exception("Can't convert $resolvedType from JSON");
+    }
+  }
+
+  /**
+   * Compute the code necessary to compare two objects for equality.
+   */
+  String compareEqualsCode(TypeDecl type, String thisVar, String otherVar) {
+    TypeDecl resolvedType = resolveTypeReferenceChain(type);
+    if (resolvedType is TypeReference ||
+        resolvedType is TypeEnum ||
+        resolvedType is TypeObject ||
+        resolvedType is TypeUnion) {
+      return '$thisVar == $otherVar';
+    } else if (resolvedType is TypeList) {
+      String itemTypeName = dartType(resolvedType.itemType);
+      String subComparison = compareEqualsCode(resolvedType.itemType, 'a', 'b');
+      String closure = '($itemTypeName a, $itemTypeName b) => $subComparison';
+      return '_listEqual($thisVar, $otherVar, $closure)';
+    } else if (resolvedType is TypeMap) {
+      String valueTypeName = dartType(resolvedType.valueType);
+      String subComparison =
+          compareEqualsCode(resolvedType.valueType, 'a', 'b');
+      String closure = '($valueTypeName a, $valueTypeName b) => $subComparison';
+      return '_mapEqual($thisVar, $otherVar, $closure)';
+    }
+    throw new Exception(
+        "Don't know how to compare for equality: $resolvedType");
+  }
+
+  /**
+   * Emit the method for decoding an object from JSON.
+   */
+  void emitObjectFromJsonConstructor(String className, TypeObject type,
+      ImpliedType impliedType) {
+    String humanReadableNameString =
+        literalString(impliedType.humanReadableName);
+    writeln(
+        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {');
+    indent(() {
+      writeln('if (json == null) {');
+      indent(() {
+        writeln('json = {};');
+      });
+      writeln('}');
+      writeln('if (json is Map) {');
+      indent(() {
+        List<String> args = <String>[];
+        List<String> optionalArgs = <String>[];
+        for (TypeObjectField field in type.fields) {
+          String fieldNameString = literalString(field.name);
+          String fieldAccessor = 'json[$fieldNameString]';
+          String jsonPath = 'jsonPath + ${literalString('.${field.name}')}';
+          if (field.value != null) {
+            String valueString = literalString(field.value);
+            writeln('if ($fieldAccessor != $valueString) {');
+            indent(() {
+              writeln(
+                  'throw jsonDecoder.mismatch(jsonPath, "equal " + $valueString);');
+            });
+            writeln('}');
+            continue;
+          }
+          if (isOptionalConstructorArg(className, field)) {
+            optionalArgs.add('${field.name}: ${field.name}');
+          } else {
+            args.add(field.name);
+          }
+          TypeDecl fieldType = field.type;
+          String fieldDartType = dartType(fieldType);
+          writeln('$fieldDartType ${field.name};');
+          writeln('if (json.containsKey($fieldNameString)) {');
+          indent(() {
+            String toJson =
+                fromJsonCode(fieldType).asSnippet(jsonPath, fieldAccessor);
+            writeln('${field.name} = $toJson;');
+          });
+          write('}');
+          if (!field.optional) {
+            writeln(' else {');
+            indent(() {
+              writeln(
+                  "throw jsonDecoder.missingKey(jsonPath, $fieldNameString);");
+            });
+            writeln('}');
+          } else if (fieldType is TypeList) {
+            writeln(' else {');
+            indent(() {
+              writeln('${field.name} = <${dartType(fieldType.itemType)}>[];');
+            });
+            writeln('}');
+          } else {
+            writeln();
+          }
+        }
+        args.addAll(optionalArgs);
+        writeln('return new $className(${args.join(', ')});');
+      });
+      writeln('} else {');
+      indent(() {
+        writeln(
+            'throw jsonDecoder.mismatch(jsonPath, $humanReadableNameString);');
+      });
+      writeln('}');
+    });
+    writeln('}');
+  }
+
+  /**
+   * Emit the method for decoding an enum from JSON.
+   */
+  void emitEnumFromJsonConstructor(String className, TypeEnum type,
+      ImpliedType impliedType) {
+    writeln(
+        'factory $className.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {');
+    indent(() {
+      writeln('if (json is String) {');
+      indent(() {
+        writeln('try {');
+        indent(() {
+          writeln('return new $className(json);');
+        });
+        writeln('} catch(_) {');
+        indent(() {
+          writeln('// Fall through');
+        });
+        writeln('}');
+      });
+      writeln('}');
+      String humanReadableNameString =
+          literalString(impliedType.humanReadableName);
+      writeln(
+          'throw jsonDecoder.mismatch(jsonPath, $humanReadableNameString);');
+    });
+    writeln('}');
+  }
+
+  /**
+   * Compute the code necessary to translate [type] from JSON.
+   */
+  FromJsonCode fromJsonCode(TypeDecl type) {
+    if (type is TypeReference) {
+      TypeDefinition referencedDefinition = api.types[type.typeName];
+      if (referencedDefinition != null) {
+        TypeDecl referencedType = referencedDefinition.type;
+        if (referencedType is TypeObject || referencedType is TypeEnum) {
+          return new FromJsonSnippet(
+              (String jsonPath, String json) =>
+                  'new ${dartType(type)}.fromJson(jsonDecoder, $jsonPath, $json)');
+        } else {
+          return fromJsonCode(referencedType);
+        }
+      } else {
+        switch (type.typeName) {
+          case 'String':
+            return new FromJsonFunction('jsonDecoder._decodeString');
+          case 'bool':
+            return new FromJsonFunction('jsonDecoder._decodeBool');
+          case 'int':
+            return new FromJsonFunction('jsonDecoder._decodeInt');
+          case 'object':
+            return new FromJsonIdentity();
+          default:
+            throw new Exception('Unexpected type name ${type.typeName}');
+        }
+      }
+    } else if (type is TypeMap) {
+      FromJsonCode keyCode;
+      if (dartType(type.keyType) != 'String') {
+        keyCode = fromJsonCode(type.keyType);
+      } else {
+        keyCode = new FromJsonIdentity();
+      }
+      FromJsonCode valueCode = fromJsonCode(type.valueType);
+      if (keyCode.isIdentity && valueCode.isIdentity) {
+        return new FromJsonFunction('jsonDecoder._decodeMap');
+      } else {
+        return new FromJsonSnippet((String jsonPath, String json) {
+          StringBuffer result = new StringBuffer();
+          result.write('jsonDecoder._decodeMap($jsonPath, $json');
+          if (!keyCode.isIdentity) {
+            result.write(', keyDecoder: ${keyCode.asClosure}');
+          }
+          if (!valueCode.isIdentity) {
+            result.write(', valueDecoder: ${valueCode.asClosure}');
+          }
+          result.write(')');
+          return result.toString();
+        });
+      }
+    } else if (type is TypeList) {
+      FromJsonCode itemCode = fromJsonCode(type.itemType);
+      if (itemCode.isIdentity) {
+        return new FromJsonFunction('jsonDecoder._decodeList');
+      } else {
+        return new FromJsonSnippet(
+            (String jsonPath, String json) =>
+                'jsonDecoder._decodeList($jsonPath, $json, ${itemCode.asClosure})');
+      }
+    } else if (type is TypeUnion) {
+      List<String> decoders = <String>[];
+      for (TypeDecl choice in type.choices) {
+        TypeDecl resolvedChoice = resolveTypeReferenceChain(choice);
+        if (resolvedChoice is TypeObject) {
+          TypeObjectField field = resolvedChoice.getField(type.field);
+          if (field == null) {
+            throw new Exception(
+                'Each choice in the union needs a field named ${type.field}');
+          }
+          if (field.value == null) {
+            throw new Exception(
+                'Each choice in the union needs a constant value for the field ${type.field}');
+          }
+          String closure = fromJsonCode(choice).asClosure;
+          decoders.add('${literalString(field.value)}: $closure');
+        } else {
+          throw new Exception('Union types must be unions of objects.');
+        }
+      }
+      return new FromJsonSnippet(
+          (String jsonPath, String json) =>
+              'jsonDecoder._decodeUnion($jsonPath, $json, ${literalString(type.field)}, {${decoders.join(', ')}})');
+    } else {
+      throw new Exception("Can't convert $type from JSON");
+    }
+  }
+
+  /**
+   * Emit a convenience constructor for decoding a piece of protocol, if
+   * appropriate.  Return true if a constructor was emitted.
+   */
+  bool emitConvenienceConstructor(String className, ImpliedType impliedType) {
+    // The type of object from which this piece of protocol should be decoded.
+    String inputType;
+    // The name of the input object.
+    String inputName;
+    // The field within the input object to decode.
+    String fieldName;
+    // Constructor call to create the JsonDecoder object.
+    String makeDecoder;
+    // Name of the constructor to create.
+    String constructorName;
+    // Extra arguments for the constructor.
+    List<String> extraArgs = <String>[];
+    switch (impliedType.kind) {
+      case 'requestParams':
+        inputType = 'Request';
+        inputName = 'request';
+        fieldName = '_params';
+        makeDecoder = 'new RequestDecoder(request)';
+        constructorName = 'fromRequest';
+        break;
+      case 'requestResult':
+        inputType = 'Response';
+        inputName = 'response';
+        fieldName = '_result';
+        makeDecoder = 'new ResponseDecoder()';
+        constructorName = 'fromResponse';
+        break;
+      case 'notificationParams':
+        inputType = 'Notification';
+        inputName = 'notification';
+        fieldName = '_params';
+        makeDecoder = 'new ResponseDecoder()';
+        constructorName = 'fromNotification';
+        break;
+      case 'refactoringFeedback':
+        inputType = 'EditGetRefactoringResult';
+        inputName = 'refactoringResult';
+        fieldName = 'feedback';
+        makeDecoder = 'new ResponseDecoder()';
+        constructorName = 'fromRefactoringResult';
+        break;
+      case 'refactoringOptions':
+        inputType = 'EditGetRefactoringParams';
+        inputName = 'refactoringParams';
+        fieldName = 'options';
+        makeDecoder = 'new RequestDecoder(request)';
+        constructorName = 'fromRefactoringParams';
+        extraArgs.add('Request request');
+        break;
+      default:
+        return false;
+    }
+    List<String> args = ['$inputType $inputName'];
+    args.addAll(extraArgs);
+    writeln('factory $className.$constructorName(${args.join(', ')}) {');
+    indent(() {
+      String fieldNameString =
+          literalString(fieldName.replaceFirst(new RegExp('^_'), ''));
+      writeln('return new $className.fromJson(');
+      writeln('    $makeDecoder, $fieldNameString, $inputName.$fieldName);');
+    });
+    writeln('}');
+    return true;
+  }
+
+  /**
+   * Create a string literal that evaluates to [s].
+   */
+  String literalString(String s) {
+    return JSON.encode(s);
+  }
+
+  /**
+   * Convert the given [TypeDecl] to a Dart type.
+   */
+  String dartType(TypeDecl type) {
+    if (type is TypeReference) {
+      String typeName = type.typeName;
+      TypeDefinition referencedDefinition = api.types[typeName];
+      if (_typeRenames.containsKey(typeName)) {
+        return _typeRenames[typeName];
+      }
+      if (referencedDefinition == null) {
+        return typeName;
+      }
+      TypeDecl referencedType = referencedDefinition.type;
+      if (referencedType is TypeObject || referencedType is TypeEnum) {
+        return typeName;
+      }
+      return dartType(referencedType);
+    } else if (type is TypeList) {
+      return 'List<${dartType(type.itemType)}>';
+    } else if (type is TypeMap) {
+      return 'Map<${dartType(type.keyType)}, ${dartType(type.valueType)}>';
+    } else if (type is TypeUnion) {
+      return 'dynamic';
+    } else {
+      throw new Exception("Can't convert to a dart type");
+    }
+  }
+}
+
+final GeneratedFile target =
+    new GeneratedFile('../../lib/src/generated_protocol.dart', () {
+  CodegenProtocolVisitor visitor = new CodegenProtocolVisitor(readApi());
+  return visitor.collectCode(visitor.visitApi);
+});
+
+/**
+ * Translate spec_input.html into protocol_matchers.dart.
+ */
+main() {
+  target.generate();
+}
diff --git a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
index 43e85e6..95ab7e3 100644
--- a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
+++ b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
@@ -8,7 +8,6 @@
 library codegenInttestMethods;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'api.dart';
 import 'codegen_tools.dart';
@@ -100,7 +99,8 @@
 
   @override
   visitNotification(Notification notification) {
-    String streamName = camelJoin(['on', notification.domainName, notification.event]);
+    String streamName = camelJoin(['on', notification.domainName,
+        notification.event]);
     writeln();
     docComment(toHtmlVisitor.collectHtml(() {
       toHtmlVisitor.translateHtml(notification.html);
@@ -233,20 +233,24 @@
         default:
           throw new Exception(type.typeName);
       }
+    } else if (type is TypeUnion) {
+      return 'Object';
     } else {
       throw new Exception('Unexpected kind of TypeDecl');
     }
   }
 }
 
+final GeneratedFile target = new GeneratedFile(
+    '../../test/integration/integration_test_methods.dart', () {
+  CodegenInttestMethodsVisitor visitor = new CodegenInttestMethodsVisitor(
+      readApi());
+  return visitor.collectCode(visitor.visitApi);
+});
+
 /**
  * Translate spec_input.html into protocol_matchers.dart.
  */
 main() {
-  CodegenInttestMethodsVisitor visitor = new CodegenInttestMethodsVisitor(
-      readApi());
-  String code = visitor.collectCode(visitor.visitApi);
-  File outputFile = new File(
-      '../../test/integration/integration_test_methods.dart');
-  outputFile.writeAsStringSync(code);
+  target.generate();
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index f464eee..97f4df0 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -7,10 +7,10 @@
  */
 library CodegenJava;
 
-import 'dart:io';
-
+import 'package:html5lib/dom.dart' as dom;
 import 'api.dart';
 import 'codegen_tools.dart';
+import 'from_html.dart';
 import 'to_html.dart';
 
 /**
@@ -31,10 +31,14 @@
    * Type references in the spec that are named something else in Java.
    */
   static const Map<String, String> _typeRenames = const {
-    'bool': 'boolean',
+    // TODO (jwren) in some situations we want to use Boolean/Integer while
+    // other situations we want to use boolean/int...
+    'bool': 'Boolean',
+    'int': 'Integer',
     'FilePath': 'String',
     'DebugContextId': 'String',
     'object': 'Object',
+    'Override': 'OverrideMember',
   };
 
   /**
@@ -47,6 +51,34 @@
         toHtmlVisitor = new ToHtmlVisitor(api);
 
   /**
+   * Convenience method for subclasses for calling docComment.
+   */
+  void javadocComment(List<dom.Node> docs) {
+    docComment(docs, width: 99, javadocStyle: true);
+  }
+
+  /**
+   * Create a public field, using [callback] to create its contents.
+   */
+  void publicField(String fieldName, void callback()) {
+    _state.publicFields[fieldName] = collectCode(callback);
+  }
+
+  /**
+   * Create a private field, using [callback] to create its contents.
+   */
+  void privateField(String fieldName, void callback()) {
+    _state.privateFields[fieldName] = collectCode(callback);
+  }
+
+  /**
+   * Create a constructor, using [callback] to create its contents.
+   */
+  void constructor(String name, void callback()) {
+    _state.constructors[name] = collectCode(callback);
+  }
+
+  /**
    * Create a private method, using [callback] to create its contents.
    */
   void privateMethod(String methodName, void callback()) {
@@ -73,12 +105,30 @@
       callback();
       writeln('$header {');
       indent(() {
-        List<String> allMethods = _valuesSortedByKey(_state.publicMethods).toList();
+        // fields
+        List<String> allFields = _state.publicFields.values.toList();
+        allFields.addAll(_state.privateFields.values.toList());
+        for (String field in allFields) {
+          writeln();
+          write(field);
+        }
+
+        // constructors
+        List<String> allConstructors = _state.constructors.values.toList();
+        for (String constructor in allConstructors) {
+          writeln();
+          write(constructor);
+        }
+
+        // methods (ordered by method name)
+        List<String> allMethods =
+            _valuesSortedByKey(_state.publicMethods).toList();
         allMethods.addAll(_valuesSortedByKey(_state.privateMethods));
         for (String method in allMethods) {
           writeln();
           write(method);
         }
+        writeln();
       });
       writeln('}');
     } finally {
@@ -99,15 +149,75 @@
         return typeName;
       }
     } else if (type is TypeList) {
-      return 'List<${javaType(type.itemType)}>';
+      if (isPrimitive(type.itemType)) {
+        return '${javaType(type.itemType)}[]';
+      } else {
+        return 'List<${javaType(type.itemType)}>';
+      }
     } else if (type is TypeMap) {
       return 'Map<${javaType(type.keyType)}, ${javaType(type.valueType)}>';
+    } else if (type is TypeUnion) {
+      return 'Object';
     } else {
       throw new Exception("Can't make type buildable");
     }
   }
 
   /**
+   * Return true iff the passed [TypeDecl] will represent a primitive Java type.
+   */
+  bool isPrimitive(TypeDecl type) {
+    if (type is TypeReference) {
+      String typeStr = javaType(type);
+      return typeStr == 'Integer' || typeStr == 'boolean';
+    }
+    return false;
+  }
+
+  /**
+   * Return true iff the passed [TypeDecl] is a type declared in the spec_input.
+   */
+  bool isDeclaredInSpec(TypeDecl type) {
+//    TypeReference resolvedType = super.resolveTypeReferenceChain(type);
+//    if(resolvedType is TypeObject) {
+//      return truye;
+//    }
+    if (type is TypeReference) {
+      return api.types.containsKey(type.typeName) && javaType(type) != 'String';
+    }
+    return false;
+  }
+  
+  /**
+   * Return true iff the passed [TypeDecl] will be represented as Object in Java.
+   */
+  bool isObject(TypeDecl type) {
+    String typeStr = javaType(type);
+    return typeStr == 'Object';
+  }
+
+  /**
+   * Return true iff the passed [TypeDecl] will represent an array in Java.
+   */
+  bool isList(TypeDecl type) {
+    return type is TypeList && !isPrimitive(type.itemType);
+  }
+
+  /**
+   * Return true iff the passed [TypeDecl] will represent an array in Java.
+   */
+  bool isArray(TypeDecl type) {
+    return type is TypeList && isPrimitive(type.itemType);
+  }
+
+  /**
+   * Return true iff the passed [TypeDecl] will represent a Map in type.
+   */
+  bool isMap(TypeDecl type) {
+    return type is TypeMap;
+  }
+
+  /**
    * Return a suitable representation of [name] as the name of a Java variable.
    */
   String javaName(String name) {
@@ -149,13 +259,31 @@
    * Temporary storage for private methods.
    */
   Map<String, String> privateMethods = <String, String>{};
+
+  /**
+   * Temporary storage for public fields.
+   */
+  Map<String, String> publicFields = <String, String>{};
+
+  /**
+   * Temporary storage for private fields.
+   */
+  Map<String, String> privateFields = <String, String>{};
+
+  /**
+   * Temporary storage for constructors.
+   */
+  Map<String, String> constructors = <String, String>{};
 }
 
 /**
- * Use [visitor] to create Java code and output it to [path].
+ * Create a [GeneratedFile] that creates Java code and outputs it to [path].
+ * [path] uses Posix-style path separators regardless of the OS.
  */
-void createJavaCode(String path, CodegenJavaVisitor visitor) {
-  String code = visitor.collectCode(visitor.visitApi);
-  File outputFile = new File(path);
-  outputFile.writeAsStringSync(code);
+GeneratedFile javaGeneratedFile(String path, CodegenJavaVisitor
+    createVisitor(Api api)) {
+  return new GeneratedFile(path, () {
+    CodegenJavaVisitor visitor = createVisitor(readApi());
+    return visitor.collectCode(visitor.visitApi);
+  });
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
new file mode 100644
index 0000000..de990ae
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -0,0 +1,553 @@
+// 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.
+
+/**
+ * Code generation for the file "AnalysisServer.java".
+ */
+library java.generator.types;
+
+import 'api.dart';
+import 'codegen_java.dart';
+import 'codegen_tools.dart';
+import 'from_html.dart';
+
+/**
+ * Type references in the spec that are named something else in Java.
+ */
+const Map<String, String> _typeRenames = const {
+  'Override': 'OverrideMember',
+};
+
+/**
+ * A map between the field names and values for the Element object such as:
+ * 
+ * private static final int ABSTRACT = 0x01;
+ */
+const Map<String, String> _extraFieldsOnElement = const {
+  'ABSTRACT': '0x01',
+  'CONST': '0x02',
+  'FINAL': '0x04',
+  'TOP_LEVEL_STATIC': '0x08',
+  'PRIVATE': '0x10',
+  'DEPRECATED': '0x20',
+};
+
+/**
+ * A map between the method names and field names to generate additional methods on the Element object:
+ * 
+ * public boolean isFinal() {
+ *   return (flags & FINAL) != 0;
+ * }
+ */
+const Map<String, String> _extraMethodsOnElement = const {
+  'isAbstract': 'ABSTRACT',
+  'isConst': 'CONST',
+  'isDeprecated': 'DEPRECATED',
+  'isFinal': 'FINAL',
+  'isPrivate': 'PRIVATE',
+  'isTopLevelOrStatic': 'TOP_LEVEL_STATIC',
+};
+
+class CodegenJavaType extends CodegenJavaVisitor {
+
+  String className;
+  TypeDefinition typeDef;
+
+  CodegenJavaType(Api api, String className)
+      : super(api),
+        this.className = className;
+
+  @override
+  void visitTypeDefinition(TypeDefinition typeDef) {
+    outputHeader(javaStyle: true);
+    writeln('package com.google.dart.server.generated.types;');
+    writeln();
+    if (typeDef.type is TypeObject) {
+      _writeTypeObject(typeDef);
+    } else if (typeDef.type is TypeEnum) {
+      _writeTypeEnum(typeDef);
+    }
+  }
+
+  void _writeTypeObject(TypeDefinition typeDef) {
+    writeln('import java.util.Arrays;');
+    writeln('import java.util.List;');
+    writeln('import java.util.Map;');
+    writeln('import com.google.common.collect.Lists;');
+    writeln('import com.google.dart.server.utilities.general.JsonUtilities;');
+    writeln('import com.google.dart.server.utilities.general.ObjectUtilities;');
+    writeln('import com.google.gson.JsonArray;');
+    writeln('import com.google.gson.JsonElement;');
+    writeln('import com.google.gson.JsonObject;');
+    writeln('import com.google.gson.JsonPrimitive;');
+    writeln('import org.apache.commons.lang3.builder.HashCodeBuilder;');
+    writeln('import java.util.ArrayList;');
+    writeln('import java.util.Iterator;');
+    writeln('import org.apache.commons.lang3.StringUtils;');
+    writeln();
+    javadocComment(toHtmlVisitor.collectHtml(() {
+      toHtmlVisitor.translateHtml(typeDef.html);
+      toHtmlVisitor.br();
+      toHtmlVisitor.write('@coverage dart.server.generated.types');
+    }));
+    writeln('@SuppressWarnings("unused")');
+    makeClass('public class ${className}', () {
+      //
+      // fields
+      //
+      //
+      // public static final "EMPTY_ARRAY" field
+      //
+      publicField(javaName("EMPTY_ARRAY"), () {
+        writeln(
+            'public static final ${className}[] EMPTY_ARRAY = new ${className}[0];');
+      });
+
+      //
+      // public static final "EMPTY_LIST" field
+      //
+      publicField(javaName("EMPTY_LIST"), () {
+        writeln(
+            'public static final List<${className}> EMPTY_LIST = Lists.newArrayList();');
+      });
+
+      //
+      // Extra fields on the Element type such as:
+      // private static final int ABSTRACT = 0x01;
+      //
+      if (className == 'Element') {
+        _extraFieldsOnElement.forEach((String name, String value) {
+          publicField(javaName(name), () {
+            writeln('private static final int ${name} = ${value};');
+          });
+        });
+      }
+
+      //
+      // "private static String name;" fields:
+      //
+      TypeObject typeObject = typeDef.type as TypeObject;
+      List<TypeObjectField> fields = typeObject.fields;
+      for (TypeObjectField field in fields) {
+        privateField(javaName(field.name), () {
+          javadocComment(toHtmlVisitor.collectHtml(() {
+            toHtmlVisitor.translateHtml(field.html);
+          }));
+          writeln(
+              'private final ${javaType(field.type)} ${javaName(field.name)};');
+        });
+      }
+
+      //
+      // constructor
+      //
+      constructor(className, () {
+        javadocComment(toHtmlVisitor.collectHtml(() {
+          toHtmlVisitor.write('Constructor for {@link ${className}}.');
+        }));
+        write('public ${className}(');
+        // write out parameters to constructor
+        List<String> parameters = new List();
+        for (TypeObjectField field in fields) {
+          if (!_isTypeFieldInUpdateContentUnionType(className, field.name)) {
+            parameters.add('${javaType(field.type)} ${javaName(field.name)}');
+          }
+        }
+        write(parameters.join(', '));
+        writeln(') {');
+        // write out the assignments in the body of the constructor
+        for (TypeObjectField field in fields) {
+          if (!_isTypeFieldInUpdateContentUnionType(className, field.name)) {
+            writeln(
+                '  this.${javaName(field.name)} = ${javaName(field.name)};');
+          } else if (className == 'AddContentOverlay') {
+            writeln('  this.type = "add";');
+          } else if (className == 'ChangeContentOverlay') {
+            writeln('  this.type = "change";');
+          } else if (className == 'RemoveContentOverlay') {
+            writeln('  this.type = "remove";');
+          }
+        }
+        writeln('}');
+      });
+
+      //
+      // getter methods
+      //
+      for (TypeObjectField field in fields) {
+        publicMethod('get${javaName(field.name)}', () {
+          javadocComment(toHtmlVisitor.collectHtml(() {
+            toHtmlVisitor.translateHtml(field.html);
+          }));
+          if (javaType(field.type) == 'Boolean') {
+            writeln(
+                'public ${javaType(field.type)} ${javaName(field.name)}() {');
+          } else {
+            writeln(
+                'public ${javaType(field.type)} get${capitalize(javaName(field.name))}() {');
+          }
+          writeln('  return ${javaName(field.name)};');
+          writeln('}');
+        });
+      }
+
+      //
+      // fromJson(JsonObject) factory constructor, example:
+//      public JsonObject toJson(JsonObject jsonObject) {
+//          String x = jsonObject.get("x").getAsString();
+//          return new Y(x);
+//        }
+      publicMethod('fromJson', () {
+        writeln('public static ${className} fromJson(JsonObject jsonObject) {');
+        indent(() {
+          for (TypeObjectField field in fields) {
+            write('${javaType(field.type)} ${javaName(field.name)} = ');
+            if (field.optional) {
+              write(
+                  'jsonObject.get("${javaName(field.name)}") == null ? null : ');
+            }
+            if (isDeclaredInSpec(field.type)) {
+              write('${javaType(field.type)}.fromJson(');
+              write(
+                  'jsonObject.get("${javaName(field.name)}").getAsJsonObject())');
+            } else {
+              if (isList(field.type)) {
+                if (javaType(field.type).endsWith('<String>')) {
+                  write(
+                      'JsonUtilities.decodeStringList(jsonObject.get("${javaName(field.name)}").${_getAsTypeMethodName(field.type)}())');
+                } else {
+                  write(
+                      '${javaType((field.type as TypeList).itemType)}.fromJsonArray(jsonObject.get("${javaName(field.name)}").${_getAsTypeMethodName(field.type)}())');
+                }
+              } else if (isArray(field.type)) {
+                if (javaType(field.type).startsWith('Integer')) {
+                  write(
+                      'JsonUtilities.decodeIntegerArray(jsonObject.get("${javaName(field.name)}").${_getAsTypeMethodName(field.type)}())');
+                }
+              } else {
+                write(
+                    'jsonObject.get("${javaName(field.name)}").${_getAsTypeMethodName(field.type)}()');
+              }
+            }
+            writeln(';');
+          }
+          write('return new ${className}(');
+          List<String> parameters = new List();
+          for (TypeObjectField field in fields) {
+            if (!_isTypeFieldInUpdateContentUnionType(className, field.name)) {
+              parameters.add('${javaName(field.name)}');
+            }
+          }
+          write(parameters.join(', '));
+          writeln(');');
+        });
+        writeln('}');
+      });
+
+      //
+      // fromJson(JsonArray) factory constructor
+      //
+      publicMethod('fromJsonArray', () {
+        writeln(
+            'public static List<${className}> fromJsonArray(JsonArray jsonArray) {');
+        indent(() {
+          writeln('if (jsonArray == null) {');
+          writeln('  return EMPTY_LIST;');
+          writeln('}');
+          writeln(
+              'ArrayList<${className}> list = new ArrayList<${className}>(jsonArray.size());');
+          writeln('Iterator<JsonElement> iterator = jsonArray.iterator();');
+          writeln('while (iterator.hasNext()) {');
+          writeln('  list.add(fromJson(iterator.next().getAsJsonObject()));');
+          writeln('}');
+          writeln('return list;');
+        });
+        writeln('}');
+      });
+
+      //
+      // toJson() method, example:
+//      public JsonObject toJson() {
+//          JsonObject jsonObject = new JsonObject();
+//          jsonObject.addProperty("x", x);
+//          jsonObject.addProperty("y", y);
+//          return jsonObject;
+//        }
+      publicMethod('toJson', () {
+        writeln('public JsonObject toJson() {');
+        indent(() {
+          writeln('JsonObject jsonObject = new JsonObject();');
+          for (TypeObjectField field in fields) {
+            if (!isObject(field.type)) {
+              if (field.optional) {
+                writeln('if (${javaName(field.name)} != null) {');
+                indent(() {
+                  _writeOutJsonObjectAddStatement(field);
+                });
+                writeln('}');
+              } else {
+                _writeOutJsonObjectAddStatement(field);
+              }
+            }
+          }
+          writeln('return jsonObject;');
+        });
+        writeln('}');
+      });
+
+      //
+      // equals() method
+      //
+      publicMethod('equals', () {
+        writeln('@Override');
+        writeln('public boolean equals(Object obj) {');
+        indent(() {
+          writeln('if (obj instanceof ${className}) {');
+          indent(() {
+            writeln('${className} other = (${className}) obj;');
+            writeln('return');
+            indent(() {
+              List<String> equalsForField = new List<String>();
+              for (TypeObjectField field in fields) {
+                equalsForField.add(_equalsLogicForField(field, 'other'));
+              }
+              write(equalsForField.join(' && \n'));
+            });
+            writeln(';');
+          });
+          writeln('}');
+          writeln('return false;');
+        });
+        writeln('}');
+      });
+
+      //
+      // containsInclusive(int x)
+      //
+      if (className == 'HighlightRegion' ||
+          className == 'NavigationRegion' ||
+          className == 'Outline') {
+        publicMethod('containsInclusive', () {
+          writeln('public boolean containsInclusive(int x) {');
+          indent(() {
+            writeln('return offset <= x && x <= offset + length;');
+          });
+          writeln('}');
+        });
+      }
+
+      //
+      // contains(int x)
+      //
+      if (className == 'Occurrences') {
+        publicMethod('contains', () {
+          writeln('public boolean contains(int x) {');
+          indent(() {
+            writeln('for (int offset : offsets) {');
+            writeln('  if (offset <= x && x < offset + length) {');
+            writeln('    return true;');
+            writeln('  }');
+            writeln('}');
+            writeln('return false;');
+          });
+          writeln('}');
+        });
+      }
+
+      //
+      // hashCode
+      //
+      publicMethod('hashCode', () {
+        writeln('@Override');
+        writeln('public int hashCode() {');
+        indent(() {
+          writeln('HashCodeBuilder builder = new HashCodeBuilder();');
+          for (int i = 0; i < fields.length; i++) {
+            writeln("builder.append(${javaName(fields[i].name)});");
+          }
+          writeln('return builder.toHashCode();');
+        });
+        writeln('}');
+      });
+
+      //
+      // toString
+      //
+      publicMethod('toString', () {
+        writeln('@Override');
+        writeln('public String toString() {');
+        indent(() {
+          writeln('StringBuilder builder = new StringBuilder();');
+          writeln('builder.append(\"[\");');
+          for (int i = 0; i < fields.length; i++) {
+            writeln("builder.append(\"${javaName(fields[i].name)}=\");");
+            write("builder.append(${_toStringForField(fields[i])}");
+            if (i + 1 != fields.length) {
+              // this is not the last field
+              write(' + \", \"');
+            }
+            writeln(');');
+          }
+          writeln('builder.append(\"]\");');
+          writeln('return builder.toString();');
+        });
+        writeln('}');
+      });
+
+      //
+      // Extra methods for the Element type such as:
+      // public boolean isFinal() {
+      //   return (flags & FINAL) != 0;
+      // }
+      //
+      if (className == 'Element') {
+        _extraMethodsOnElement.forEach((String methodName, String fieldName) {
+          publicMethod(methodName, () {
+            writeln('public boolean ${methodName}() {');
+            writeln('  return (flags & ${fieldName}) != 0;');
+            writeln('}');
+          });
+        });
+      }
+
+    });
+  }
+
+  void _writeTypeEnum(TypeDefinition typeDef) {
+    javadocComment(toHtmlVisitor.collectHtml(() {
+      toHtmlVisitor.translateHtml(typeDef.html);
+      toHtmlVisitor.br();
+      toHtmlVisitor.write('@coverage dart.server.generated.types');
+    }));
+    makeClass('public class ${className}', () {
+      TypeEnum typeEnum = typeDef.type as TypeEnum;
+      List<TypeEnumValue> values = typeEnum.values;
+      //
+      // enum fields
+      //
+      for (TypeEnumValue value in values) {
+        privateField(javaName(value.value), () {
+          javadocComment(toHtmlVisitor.collectHtml(() {
+            toHtmlVisitor.translateHtml(value.html);
+          }));
+          writeln(
+              'public static final String ${value.value} = \"${value.value}\";');
+        });
+      }
+    });
+  }
+
+  String _equalsLogicForField(TypeObjectField field, String other) {
+    String name = javaName(field.name);
+    if (isPrimitive(field.type)) {
+      return '${other}.${name} == ${name}';
+    } else if (isArray(field.type)) {
+      return 'Arrays.equals(other.${name}, ${name})';
+    } else {
+      return 'ObjectUtilities.equals(${other}.${name}, ${name})';
+    }
+  }
+
+  bool _isTypeFieldInUpdateContentUnionType(String className,
+      String fieldName) {
+    if ((className == 'AddContentOverlay' ||
+        className == 'ChangeContentOverlay' ||
+        className == 'RemoveContentOverlay') &&
+        fieldName == 'type') {
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  String _getAsTypeMethodName(TypeDecl typeDecl) {
+    String name = javaType(typeDecl);
+    if (name == 'String') {
+      return 'getAsString';
+    } else if (name == 'Boolean') {
+      return 'getAsBoolean';
+    } else if (name == 'Integer') {
+      return 'getAsInt';
+    } else if (name.startsWith('List')) {
+      return 'getAsJsonArray';
+    } else {
+      // TODO (jwren) cleanup
+      return 'getAsJsonArray';
+    }
+  }
+
+  String _toStringForField(TypeObjectField field) {
+    String name = javaName(field.name);
+    if (isArray(field.type) || isList(field.type)) {
+      return 'StringUtils.join(${name}, ", ")';
+    } else {
+      return name;
+    }
+  }
+
+  void _writeOutJsonObjectAddStatement(TypeObjectField field) {
+    String name = javaName(field.name);
+    if (isDeclaredInSpec(field.type)) {
+      writeln('jsonObject.add("${name}", ${name}.toJson());');
+    } else if (field.type is TypeList) {
+      TypeDecl listItemType = (field.type as TypeList).itemType;
+      String jsonArrayName = 'jsonArray${capitalize(name)}';
+      writeln('JsonArray ${jsonArrayName} = new JsonArray();');
+      writeln('for(${javaType(listItemType)} elt : ${name}) {');
+      indent(() {
+        if (isDeclaredInSpec(listItemType)) {
+          writeln('${jsonArrayName}.add(elt.toJson());');
+        } else {
+          writeln('${jsonArrayName}.add(new JsonPrimitive(elt));');
+        }
+      });
+      writeln('}');
+      writeln('jsonObject.add("${name}", ${jsonArrayName});');
+    } else {
+      writeln('jsonObject.addProperty("${name}", ${name});');
+    }
+  }
+
+  /**
+   * Get the name of the consumer class for responses to this request.
+   */
+  String consumerName(Request request) {
+    return camelJoin([request.method, 'consumer'], doCapitalize: true);
+  }
+}
+
+final String pathToGenTypes =
+    '../../../../editor/tools/plugins/com.google.dart.server/src/com/google/dart/server/generated/types/';
+
+final GeneratedDirectory targetDir = new GeneratedDirectory(pathToGenTypes, () {
+  Api api = readApi();
+  Map<String, FileContentsComputer> map =
+      new Map<String, FileContentsComputer>();
+  for (String typeNameInSpec in api.types.keys) {
+    TypeDefinition typeDef = api.types[typeNameInSpec];
+    if (typeDef.type is TypeObject || typeDef.type is TypeEnum) {
+      // This is for situations such as 'Override' where the name in the spec
+      // doesn't match the java object that we generate:
+      String typeNameInJava = typeNameInSpec;
+      if (_typeRenames.containsKey(typeNameInSpec)) {
+        typeNameInJava = _typeRenames[typeNameInSpec];
+      }
+      map['${typeNameInJava}.java'] = () {
+        // create the visitor
+        CodegenJavaType visitor = new CodegenJavaType(api, typeNameInJava);
+        return visitor.collectCode(() {
+          visitor.visitTypeDefinition(typeDef);
+        });
+      };
+    }
+  }
+  return map;
+});
+
+/**
+ * Translate spec_input.html into AnalysisServer.java.
+ */
+main() {
+  targetDir.generate();
+}
diff --git a/pkg/analysis_server/tool/spec/codegen_matchers.dart b/pkg/analysis_server/tool/spec/codegen_matchers.dart
index e2e62fb..9795510 100644
--- a/pkg/analysis_server/tool/spec/codegen_matchers.dart
+++ b/pkg/analysis_server/tool/spec/codegen_matchers.dart
@@ -8,11 +8,11 @@
 library codegen.matchers;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'api.dart';
 import 'codegen_tools.dart';
 import 'from_html.dart';
+import 'implied_types.dart';
 import 'to_html.dart';
 
 class CodegenMatchersVisitor extends HierarchicalApiVisitor with CodeGenerator {
@@ -36,27 +36,21 @@
    * clarified by [nameSuffix].  The matcher should verify that its input
    * matches the given [type].
    */
-  void makeMatcher(String name, String nameSuffix, TypeDecl type) {
-    context = name;
-    List<String> nameParts = ['is'];
-    nameParts.addAll(name.split('.'));
-    if (nameSuffix != null) {
-      context += ' $nameSuffix';
-      nameParts.add(nameSuffix);
-    }
+  void makeMatcher(ImpliedType impliedType) {
+    context = impliedType.humanReadableName;
     docComment(toHtmlVisitor.collectHtml(() {
       toHtmlVisitor.p(() {
         toHtmlVisitor.write(context);
       });
-      if (type != null) {
-        toHtmlVisitor.showType(null, type);
+      if (impliedType.type != null) {
+        toHtmlVisitor.showType(null, impliedType.type);
       }
     }));
-    write('final Matcher ${camelJoin(nameParts)} = ');
-    if (type == null) {
+    write('final Matcher ${camelJoin(['is', impliedType.camelName])} = ');
+    if (impliedType.type == null) {
       write('isNull');
     } else {
-      visitTypeDecl(type);
+      visitTypeDecl(impliedType.type);
     }
     writeln(';');
     writeln();
@@ -76,30 +70,9 @@
     writeln("import 'integration_tests.dart';");
     writeln();
     writeln();
-    super.visitApi();
-  }
-
-  @override
-  visitNotification(Notification notification) {
-    makeMatcher(notification.longEvent, 'params', notification.params);
-  }
-
-  @override
-  visitRequest(Request request) {
-    makeMatcher(request.longMethod, 'params', request.params);
-    makeMatcher(request.longMethod, 'result', request.result);
-  }
-
-  @override
-  visitRefactoring(Refactoring refactoring) {
-    String camelKind = camelJoin(refactoring.kind.toLowerCase().split('_'));
-    makeMatcher(camelKind, 'feedback', refactoring.feedback);
-    makeMatcher(camelKind, 'options', refactoring.options);
-  }
-
-  @override
-  visitTypeDefinition(TypeDefinition typeDefinition) {
-    makeMatcher(typeDefinition.name, null, typeDefinition.type);
+    for (ImpliedType impliedType in computeImpliedTypes(api).values) {
+      makeMatcher(impliedType);
+    }
   }
 
   @override
@@ -137,7 +110,7 @@
 
   @override
   void visitTypeObject(TypeObject typeObject) {
-    writeln('new MatchesJsonObject(');
+    writeln('new LazyMatcher(() => new MatchesJsonObject(');
     indent(() {
       write('${JSON.encode(context)}, ');
       Iterable<TypeObjectField> requiredFields = typeObject.fields.where(
@@ -150,7 +123,7 @@
         outputObjectFields(optionalFields);
       }
     });
-    write(')');
+    write('))');
   }
 
   /**
@@ -187,14 +160,31 @@
   void visitTypeReference(TypeReference typeReference) {
     write(camelJoin(['is', typeReference.typeName]));
   }
+
+  @override
+  void visitTypeUnion(TypeUnion typeUnion) {
+    bool commaNeeded = false;
+    write('isOneOf([');
+    for (TypeDecl choice in typeUnion.choices) {
+      if (commaNeeded) {
+        write(', ');
+      }
+      visitTypeDecl(choice);
+      commaNeeded = true;
+    }
+    write('])');
+  }
 }
 
+final GeneratedFile target = new GeneratedFile(
+    '../../test/integration/protocol_matchers.dart', () {
+  CodegenMatchersVisitor visitor = new CodegenMatchersVisitor(readApi());
+  return visitor.collectCode(visitor.visitApi);
+});
+
 /**
  * Translate spec_input.html into protocol_matchers.dart.
  */
 main() {
-  CodegenMatchersVisitor visitor = new CodegenMatchersVisitor(readApi());
-  String code = visitor.collectCode(visitor.visitApi);
-  File outputFile = new File('../../test/integration/protocol_matchers.dart');
-  outputFile.writeAsStringSync(code);
+  target.generate();
 }
diff --git a/pkg/analysis_server/tool/spec/codegen_tools.dart b/pkg/analysis_server/tool/spec/codegen_tools.dart
index 53db1db..4c1210c 100644
--- a/pkg/analysis_server/tool/spec/codegen_tools.dart
+++ b/pkg/analysis_server/tool/spec/codegen_tools.dart
@@ -7,27 +7,37 @@
  */
 library codegen.tools;
 
+import 'dart:io';
+
 import 'package:html5lib/dom.dart' as dom;
+import 'package:path/path.dart';
 
 import 'text_formatter.dart';
 import 'html_tools.dart';
 
 /**
- * Join the given strings using camelCase.  If [capitalize] is true, the first
+ * Join the given strings using camelCase.  If [doCapitalize] is true, the first
  * part will be capitalized as well.
  */
-String camelJoin(List<String> parts, {bool capitalize: false}) {
+String camelJoin(List<String> parts, {bool doCapitalize: false}) {
   List<String> upcasedParts = <String>[];
   for (int i = 0; i < parts.length; i++) {
-    if (i == 0 && !capitalize) {
+    if (i == 0 && !doCapitalize) {
       upcasedParts.add(parts[i]);
     } else {
-      upcasedParts.add(parts[i][0].toUpperCase() + parts[i].substring(1));
+      upcasedParts.add(capitalize(parts[i]));
     }
   }
   return upcasedParts.join();
 }
 
+/**
+ * Capitalize and return the passed String.
+ */
+String capitalize(String string) {
+  return string[0].toUpperCase() + string.substring(1);
+}
+
 final RegExp trailingWhitespaceRegExp = new RegExp(r' +$', multiLine: true);
 
 /**
@@ -73,8 +83,8 @@
   /**
    * Execute [callback], using [additionalIndent] to indent any code it outputs.
    */
-  void indentBy(String additionalIndent, void callback()) => indentSpecial(
-      additionalIndent, additionalIndent, callback);
+  void indentBy(String additionalIndent, void callback()) =>
+      indentSpecial(additionalIndent, additionalIndent, callback);
 
   /**
    * Execute [callback], using [additionalIndent] to indent any code it outputs.
@@ -106,7 +116,11 @@
    * If [javadocStyle] is true, then the output is compatable with Javadoc,
    * which understands certain HTML constructs.
    */
-  void docComment(List<dom.Node> docs, {int width: 79, bool javadocStyle: false}) {
+  void docComment(List<dom.Node> docs, {int width: 79, bool javadocStyle:
+      false}) {
+    if (containsOnlyWhitespace(docs)) {
+      return;
+    }
     writeln('/**');
     indentBy(' * ', () {
       write(nodesToText(docs, width - _state.indent.length, javadocStyle));
@@ -116,7 +130,7 @@
 
   void outputHeader({bool javaStyle: false}) {
     String header;
-    if(javaStyle) {
+    if (javaStyle) {
       header = '''
 /*
  * Copyright (c) 2014, the Dart project authors.
@@ -134,8 +148,7 @@
  * This file has been automatically generated.  Please do not edit it manually.
  * To regenerate the file, use the script "pkg/analysis_server/spec/generate_files".
  */''';
-    }
-    else {
+    } else {
       header = '''
 // 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
@@ -290,3 +303,158 @@
     }
   }
 }
+
+/**
+ * Type of functions used to compute the contents of a generated file.
+ */
+typedef String FileContentsComputer();
+
+/**
+ * Type of functions used to compute the contents of a set of generated files.
+ */
+typedef Map<String, FileContentsComputer> DirectoryContentsComputer();
+
+abstract class GeneratedContent {
+  FileSystemEntity get outputFile;
+  bool check();
+  void generate();
+}
+
+/**
+ * Class representing a single output file (either generated code or generated
+ * HTML).
+ */
+class GeneratedFile extends GeneratedContent {
+  /**
+   * The output file to which generated output should be written, relative to
+   * the "tool/spec" directory.  This filename uses the posix path separator
+   * ('/') regardless of the OS.
+   */
+  final String outputPath;
+
+  /**
+   * Callback function which computes the file.
+   */
+  final FileContentsComputer computeContents;
+
+  GeneratedFile(this.outputPath, this.computeContents);
+
+  /**
+   * Get a File object representing the output file.
+   */
+  File get outputFile => new File(joinAll(posix.split(outputPath)));
+
+  /**
+   * Check whether the file has the correct contents, and return true if it
+   * does.
+   */
+  @override
+  bool check() {
+    String expectedContents = computeContents();
+    try {
+      return expectedContents == outputFile.readAsStringSync();
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+  }
+
+  /**
+   * Replace the file with the correct contents.  [spec] is the "tool/spec"
+   * directory.  If [spec] is unspecified, it is assumed to be the directory
+   * containing Platform.executable.
+   */
+  void generate() {
+    outputFile.writeAsStringSync(computeContents());
+  }
+}
+
+/**
+ * Class representing a single output directory (either generated code or
+ * generated HTML). No other content should exisit in the directory.
+ */
+class GeneratedDirectory extends GeneratedContent {
+
+  /**
+   * The path to the directory that will have the generated content.
+   */
+  final String outputDirPath;
+
+  /**
+   * Callback function which computes the directory contents.
+   */
+  final DirectoryContentsComputer directoryContentsComputer;
+
+  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
+
+  /**
+   * Get a Directory object representing the output directory.
+   */
+  Directory get outputFile =>
+      new Directory(joinAll(posix.split(outputDirPath)));
+
+  /**
+   * Check whether the directory has the correct contents, and return true if it
+   * does.
+   */
+  @override
+  bool check() {
+    Map<String, FileContentsComputer> map = directoryContentsComputer();
+    try {
+      map.forEach((String file, FileContentsComputer fileContentsComputer) {
+        String expectedContents = fileContentsComputer();
+        File outputFile =
+            new File(joinAll(posix.split(posix.join(outputDirPath, file))));
+        if (expectedContents != outputFile.readAsStringSync()) {
+          return false;
+        }
+      });
+      int nonHiddenFileCount = 0;
+      outputFile.listSync(
+          recursive: false,
+          followLinks: false).forEach((FileSystemEntity fileSystemEntity) {
+         if(fileSystemEntity is File && !basename(fileSystemEntity.path).startsWith('.')) {
+           nonHiddenFileCount++;
+         }
+      });
+      if (nonHiddenFileCount != map.length) {
+        // The number of files generated doesn't match the number we expected to
+        // generate.
+        return false;
+      }
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Replace the directory with the correct contents.  [spec] is the "tool/spec"
+   * directory.  If [spec] is unspecified, it is assumed to be the directory
+   * containing Platform.executable.
+   */
+  @override
+  void generate() {
+    try {
+      // delete the contents of the directory (and the directory itself)
+      outputFile.deleteSync(recursive: true);
+    } catch (e) {
+      // Error caught while trying to delete the directory, this can happen if
+      // it didn't yet exist.
+    }
+    // re-create the empty directory
+    outputFile.createSync(recursive: true);
+
+    // generate all of the files in the directory
+    Map<String, FileContentsComputer> map = directoryContentsComputer();
+    map.forEach((String file, FileContentsComputer fileContentsComputer) {
+      File outputFile = new File(joinAll(posix.split(outputDirPath + file)));
+      outputFile.writeAsStringSync(fileContentsComputer());
+    });
+  }
+}
diff --git a/pkg/analysis_server/tool/spec/from_html.dart b/pkg/analysis_server/tool/spec/from_html.dart
index 868f17e..ed3c287 100644
--- a/pkg/analysis_server/tool/spec/from_html.dart
+++ b/pkg/analysis_server/tool/spec/from_html.dart
@@ -18,9 +18,13 @@
 /**
  * Check that the given [element] has the given [expectedName].
  */
-void checkName(dom.Element element, String expectedName) {
+void checkName(dom.Element element, String expectedName, [String context]) {
   if (element.localName != expectedName) {
-    throw new Exception('Expected $expectedName, found ${element.localName}');
+    if (context == null) {
+      context = element.localName;
+    }
+    throw new Exception(
+        '$context: Expected $expectedName, found ${element.localName}');
   }
 }
 
@@ -30,37 +34,38 @@
  * [optionalAttributes], and no others.
  */
 void checkAttributes(dom.Element element, List<String>
-    requiredAttributes, {List<String> optionalAttributes: const []}) {
+    requiredAttributes, String context, {List<String> optionalAttributes: const []})
+    {
   Set<String> attributesFound = new Set<String>();
   element.attributes.forEach((String name, String value) {
     if (!requiredAttributes.contains(name) && !optionalAttributes.contains(name
         )) {
-      throw new Exception('Unexpected attribute in ${element.localName}: $name'
-          );
+      throw new Exception(
+          '$context: Unexpected attribute in ${element.localName}: $name');
     }
     attributesFound.add(name);
   });
   for (String expectedAttribute in requiredAttributes) {
     if (!attributesFound.contains(expectedAttribute)) {
       throw new Exception(
-          '${element.localName} must contain attribute ${expectedAttribute}');
+          '$context: ${element.localName} must contain attribute ${expectedAttribute}');
     }
   }
 }
 
-const List<String> specialElements = const ['domain', 'feedback',
-    'object', 'refactorings', 'refactoring', 'type', 'types', 'request',
-    'notification', 'params', 'result', 'field', 'list', 'map', 'enum', 'key',
-    'value', 'options', 'ref', 'code', 'version'];
+const List<String> specialElements = const ['domain', 'feedback', 'object',
+    'refactorings', 'refactoring', 'type', 'types', 'request', 'notification',
+    'params', 'result', 'field', 'list', 'map', 'enum', 'key', 'value', 'options',
+    'ref', 'code', 'version', 'union'];
 
 typedef void ElementProcessor(dom.Element element);
 typedef void TextProcessor(dom.Text text);
 
-void recurse(dom.Element parent, Map<String, ElementProcessor>
+void recurse(dom.Element parent, String context, Map<String, ElementProcessor>
     elementProcessors) {
   for (String key in elementProcessors.keys) {
     if (!specialElements.contains(key)) {
-      throw new Exception('$key is not a special element');
+      throw new Exception('$context: $key is not a special element');
     }
   }
   for (dom.Node node in parent.nodes) {
@@ -68,15 +73,15 @@
       if (elementProcessors.containsKey(node.localName)) {
         elementProcessors[node.localName](node);
       } else if (specialElements.contains(node.localName)) {
-        throw new Exception('Unexpected use of <${node.localName}');
+        throw new Exception('$context: Unexpected use of <${node.localName}');
       } else {
-        recurse(node, elementProcessors);
+        recurse(node, context, elementProcessors);
       }
     }
   }
 }
 
-dom.Element getAncestor(dom.Element html, String name) {
+dom.Element getAncestor(dom.Element html, String name, String context) {
   dom.Element ancestor = html.parent;
   while (ancestor != null) {
     if (ancestor.localName == name) {
@@ -84,7 +89,8 @@
     }
     ancestor = ancestor.parent;
   }
-  throw new Exception('<${html.localName}> must be nested within <$name>');
+  throw new Exception(
+      '$context: <${html.localName}> must be nested within <$name>');
 }
 
 /**
@@ -108,7 +114,7 @@
   List<Domain> domains = <Domain>[];
   Types types = null;
   Refactorings refactorings = null;
-  recurse(html, {
+  recurse(html, 'api', {
     'domain': (dom.Element element) {
       domains.add(domainFromHtml(element));
     },
@@ -138,9 +144,10 @@
  */
 Refactorings refactoringsFromHtml(dom.Element html) {
   checkName(html, 'refactorings');
-  checkAttributes(html, []);
+  String context = 'refactorings';
+  checkAttributes(html, [], context);
   List<Refactoring> refactorings = <Refactoring>[];
-  recurse(html, {
+  recurse(html, context, {
     'refactoring': (dom.Element child) {
       refactorings.add(refactoringFromHtml(child));
     }
@@ -163,16 +170,17 @@
  */
 Refactoring refactoringFromHtml(dom.Element html) {
   checkName(html, 'refactoring');
-  checkAttributes(html, ['kind']);
   String kind = html.attributes['kind'];
+  String context = kind != null ? kind : 'refactoring';
+  checkAttributes(html, ['kind'], context);
   TypeDecl feedback;
   TypeDecl options;
-  recurse(html, {
+  recurse(html, context, {
     'feedback': (dom.Element child) {
-      feedback = typeObjectFromHtml(child);
+      feedback = typeObjectFromHtml(child, '$context.feedback');
     },
     'options': (dom.Element child) {
-      options = typeObjectFromHtml(child);
+      options = typeObjectFromHtml(child, '$context.options');
     }
   });
   return new Refactoring(kind, feedback, options, html);
@@ -187,9 +195,10 @@
  */
 Types typesFromHtml(dom.Element html) {
   checkName(html, 'types');
-  checkAttributes(html, []);
+  String context = 'types';
+  checkAttributes(html, [], context);
   Map<String, TypeDefinition> types = <String, TypeDefinition> {};
-  recurse(html, {
+  recurse(html, context, {
     'type': (dom.Element child) {
       TypeDefinition typeDefinition = typeDefinitionFromHtml(child);
       types[typeDefinition.name] = typeDefinition;
@@ -211,9 +220,10 @@
  */
 TypeDefinition typeDefinitionFromHtml(dom.Element html) {
   checkName(html, 'type');
-  checkAttributes(html, ['name']);
   String name = html.attributes['name'];
-  TypeDecl type = processContentsAsType(html);
+  String context = name != null ? name : 'type';
+  checkAttributes(html, ['name'], context);
+  TypeDecl type = processContentsAsType(html, context);
   return new TypeDefinition(name, type, html);
 }
 
@@ -229,16 +239,17 @@
  */
 Domain domainFromHtml(dom.Element html) {
   checkName(html, 'domain');
-  checkAttributes(html, ['name']);
   String name = html.attributes['name'];
+  String context = name != null ? name : 'domain';
+  checkAttributes(html, ['name'], context);
   List<Request> requests = <Request>[];
   List<Notification> notifications = <Notification>[];
-  recurse(html, {
+  recurse(html, context, {
     'request': (dom.Element child) {
-      requests.add(requestFromHtml(child));
+      requests.add(requestFromHtml(child, context));
     },
     'notification': (dom.Element child) {
-      notifications.add(notificationFromHtml(child));
+      notifications.add(notificationFromHtml(child, context));
     }
   });
   return new Domain(name, requests, notifications, html);
@@ -259,19 +270,20 @@
  *
  * Child elements can occur in any order.
  */
-Request requestFromHtml(dom.Element html) {
-  String domainName = getAncestor(html, 'domain').attributes['name'];
-  checkName(html, 'request');
-  checkAttributes(html, ['method']);
+Request requestFromHtml(dom.Element html, String context) {
+  String domainName = getAncestor(html, 'domain', context).attributes['name'];
+  checkName(html, 'request', context);
   String method = html.attributes['method'];
+  context = '$context.${method != null ? method : 'method'}';
+  checkAttributes(html, ['method'], context);
   TypeDecl params;
   TypeDecl result;
-  recurse(html, {
+  recurse(html, context, {
     'params': (dom.Element child) {
-      params = typeObjectFromHtml(child);
+      params = typeObjectFromHtml(child, '$context.params');
     },
     'result': (dom.Element child) {
-      result = typeObjectFromHtml(child);
+      result = typeObjectFromHtml(child, '$context.result');
     }
   });
   return new Request(domainName, method, params, result, html);
@@ -290,23 +302,35 @@
  *
  * Child elements can occur in any order.
  */
-Notification notificationFromHtml(dom.Element html) {
-  String domainName = getAncestor(html, 'domain').attributes['name'];
-  checkName(html, 'notification');
-  checkAttributes(html, ['event']);
+Notification notificationFromHtml(dom.Element html, String context) {
+  String domainName = getAncestor(html, 'domain', context).attributes['name'];
+  checkName(html, 'notification', context);
   String event = html.attributes['event'];
+  context = '$context.${event != null ? event : 'event'}';
+  checkAttributes(html, ['event'], context);
   TypeDecl params;
-  recurse(html, {
+  recurse(html, context, {
     'params': (dom.Element child) {
-      params = typeObjectFromHtml(child);
+      params = typeObjectFromHtml(child, '$context.params');
     }
   });
   return new Notification(domainName, event, params, html);
 }
+/**
+ * Create a single of [TypeDecl] corresponding to the type defined inside the
+ * given HTML element.
+ */
+TypeDecl processContentsAsType(dom.Element html, String context) {
+  List<TypeDecl> types = processContentsAsTypes(html, context);
+  if (types.length != 1) {
+    throw new Exception('$context: Exactly one type must be specified');
+  }
+  return types[0];
+}
 
 /**
- * Create a [TypeDecl] from an HTML description.  The following forms are
- * supported.
+ * Create a list of [TypeDecl]s corresponding to the types defined inside the
+ * given HTML element.  The following forms are supported.
  *
  * To refer to a type declared elsewhere (or a built-in type):
  *
@@ -327,67 +351,75 @@
  *   <enum>
  *     <value>...</value> <!-- zero or more -->
  *   </enum>
+ *
+ * For a union type:
+ *   <union>
+ *     TYPE <!-- zero or more -->
+ *   </union>
  */
-TypeDecl processContentsAsType(dom.Element html) {
+List<TypeDecl> processContentsAsTypes(dom.Element html, String context) {
   List<TypeDecl> types = <TypeDecl>[];
-  recurse(html, {
+  recurse(html, context, {
     'object': (dom.Element child) {
-      types.add(typeObjectFromHtml(child));
+      types.add(typeObjectFromHtml(child, context));
     },
     'list': (dom.Element child) {
-      checkAttributes(child, []);
-      types.add(new TypeList(processContentsAsType(child), child));
+      checkAttributes(child, [], context);
+      types.add(new TypeList(processContentsAsType(child, context), child));
     },
     'map': (dom.Element child) {
-      checkAttributes(child, []);
+      checkAttributes(child, [], context);
       TypeDecl keyType;
       TypeDecl valueType;
-      recurse(child, {
+      recurse(child, context, {
         'key': (dom.Element child) {
           if (keyType != null) {
-            throw new Exception('Key type already specified');
+            throw new Exception('$context: Key type already specified');
           }
-          keyType = processContentsAsType(child);
+          keyType = processContentsAsType(child, '$context.key');
         },
         'value': (dom.Element child) {
           if (valueType != null) {
-            throw new Exception('Value type already specified');
+            throw new Exception('$context: Value type already specified');
           }
-          valueType = processContentsAsType(child);
+          valueType = processContentsAsType(child, '$context.value');
         }
       });
       if (keyType == null) {
-        throw new Exception('Key type not specified');
+        throw new Exception('$context: Key type not specified');
       }
       if (valueType == null) {
-        throw new Exception('Value type not specified');
+        throw new Exception('$context: Value type not specified');
       }
       types.add(new TypeMap(keyType, valueType, child));
     },
     'enum': (dom.Element child) {
-      types.add(typeEnumFromHtml(child));
+      types.add(typeEnumFromHtml(child, context));
     },
     'ref': (dom.Element child) {
-      checkAttributes(child, []);
+      checkAttributes(child, [], context);
       types.add(new TypeReference(innerText(child), child));
+    },
+    'union': (dom.Element child) {
+      checkAttributes(child, ['field'], context);
+      String field = child.attributes['field'];
+      types.add(new TypeUnion(processContentsAsTypes(child, context), field,
+          child));
     }
   });
-  if (types.length != 1) {
-    throw new Exception('Exactly one type must be specified');
-  }
-  return types[0];
+  return types;
 }
 
 /**
  * Create a [TypeEnum] from an HTML description.
  */
-TypeEnum typeEnumFromHtml(dom.Element html) {
-  checkName(html, 'enum');
-  checkAttributes(html, []);
+TypeEnum typeEnumFromHtml(dom.Element html, String context) {
+  checkName(html, 'enum', context);
+  checkAttributes(html, [], context);
   List<TypeEnumValue> values = <TypeEnumValue>[];
-  recurse(html, {
+  recurse(html, context, {
     'value': (dom.Element child) {
-      values.add(typeEnumValueFromHtml(child));
+      values.add(typeEnumValueFromHtml(child, context));
     }
   });
   return new TypeEnum(values, html);
@@ -404,18 +436,18 @@
  *
  * Child elements can occur in any order.
  */
-TypeEnumValue typeEnumValueFromHtml(dom.Element html) {
-  checkName(html, 'value');
-  checkAttributes(html, []);
+TypeEnumValue typeEnumValueFromHtml(dom.Element html, String context) {
+  checkName(html, 'value', context);
+  checkAttributes(html, [], context);
   List<String> values = <String>[];
-  recurse(html, {
+  recurse(html, context, {
     'code': (dom.Element child) {
       String text = innerText(child).trim();
       values.add(text);
     }
   });
   if (values.length != 1) {
-    throw new Exception('Exactly one value must be specified');
+    throw new Exception('$context: Exactly one value must be specified');
   }
   return new TypeEnumValue(values[0], html);
 }
@@ -423,12 +455,12 @@
 /**
  * Create a [TypeObject] from an HTML description.
  */
-TypeObject typeObjectFromHtml(dom.Element html) {
-  checkAttributes(html, []);
+TypeObject typeObjectFromHtml(dom.Element html, String context) {
+  checkAttributes(html, [], context);
   List<TypeObjectField> fields = <TypeObjectField>[];
-  recurse(html, {
+  recurse(html, context, {
     'field': (dom.Element child) {
-      fields.add(typeObjectFieldFromHtml(child));
+      fields.add(typeObjectFieldFromHtml(child, context));
     }
   });
   return new TypeObject(fields, html);
@@ -449,10 +481,12 @@
  *
  * Child elements can occur in any order.
  */
-TypeObjectField typeObjectFieldFromHtml(dom.Element html) {
-  checkName(html, 'field');
-  checkAttributes(html, ['name'], optionalAttributes: ['optional', 'value']);
+TypeObjectField typeObjectFieldFromHtml(dom.Element html, String context) {
+  checkName(html, 'field', context);
   String name = html.attributes['name'];
+  context = '$context.${name != null ? name : 'field'}';
+  checkAttributes(html, ['name'], context, optionalAttributes: ['optional',
+      'value']);
   bool optional = false;
   String optionalString = html.attributes['optional'];
   if (optionalString != null) {
@@ -465,11 +499,11 @@
         break;
       default:
         throw new Exception(
-            'field contains invalid "optional" attribute: "$optionalString"');
+            '$context: field contains invalid "optional" attribute: "$optionalString"');
     }
   }
   String value = html.attributes['value'];
-  TypeDecl type = processContentsAsType(html);
+  TypeDecl type = processContentsAsType(html, context);
   return new TypeObjectField(name, type, html, optional: optional, value: value
       );
 }
diff --git a/pkg/analysis_server/tool/spec/generate_all.dart b/pkg/analysis_server/tool/spec/generate_all.dart
new file mode 100644
index 0000000..4a6c62a
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generate_all.dart
@@ -0,0 +1,42 @@
+// 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 generate.all;
+
+import 'dart:io';
+
+import 'package:path/path.dart';
+
+import 'codegen_tools.dart';
+import 'codegen_analysis_server.dart' as codegen_analysis_server;
+import 'codegen_dart_protocol.dart' as codegen_dart_protocol;
+import 'codegen_java_types.dart' as codegen_java_types;
+import 'codegen_inttest_methods.dart' as codegen_inttest_methods;
+import 'codegen_matchers.dart' as codegen_matchers;
+import 'to_html.dart' as to_html;
+
+/**
+ * Get a list of all generated targets.
+ */
+List<GeneratedContent> get allTargets {
+  List<GeneratedContent> targets = <GeneratedContent>[];
+  targets.add(codegen_analysis_server.target);
+  targets.add(codegen_dart_protocol.target);
+  targets.add(codegen_java_types.targetDir);
+  targets.add(codegen_inttest_methods.target);
+  targets.add(codegen_matchers.target);
+  targets.add(to_html.target);
+  return targets;
+}
+
+/**
+ * Generate all targets
+ */
+main() {
+  String script = Platform.script.toFilePath(windows: Platform.isWindows);
+  Directory.current = new Directory(dirname(script));
+  for (GeneratedContent generatedContent in allTargets) {
+    generatedContent.generate();
+  }
+}
diff --git a/pkg/analysis_server/tool/spec/generate_files b/pkg/analysis_server/tool/spec/generate_files
index 9b96b54..0c992fa 100755
--- a/pkg/analysis_server/tool/spec/generate_files
+++ b/pkg/analysis_server/tool/spec/generate_files
@@ -55,7 +55,4 @@
 VM_OPTIONS+=("--package-root=${PKG_DIR}")
 
 cd "${SCRIPT_DIR}"
-"${DART}" "${VM_OPTIONS[@]}" "to_html.dart"
-"${DART}" "${VM_OPTIONS[@]}" "codegen_matchers.dart"
-"${DART}" "${VM_OPTIONS[@]}" "codegen_inttest_methods.dart"
-"${DART}" "${VM_OPTIONS[@]}" "codegen_analysis_server.dart"
+"${DART}" "${VM_OPTIONS[@]}" "generate_all.dart"
diff --git a/pkg/analysis_server/tool/spec/html_tools.dart b/pkg/analysis_server/tool/spec/html_tools.dart
index 1dc83de..7ec6ffb 100644
--- a/pkg/analysis_server/tool/spec/html_tools.dart
+++ b/pkg/analysis_server/tool/spec/html_tools.dart
@@ -47,6 +47,32 @@
 }
 
 /**
+ * Return true if the given node is a text node containing only whitespace, or
+ * a comment.
+ */
+bool isWhitespaceNode(dom.Node node) {
+  if (node is dom.Element) {
+    return false;
+  } else if (node is dom.Text) {
+    return node.text.trim().isEmpty;
+  }
+  // Treat all other types of nodes (e.g. comments) as whitespace.
+  return true;
+}
+
+/**
+ * Return true if the given iterable contains only whitespace text nodes.
+ */
+bool containsOnlyWhitespace(Iterable<dom.Node> nodes) {
+  for (dom.Node node in nodes) {
+    if (!isWhitespaceNode(node)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
  * Mixin class for generating HTML.
  */
 class HtmlGenerator {
diff --git a/pkg/analysis_server/tool/spec/implied_types.dart b/pkg/analysis_server/tool/spec/implied_types.dart
new file mode 100644
index 0000000..46abf23
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/implied_types.dart
@@ -0,0 +1,90 @@
+// 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.
+
+/**
+ * Code for enumerating the set of types implied by the API.
+ */
+library html.tools;
+
+import 'api.dart';
+import 'codegen_tools.dart';
+
+class ImpliedType {
+  final String camelName;
+  final String humanReadableName;
+  final TypeDecl type;
+
+  /**
+   * Kind of implied type this is.  One of:
+   * - 'requestParams'
+   * - 'requestResult'
+   * - 'notificationParams'
+   * - 'refactoringFeedback'
+   * - 'refactoringOptions'
+   * - 'typeDefinition'
+   */
+  final String kind;
+
+  /**
+   * API node from which this type was inferred.
+   */
+  final ApiNode apiNode;
+
+  ImpliedType(this.camelName, this.humanReadableName, this.type, this.kind, this.apiNode);
+}
+
+Map<String, ImpliedType> computeImpliedTypes(Api api) {
+  _ImpliedTypesVisitor visitor = new _ImpliedTypesVisitor(api);
+  visitor.visitApi();
+  return visitor.impliedTypes;
+}
+
+class _ImpliedTypesVisitor extends HierarchicalApiVisitor {
+  Map<String, ImpliedType> impliedTypes = <String, ImpliedType> {};
+
+  _ImpliedTypesVisitor(Api api) : super(api);
+
+  void storeType(String name, String nameSuffix, TypeDecl type, String
+      kind, ApiNode apiNode) {
+    String humanReadableName = name;
+    List<String> camelNameParts = name.split('.');
+    if (nameSuffix != null) {
+      humanReadableName += ' $nameSuffix';
+      camelNameParts.add(nameSuffix);
+    }
+    String camelName = camelJoin(camelNameParts);
+    impliedTypes[camelName] = new ImpliedType(camelName, humanReadableName,
+        type, kind, apiNode);
+  }
+
+  @override
+  visitNotification(Notification notification) {
+    storeType(notification.longEvent, 'params', notification.params,
+        'notificationParams', notification);
+  }
+
+  @override
+  visitRequest(Request request) {
+    storeType(request.longMethod, 'params', request.params, 'requestParams',
+        request);
+    storeType(request.longMethod, 'result', request.result, 'requestResult',
+        request);
+  }
+
+  @override
+  visitRefactoring(Refactoring refactoring) {
+    String camelKind = camelJoin(refactoring.kind.toLowerCase().split('_'));
+    storeType(camelKind, 'feedback', refactoring.feedback,
+        'refactoringFeedback', refactoring);
+    storeType(camelKind, 'options', refactoring.options, 'refactoringOptions',
+        refactoring);
+  }
+
+  @override
+  visitTypeDefinition(TypeDefinition typeDefinition) {
+    storeType(typeDefinition.name, null, typeDefinition.type, 'typeDefinition',
+        typeDefinition);
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 7f85f81..3d0f074 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -202,7 +202,7 @@
           notification.
         </p>
         <params>
-          <field name="fatal">
+          <field name="isFatal">
             <ref>bool</ref>
             <p>
               True if the error is a fatal error, meaning that the
@@ -482,16 +482,17 @@
           <field name="files">
             <map>
               <key><ref>FilePath</ref></key>
-              <value><ref>object</ref></value>
+              <value>
+                <union field="type">
+                  <ref>AddContentOverlay</ref>
+                  <ref>ChangeContentOverlay</ref>
+                  <ref>RemoveContentOverlay</ref>
+                </union>
+              </value>
             </map>
             <p>
               A table mapping the files whose content has changed to a
-              description of the content change.  Each value should be
-              one of the following types: <a
-              href="#type_AddContentOverlay">AddContentOverlay</a>, <a
-              href="#type_ChangeContentOverlay">ChangeContentOverlay</a>,
-              or <a
-              href="#type_RemoveContentOverlay">RemoveContentOverlay</a>.
+              description of the content change.
             </p>
           </field>
         </params>
@@ -501,9 +502,8 @@
           Update the options controlling analysis based on the given
           set of options. Any options that are not included in the
           analysis options will not be changed. If there are options
-          in the analysis options that are not valid an error will be
-          reported but the values of the valid options will still be
-          updated.
+          in the analysis options that are not valid, they will be
+          silently ignored.
         </p>
         <params>
           <field name="options">
@@ -712,10 +712,7 @@
       </notification>
       <notification event="overrides">
         <p>
-          Reports the overridding members in a file. This notification
-          currently includes only members that override a member from
-          a superclass. In particular, it does not include members
-          that override members from interfaces.
+          Reports the overridding members in a file.
         </p>
         <p>
           This notification is not subscribed to by default. Clients
@@ -812,10 +809,15 @@
           <field name="results">
             <list><ref>CompletionSuggestion</ref></list>
             <p>
-              The completion suggestions being reported.
+              The completion suggestions being reported.  The
+              notification contains all possible completions at the
+              requested cursor position, even those that do not match
+              the characters the user has already typed.  This allows
+              the client to respond to further keystrokes from the
+              user without having to make additional requests.
             </p>
           </field>
-          <field name="last">
+          <field name="isLast">
             <ref>bool</ref>
             <p>
               True if this is that last set of results that will be
@@ -871,13 +873,17 @@
               search request.
             </p>
           </field>
-          <field name="element">
+          <field name="element" optional="true">
             <ref>Element</ref>
             <p>
               The element referenced or defined at the given offset
               and whose references will be returned in the search
               results.
             </p>
+            <p>
+              If no element was found at the given location, this
+              field will be absent.
+            </p>
           </field>
         </result>
       </request>
@@ -1030,7 +1036,7 @@
               The search results being reported.
             </p>
           </field>
-          <field name="last">
+          <field name="isLast">
             <ref>bool</ref>
             <p>
               True if this is that last set of results that will be
@@ -1164,11 +1170,10 @@
           Get the changes required to perform a refactoring.
         </p>
         <params>
-          <field name="kindId">
+          <field name="kind">
             <ref>RefactoringKind</ref>
             <p>
-              The identifier of the kind of refactoring to be
-              performed.
+              The kind of refactoring to be performed.
             </p>
           </field>
           <field name="file">
@@ -1212,7 +1217,7 @@
           </field>
         </params>
         <result>
-          <field name="status">
+          <field name="problems">
             <list><ref>RefactoringProblem</ref></list>
             <p>
               The status of the refactoring. The array will be empty
@@ -1235,12 +1240,24 @@
             <p>
               The changes that are to be applied to affect the
               refactoring. This field will be omitted if there are
-              problems that prevent a set of changed from being
+              problems that prevent a set of changes from being
               computed, such as having no options specified for a
               refactoring that requires them, or if only validation
               was requested.
             </p>
           </field>
+          <field name="potentialEdits" optional="true">
+            <list><ref>String</ref></list>
+            <p>
+              The ids of source edits that are not known to be valid. An edit is
+              not known to be valid if there was insufficient type information
+              for the server to be able to determine whether or not the code
+              needs to be modified, such as when a member is being renamed and
+              there is a reference to a member from an unknown type. This field
+              will be omitted if the change field is omitted or if there are no
+              potential edits for the refactoring.
+            </p>
+          </field>
         </result>
       </request>
     </domain>
@@ -1480,22 +1497,7 @@
           performed. If the value of a field is omitted the value of the
           option will not be changed.
         </p>
-        <p>
-          NOTE: These options need to change.
-        </p>
         <object>
-          <field name="analyzeAngular" optional="true">
-            <ref>bool</ref>
-            <p>
-              True if the client wants Angular code to be analyzed.
-            </p>
-          </field>
-          <field name="analyzePolymer" optional="true">
-            <ref>bool</ref>
-            <p>
-              True if the client wants Polymer code to be analyzed.
-            </p>
-          </field>
           <field name="enableAsync" optional="true">
             <ref>bool</ref>
             <p>
@@ -1521,16 +1523,14 @@
             <ref>bool</ref>
             <p>
               True if hints that are specific to dart2js should be
-              generated. This option is ignored if either provideErrors
-              or generateHints is false.
+              generated. This option is ignored if generateHints is false.
             </p>
           </field>
           <field name="generateHints" optional="true">
             <ref>bool</ref>
             <p>
               True is hints should be generated as part of generating
-              errors and warnings. This option is ignored if
-              provideErrors is false.
+              errors and warnings.
             </p>
           </field>
         </object>
@@ -1554,7 +1554,7 @@
           An indication of the current state of analysis.
         </p>
         <object>
-          <field name="analyzing">
+          <field name="isAnalyzing">
             <ref>bool</ref>
             <p>True if analysis is currently being performed.</p>
           </field>
@@ -1569,37 +1569,26 @@
       </type>
       <type name="ChangeContentOverlay">
         <p>
-          A directive to modify an existing file content overlay.  A
-          range of text is deleted from the old file content overlay
-          and replaced with new text.
+          A directive to modify an existing file content overlay. One or more
+          ranges of text are deleted from the old file content overlay and
+          replaced with new text.
         </p>
         <p>
-          It is an error to use this directive is used on a file that
-          does not yet have a file content overlay (or that has had
-          its overlay removed via <a
-          href="#type_RemoveContentOverlay">RemoveContentOverlay</a>).
+        The edits are applied in the order in which they occur in the list.
+        This means that the offset of each edit must be correct under the
+        assumption that all previous edits have been applied.
+        </p>
+        <p>
+          It is an error to use this overlay on a file that does not yet have
+          a file content overlay or that has had its overlay removed via
+          <a href="#type_RemoveContentOverlay">RemoveContentOverlay</a>.
         </p>
         <object>
           <field name="type" value="change"><ref>String</ref></field>
-          <field name="offset">
-            <ref>int</ref>
+          <field name="edits">
+            <list><ref>SourceEdit</ref></list>
             <p>
-              The offset of the text to be remove from the file
-              content overlay.
-            </p>
-          </field>
-          <field name="length">
-            <ref>int</ref>
-            <p>
-              The length of the text to be removed from the file
-              content overlay, or 0 if no text should be removed.
-            </p>
-          </field>
-          <field name="replacement">
-            <ref>String</ref>
-            <p>
-              The new text which should be inserted in place of the
-              removed text.
+              The edits to be applied to the file.
             </p>
           </field>
         </object>
@@ -1774,6 +1763,7 @@
           <value><code>FUNCTION_TYPE_ALIAS</code></value>
           <value><code>GETTER</code></value>
           <value><code>IMPORT</code></value>
+          <value><code>KEYWORD</code></value>
           <value><code>LIBRARY_PREFIX</code></value>
           <value><code>LOCAL_VARIABLE</code></value>
           <value><code>METHOD</code></value>
@@ -1870,19 +1860,20 @@
           <value><code>CLASS_TYPE_ALIAS</code></value>
           <value><code>COMPILATION_UNIT</code></value>
           <value><code>CONSTRUCTOR</code></value>
-          <value><code>GETTER</code></value>
           <value><code>FIELD</code></value>
           <value><code>FUNCTION</code></value>
           <value><code>FUNCTION_TYPE_ALIAS</code></value>
+          <value><code>GETTER</code></value>
           <value><code>LIBRARY</code></value>
           <value><code>LOCAL_VARIABLE</code></value>
           <value><code>METHOD</code></value>
+          <value><code>PARAMETER</code></value>
           <value><code>SETTER</code></value>
           <value><code>TOP_LEVEL_VARIABLE</code></value>
           <value><code>TYPE_PARAMETER</code></value>
-          <value><code>UNKNOWN</code></value>
           <value><code>UNIT_TEST_GROUP</code></value>
           <value><code>UNIT_TEST_TEST</code></value>
+          <value><code>UNKNOWN</code></value>
         </enum>
       </type>
       <type name="Error">
@@ -2440,25 +2431,6 @@
           </field>
         </object>
       </type>
-      <type name="Parameter">
-        <p>
-          A description of a parameter.
-        </p>
-        <object>
-          <field name="type">
-            <ref>String</ref>
-            <p>
-              The type that should be given to the parameter.
-            </p>
-          </field>
-          <field name="name">
-            <ref>String</ref>
-            <p>
-              The name that should be given to the parameter.
-            </p>
-          </field>
-        </object>
-      </type>
       <type name="Position">
         <p>
           A position within a file.
@@ -2493,6 +2465,58 @@
           <value><code>RENAME</code></value>
         </enum>
       </type>
+      <type name="RefactoringMethodParameter">
+        <p>
+          A description of a parameter in a method refactoring.
+        </p>
+        <object>
+          <field name="id" optional="true">
+            <ref>String</ref>
+            <p>
+              The unique identifier of the parameter.
+              Clients may omit this field for the parameters they want to add.
+            </p>
+          </field>
+          <field name="kind">
+            <ref>RefactoringMethodParameterKind</ref>
+            <p>
+              The kind of the parameter.
+            </p>
+          </field>
+          <field name="type">
+            <ref>String</ref>
+            <p>
+              The type that should be given to the parameter, or the return type
+              of the parameter's function type.
+            </p>
+          </field>
+          <field name="name">
+            <ref>String</ref>
+            <p>
+              The name that should be given to the parameter.
+            </p>
+          </field>
+          <field name="parameters" optional="true">
+            <ref>String</ref>
+            <p>
+              The parameter list of the parameter's function type.
+              If the parameter is not of a function type, this field will
+              not be defined. If the function type has zero parameters, this
+              field will have a value of "()".
+            </p>
+          </field>
+        </object>
+      </type>
+      <type name="RefactoringMethodParameterKind">
+        <p>
+          An enumeration of the kinds of parameters.
+        </p>
+        <enum>
+          <value><code>REQUIRED</code></value>
+          <value><code>POSITIONAL</code></value>
+          <value><code>NAMED</code></value>
+        </enum>
+      </type>
       <type name="RefactoringProblem">
         <p>
           A description of a problem related to a refactoring.
@@ -2511,10 +2535,13 @@
               represented.
             </p>
           </field>
-          <field name="location">
+          <field name="location" optional="true">
             <ref>Location</ref>
             <p>
               The location of the problem being represented.
+              This field is omitted unless there is a specific location
+              associated with the problem (such as a location where an element
+              being renamed will be shadowed).
             </p>
           </field>
         </object>
@@ -2627,6 +2654,12 @@
             </p>
           </value>
           <value>
+            <code>UNKNOWN</code>
+            <p>
+              Some other kind of search result.
+            </p>
+          </value>
+          <value>
             <code>WRITE</code>
             <p>
               A reference to a field, parameter or variable where it is being written.
@@ -2701,6 +2734,22 @@
               original code.
             </p>
           </field>
+          <field name="id" optional="true">
+            <ref>String</ref>
+            <p>
+              An identifier that uniquely identifies this source edit from other
+              edits in the same response. This field is omitted unless a
+              containing structure needs to be able to identify the edit for
+              some reason.
+            </p>
+            <p>
+              For example, some refactoring operations can produce edits that
+              might not be appropriate (referred to as potential edits). Such
+              edits will have an id so that they can be referenced. Edits in
+              the same response that do not need to be referenced will not have
+              an id.
+            </p>
+          </field>
         </object>
       </type>
       <type name="SourceFileEdit">
@@ -2919,7 +2968,7 @@
             </p>
           </field>
           <field name="parameters">
-            <list><ref>Parameter</ref></list>
+            <list><ref>RefactoringMethodParameter</ref></list>
             <p>
               The proposed parameters for the method.
             </p>
@@ -2971,9 +3020,23 @@
             </p>
           </field>
           <field name="parameters">
-            <list><ref>Parameter</ref></list>
+            <list><ref>RefactoringMethodParameter</ref></list>
             <p>
               The parameters that should be defined for the method.
+              <p>
+                It is an error if a REQUIRED or NAMED parameter follows a
+                POSITIONAL parameter.
+                It is an error if a REQUIRED or POSITIONAL parameter follows a
+                NAMED parameter.
+              </p>
+              <ul>
+                <li>
+                  To change the order and/or update proposed paramerers, add
+                  parameters with the same identifiers as proposed.
+                </li>
+                <li>To add new parameters, omit their identifier.</li>
+                <li>To remove some parameters, omit them in this list.</li>
+              </ul>
             </p>
           </field>
           <field name="extractAll">
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index a1d5322..8e8a892 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -10,7 +10,6 @@
 library to.html;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:html5lib/dom.dart' as dom;
 
@@ -23,9 +22,17 @@
  * Embedded stylesheet
  */
 final String stylesheet = '''
+body {
+  font-family: sans-serif, serif;
+  padding-left: 5%;
+  padding-right: 5%;
+}
 h1 {
   text-align: center;
 }
+h2.domain {
+  border-bottom: 3px solid rgb(160, 160, 160);
+}
 pre {
   margin: 0px;
 }
@@ -34,13 +41,25 @@
   background-color: rgb(207, 226, 243);
   padding: 0.5em;
 }
+div.hangingIndent {
+  padding-left: 3em;
+  text-indent: -3em;
+}
 dt {
   margin-top: 1em;
   margin-bottom: 1em;
 }
-div.hangingIndent {
-  padding-left: 3em;
-  text-indent: -3em;
+dt.notification {
+  font-weight: bold;
+}
+dt.refactoring {
+  font-weight: bold;
+}
+dt.request {
+  font-weight: bold;
+}
+dt.typeDefinition {
+  font-weight: bold;
 }
 '''.trim();
 
@@ -77,7 +96,14 @@
     'style': 'color:#999999'
   }, callback);
   void h1(void callback()) => element('h1', {}, callback);
-  void h2(void callback()) => element('h2', {}, callback);
+  void h2(String cls, void callback()) {
+    if (cls == null) {
+      return element('h2', {}, callback);
+    }
+    return element('h2', {
+      'class': cls
+    }, callback);
+  }
   void h3(void callback()) => element('h3', {}, callback);
   void h4(void callback()) => element('h4', {}, callback);
   void hangingIndent(void callback()) => element('div', {
@@ -195,6 +221,18 @@
       write(displayName);
     }
   }
+
+  @override
+  void visitTypeUnion(TypeUnion typeUnion) {
+    bool verticalBarNeeded = false;
+    for (TypeDecl choice in typeUnion.choices) {
+      if (verticalBarNeeded) {
+        write(' | ');
+      }
+      visitTypeDecl(choice);
+      verticalBarNeeded = true;
+    }
+  }
 }
 
 /**
@@ -270,7 +308,7 @@
 
   @override
   void visitDomain(Domain domain) {
-    h2(() {
+    h2('domain', () {
       anchor('domain_${domain.name}', () {
         write('Domain: ${domain.name}');
       });
@@ -529,15 +567,18 @@
   }
 }
 
-/**
- * Translate spec_input.html into api.html.
- */
-main() {
+final GeneratedFile target = new GeneratedFile('../../doc/api.html', () {
   ToHtmlVisitor visitor = new ToHtmlVisitor(readApi());
   dom.Document document = new dom.Document();
   for (dom.Node node in visitor.collectHtml(visitor.visitApi)) {
     document.append(node);
   }
-  File outputFile = new File('../../doc/api.html');
-  outputFile.writeAsStringSync(document.outerHtml);
+  return document.outerHtml;
+});
+
+/**
+ * Translate spec_input.html into api.html.
+ */
+main() {
+  target.generate();
 }
diff --git a/pkg/analysis_services/LICENSE b/pkg/analysis_services/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/pkg/analysis_services/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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_services/lib/constants.dart b/pkg/analysis_services/lib/constants.dart
deleted file mode 100644
index 58f1999..0000000
--- a/pkg/analysis_services/lib/constants.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.constants;
-
-//
-// Property names
-//
-const String ADD = 'add';
-const String ADDED = 'added';
-const String CHANGE = 'change';
-const String CHILDREN = 'children';
-const String CLASS_ELEMENT = 'classElement';
-const String CLASS_NAME = 'className';
-const String COMPLETION = 'completion';
-const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
-const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
-const String CONTENT = 'content';
-const String CORRECTION = 'correction';
-const String DART_DOC = 'dartdoc';
-const String DEFAULT = 'default';
-const String DISPLAY_NAME = 'displayName';
-const String EDITS = 'edits';
-const String ELEMENT = 'element';
-const String ELEMENT_DESCRIPTION = 'elementDescription';
-const String ELEMENT_KIND = 'elementKind';
-const String EXCLUDED = 'excluded';
-const String ERROR = 'error';
-const String ERRORS = 'errors';
-const String FATAL = 'fatal';
-const String FILE = 'file';
-const String FILES = 'files';
-const String FIXES = 'fixes';
-const String FLAGS = 'flags';
-const String HIERARCHY_ITEMS = 'hierarchyItems';
-const String HOVERS = 'hovers';
-const String ID = 'id';
-const String INCLUDE_POTENTIAL = 'includePotential';
-const String INCLUDED = 'included';
-const String INTERFACE_MEMBERS = 'interfaceMembers';
-const String INTERFACES = 'interfaces';
-const String IS_ABSTRACT = 'isAbstract';
-const String IS_DEPRECATED = 'isDeprecated';
-const String IS_POTENTIAL = 'isPotential';
-const String IS_STATIC = 'isStatic';
-const String KIND = 'kind';
-const String LAST = 'last';
-const String LENGTH = 'length';
-const String LINKED_EDIT_GROUPS = 'linkedEditGroups';
-const String LOCATION = 'location';
-const String MEMBER_ELEMENT = 'memberElement';
-const String MESSAGE = 'message';
-const String MIXINS = 'mixins';
-const String NAME = 'name';
-const String OCCURRENCES = 'occurrences';
-const String OFFSET = 'offset';
-const String OFFSETS = 'offsets';
-const String OPTIONS = 'options';
-const String OUTLINE = 'outline';
-const String OVERRIDES = 'overrides';
-const String PARAMETER = 'parameter';
-const String PARAMETERS = 'parameters';
-const String PATH = 'path';
-const String PATTERN = 'pattern';
-const String POSITIONS = 'positions';
-const String PROPAGATED_TYPE = 'propagatedType';
-const String REFACTORINGS = 'refactorings';
-const String REGIONS = 'regions';
-const String RELEVANCE = 'relevance';
-const String REMOVE = 'remove';
-const String REMOVED = 'removed';
-const String REPLACEMENT = 'replacement';
-const String REPLACEMENT_OFFSET = 'replacementOffset';
-const String REPLACEMENT_LENGTH = 'replacementLength';
-const String RETURN_TYPE = 'returnType';
-const String RESULTS = 'results';
-const String SELECTION = 'selection';
-const String SEVERITY = 'severity';
-const String SELECTION_LENGTH = 'selectionLength';
-const String SELECTION_OFFSET = 'selectionOffset';
-const String STACK_TRACE = 'stackTrace';
-const String START_COLUMN = 'startColumn';
-const String START_LINE = 'startLine';
-const String STATIC_TYPE = 'staticType';
-const String SUBCLASSES = 'subclasses';
-const String SUBSCRIPTIONS = 'subscriptions';
-const String SUGGESTIONS = 'suggestions';
-const String SUPERCLASS = 'superclass';
-const String SUPER_CLASS_MEMBER = 'superclassMember';
-const String TARGETS = 'targets';
-const String TYPE = 'type';
-const String VALUE = 'value';
-const String VERSION = 'version';
diff --git a/pkg/analysis_services/lib/correction/status.dart b/pkg/analysis_services/lib/correction/status.dart
deleted file mode 100644
index 58d2693..0000000
--- a/pkg/analysis_services/lib/correction/status.dart
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.status;
-
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-
-/**
- * An outcome of a condition checking operation.
- */
-class RefactoringStatus {
-  /**
-   * The current severity of this [RefactoringStatus] - the maximum of the
-   * severities of its [entries].
-   */
-  RefactoringStatusSeverity _severity = RefactoringStatusSeverity.OK;
-
-  /**
-   * A list of [RefactoringStatusEntry]s.
-   */
-  final List<RefactoringStatusEntry> entries = [];
-
-  /**
-   * Creates a new OK [RefactoringStatus].
-   */
-  RefactoringStatus();
-
-  /**
-   * Creates a new [RefactoringStatus] with the ERROR severity.
-   */
-  factory RefactoringStatus.error(String msg,
-      [RefactoringStatusContext context]) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addError(msg, context);
-    return status;
-  }
-
-  /**
-   * Creates a new [RefactoringStatus] with the FATAL severity.
-   */
-  factory RefactoringStatus.fatal(String msg,
-      [RefactoringStatusContext context]) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addFatalError(msg, context);
-    return status;
-  }
-
-  /**
-   * Creates a new [RefactoringStatus] with the WARNING severity.
-   */
-  factory RefactoringStatus.warning(String msg,
-      [RefactoringStatusContext context]) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addWarning(msg, context);
-    return status;
-  }
-
-  /**
-   * Returns the first [RefactoringStatusEntry] with the highest severity.
-   *
-   * If there is more than one entry with the highest severity then there is no
-   * guarantee as to which will be returned.
-   *
-   * Returns `null` if no entries.
-   */
-  RefactoringStatusEntry get entryWithHighestSeverity {
-    for (RefactoringStatusEntry entry in entries) {
-      if (entry.severity == _severity) {
-        return entry;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns `true` if the severity is FATAL or ERROR.
-   */
-  bool get hasError =>
-      _severity == RefactoringStatusSeverity.FATAL ||
-          _severity == RefactoringStatusSeverity.ERROR;
-
-  /**
-   * Returns `true` if the severity is FATAL.
-   */
-  bool get hasFatalError => _severity == RefactoringStatusSeverity.FATAL;
-
-  /**
-   * Returns `true` if the severity is WARNING.
-   */
-  bool get hasWarning => _severity == RefactoringStatusSeverity.WARNING;
-
-  /**
-   * Return `true` if the severity is `OK`.
-   */
-  bool get isOK => _severity == RefactoringStatusSeverity.OK;
-
-  /**
-   * Returns the message of the [RefactoringStatusEntry] with highest severity;
-   * may be `null` if no entries.
-   */
-  String get message {
-    RefactoringStatusEntry entry = entryWithHighestSeverity;
-    if (entry == null) {
-      return null;
-    }
-    return entry.message;
-  }
-
-  /**
-   * Returns the current severity of this [RefactoringStatus].
-   */
-  RefactoringStatusSeverity get severity => _severity;
-
-  /**
-   * Adds an ERROR entry with the given message and status.
-   */
-  void addError(String msg, [RefactoringStatusContext context]) {
-    _addEntry(
-        new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, msg, context));
-  }
-
-  /**
-   * Adds a FATAL entry with the given message and status.
-   */
-  void addFatalError(String msg, [RefactoringStatusContext context]) {
-    _addEntry(
-        new RefactoringStatusEntry(RefactoringStatusSeverity.FATAL, msg, context));
-  }
-
-  /**
-   * Merges [other] into this [RefactoringStatus].
-   *
-   * The [other]'s entries are added to this.
-   *
-   * The resulting severity is the more severe of this and [other] severities.
-   *
-   * Merging with `null` is allowed - it has no effect.
-   */
-  void addStatus(RefactoringStatus other) {
-    if (other == null) {
-      return;
-    }
-    entries.addAll(other.entries);
-    _severity = RefactoringStatusSeverity._max(_severity, other.severity);
-  }
-
-  /**
-   * Adds a WARNING entry with the given message and status.
-   */
-  void addWarning(String msg, [RefactoringStatusContext context]) {
-    _addEntry(
-        new RefactoringStatusEntry(RefactoringStatusSeverity.WARNING, msg, context));
-  }
-
-  /**
-   * Returns a copy of this [RefactoringStatus] with ERROR replaced with FATAL.
-   */
-  RefactoringStatus escalateErrorToFatal() {
-    RefactoringStatus result = new RefactoringStatus();
-    for (RefactoringStatusEntry entry in entries) {
-      if (entry.severity == RefactoringStatusSeverity.ERROR) {
-        entry = new RefactoringStatusEntry(
-            RefactoringStatusSeverity.FATAL,
-            entry.message,
-            entry.context);
-      }
-      result._addEntry(entry);
-    }
-    return result;
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("<");
-    sb.write(_severity.name);
-    if (!isOK) {
-      sb.write("\n");
-      for (RefactoringStatusEntry entry in entries) {
-        sb.write("\t");
-        sb.write(entry);
-        sb.write("\n");
-      }
-    }
-    sb.write(">");
-    return sb.toString();
-  }
-
-  /**
-   * Adds the given [RefactoringStatusEntry] and updates [severity].
-   */
-  void _addEntry(RefactoringStatusEntry entry) {
-    entries.add(entry);
-    _severity = RefactoringStatusSeverity._max(_severity, entry.severity);
-  }
-}
-
-
-/**
- * [RefactoringStatusContext] can be used to annotate [RefactoringStatusEntry]s
- * with additional information typically presented in the user interface.
- */
-class RefactoringStatusContext {
-  /**
-   * The [AnalysisContext] in which this status occurs.
-   */
-  final AnalysisContext context;
-
-  /**
-   * The [Source] in which this status occurs.
-   */
-  final Source source;
-
-  /**
-   * The [SourceRange] with specific location where this status occurs.
-   */
-  final SourceRange range;
-
-  /**
-   * Creates a new [RefactoringStatusContext].
-   */
-  RefactoringStatusContext(this.context, this.source, this.range);
-
-  /**
-   * Creates a new [RefactoringStatusContext] for the given [Element].
-   */
-  factory RefactoringStatusContext.forElement(Element element) {
-    AnalysisContext context = element.context;
-    Source source = element.source;
-    SourceRange range = rangeElementName(element);
-    return new RefactoringStatusContext(context, source, range);
-  }
-
-  /**
-   * Creates a new [RefactoringStatusContext] for the given [SearchMatch].
-   */
-  factory RefactoringStatusContext.forMatch(SearchMatch match) {
-    Element enclosingElement = match.element;
-    return new RefactoringStatusContext(
-        enclosingElement.context,
-        enclosingElement.source,
-        match.sourceRange);
-  }
-
-  /**
-   * Creates a new [RefactoringStatusContext] for the given [AstNode].
-   */
-  factory RefactoringStatusContext.forNode(AstNode node) {
-    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
-    CompilationUnitElement unitElement = unit.element;
-    AnalysisContext context = unitElement.context;
-    Source source = unitElement.source;
-    SourceRange range = rangeNode(node);
-    return new RefactoringStatusContext(context, source, range);
-  }
-
-  /**
-   * Creates a new [RefactoringStatusContext] for the given [CompilationUnit].
-   */
-  factory RefactoringStatusContext.forUnit(CompilationUnit unit,
-      SourceRange range) {
-    CompilationUnitElement unitElement = unit.element;
-    AnalysisContext context = unitElement.context;
-    Source source = unitElement.source;
-    return new RefactoringStatusContext(context, source, range);
-  }
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[source=");
-    builder.append(source);
-    builder.append(", range=");
-    builder.append(range);
-    builder.append("]");
-    return builder.toString();
-  }
-}
-
-
-/**
- * An immutable object representing an entry in a [RefactoringStatus].
- *
- * A [RefactoringStatusEntry] consists of a severity, a message and a context.
- */
-class RefactoringStatusEntry {
-  /**
-   * The severity level.
-   */
-  final RefactoringStatusSeverity severity;
-
-  /**
-   * The message of the status entry.
-   */
-  final String message;
-
-  /**
-   * The [RefactoringStatusContext] which can be used to show more detailed
-   * information regarding this status entry in the UI.
-   *
-   * May be `null` indicating that no context is available.
-   */
-  final RefactoringStatusContext context;
-
-  RefactoringStatusEntry(this.severity, this.message, [this.context]);
-
-  /**
-   * Returns whether the entry represents an error or not.
-   */
-  bool get isError => severity == RefactoringStatusSeverity.ERROR;
-
-  /**
-   * Returns whether the entry represents a fatal error or not.
-   */
-  bool get isFatalError => severity == RefactoringStatusSeverity.FATAL;
-
-  /**
-   * Returns whether the entry represents a warning or not.
-   */
-  bool get isWarning => severity == RefactoringStatusSeverity.WARNING;
-
-  @override
-  String toString() {
-    if (context != null) {
-      return "${severity}: ${message}; Context: ${context}";
-    } else {
-      return "${severity}: ${message}";
-    }
-  }
-}
-
-
-/**
- * Severity of [RefactoringStatus].
- */
-class RefactoringStatusSeverity {
-  /**
-   * The severity indicating the nominal case.
-   */
-  static const OK = const RefactoringStatusSeverity('OK', 0);
-
-  /**
-   * The severity indicating a warning.
-   *
-   * Use this severity if the refactoring can be performed, but you assume that
-   * the user could not be aware of problems or confusions resulting from the
-   * execution.
-   */
-  static const WARNING = const RefactoringStatusSeverity('WARNING', 2);
-
-  /**
-   * The severity indicating an error.
-   *
-   * Use this severity if the refactoring can be performed, but the refactoring
-   * will not be behavior preserving and/or the partial execution will lead to
-   * an inconsistent state (e.g. compile errors).
-   */
-  static const ERROR = const RefactoringStatusSeverity('ERROR', 3);
-
-  /**
-   * The severity indicating a fatal error.
-   *
-   * Use this severity if the refactoring cannot be performed, and execution
-   * would lead to major problems. Note that this completely blocks the user
-   * from performing this refactoring.
-   *
-   * It is often preferable to use an [ERROR] status and allow a partial
-   * execution (e.g. if just one reference to a refactored element cannot be
-   * updated).
-   */
-  static const FATAL = const RefactoringStatusSeverity('FATAL', 4);
-
-  final String name;
-  final int ordinal;
-
-  const RefactoringStatusSeverity(this.name, this.ordinal);
-
-  @override
-  String toString() => name;
-
-  /**
-   * Returns the most severe [RefactoringStatusSeverity].
-   */
-  static RefactoringStatusSeverity _max(RefactoringStatusSeverity a,
-      RefactoringStatusSeverity b) {
-    if (b.ordinal > a.ordinal) {
-      return b;
-    }
-    return a;
-  }
-}
diff --git a/pkg/analysis_services/lib/index/local_file_index.dart b/pkg/analysis_services/lib/index/local_file_index.dart
deleted file mode 100644
index 3fb0c3a..0000000
--- a/pkg/analysis_services/lib/index/local_file_index.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.index.local_file_index;
-
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/src/index/local_index.dart';
-import 'package:analysis_services/src/index/store/codec.dart';
-import 'package:analysis_services/src/index/store/temporary_folder_file_manager.dart';
-import 'package:analysis_services/src/index/store/split_store.dart';
-import 'package:analyzer/src/generated/engine.dart';
-
-
-Index createLocalFileIndex() {
-  var fileManager = new TemporaryFolderFileManager();
-  var stringCodec = new StringCodec();
-  var nodeManager = new FileNodeManager(fileManager,
-      AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
-      new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
-  return new LocalIndex(nodeManager);
-}
diff --git a/pkg/analysis_services/lib/refactoring/refactoring.dart b/pkg/analysis_services/lib/refactoring/refactoring.dart
deleted file mode 100644
index 71bf65b..0000000
--- a/pkg/analysis_services/lib/refactoring/refactoring.dart
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.refactoring;
-
-import 'dart:async';
-
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/refactoring/rename_import.dart';
-import 'package:analysis_services/src/refactoring/rename_library.dart';
-import 'package:analysis_services/src/refactoring/rename_local.dart';
-import 'package:analyzer/src/generated/element.dart';
-
-
-/**
- * Abstract interface for all refactorings.
- */
-abstract class Refactoring {
-  /**
-   * Returns the human readable name of this [Refactoring].
-   */
-  String get refactoringName;
-
-  /**
-   * Checks all conditions - [checkInitialConditions] and
-   * [checkFinalConditions] to decide if refactoring can be performed.
-   */
-  Future<RefactoringStatus> checkAllConditions();
-
-  /**
-   * Validates environment to check if this refactoring can be performed.
-   *
-   * This check may be slow, because many refactorings use search engine.
-   */
-  Future<RefactoringStatus> checkFinalConditions();
-
-  /**
-   * Validates arguments to check if this refactoring can be performed.
-   *
-   * This check should be quick because it is used often as arguments change.
-   */
-  Future<RefactoringStatus> checkInitialConditions();
-
-  /**
-   * Returns the [Change] to apply to perform this refactoring.
-   */
-  Future<Change> createChange();
-
-  /**
-   * Returs `true` if the [Change] created by refactoring may be unsafe,
-   * so we want user to review the [Change] to ensure that he understands it.
-   */
-  bool requiresPreview();
-}
-
-
-/**
- * Abstract [Refactoring] for renaming some [Element].
- */
-abstract class RenameRefactoring implements Refactoring {
-  /**
-   * Returns a new [RenameRefactoring] instance for renaming [element],
-   * maybe `null` if there is no support for renaming [Element]s of the given
-   * type.
-   */
-  factory RenameRefactoring(SearchEngine searchEngine, Element element) {
-    if (element is ImportElement) {
-      return new RenameImportRefactoringImpl(searchEngine, element);
-    }
-    if (element is LibraryElement) {
-      return new RenameLibraryRefactoringImpl(searchEngine, element);
-    }
-    if (element is LocalElement) {
-      return new RenameLocalRefactoringImpl(searchEngine, element);
-    }
-    return null;
-  }
-
-  /**
-   * Sets the new name for the [Element].
-   */
-  void set newName(String newName);
-
-  /**
-   * Returns the old name of the [Element] being renamed.
-   */
-  String get oldName;
-
-  /**
-   * Validates that the [newName] is a valid identifier and is appropriate for
-   * the type of the [Element] being renamed.
-   *
-   * It does not perform all the checks (such as checking for conflicts with any
-   * existing names in any of the scopes containing the current name), as many
-   * of these checkes require search engine. Use [checkFinalConditions] for this
-   * level of checking.
-   */
-  RefactoringStatus checkNewName();
-}
diff --git a/pkg/analysis_services/lib/src/completion/dart_completion_manager.dart b/pkg/analysis_services/lib/src/completion/dart_completion_manager.dart
deleted file mode 100644
index b179d94..0000000
--- a/pkg/analysis_services/lib/src/completion/dart_completion_manager.dart
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.services.completion.dart;
-
-import 'dart:async';
-
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/completion/imported_type_computer.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analysis_services/src/completion/local_computer.dart';
-
-/**
- * Manages code completion for a given Dart file completion request.
- */
-class DartCompletionManager extends CompletionManager {
-  final AnalysisContext context;
-  final Source source;
-  final int offset;
-  final SearchEngine searchEngine;
-  final List<CompletionSuggestion> suggestions = [];
-  List<CompletionComputer> computers;
-
-  DartCompletionManager(this.context, this.source, this.offset,
-      this.searchEngine);
-
-  @override
-  void compute() {
-    initComputers();
-    computeFast();
-    if (!computers.isEmpty) {
-      computeFull();
-    }
-  }
-
-  /**
-   * Compute suggestions based upon cached information only
-   * then send an initial response to the client.
-   */
-  void computeFast() {
-    CompilationUnit unit = context.parseCompilationUnit(source);
-    AstNode node = new NodeLocator.con1(offset).searchWithin(unit);
-    computers.removeWhere((c) => c.computeFast(unit, node, suggestions));
-    sendResults(computers.isEmpty);
-  }
-
-  /**
-   * If there is remaining work to be done, then wait for the unit to be
-   * resolved and request that each remaining computer finish their work.
-   */
-  void computeFull() {
-    waitForAnalysis().then((CompilationUnit unit) {
-      if (unit == null) {
-        sendResults(true);
-        return;
-      }
-      AstNode node = new NodeLocator.con1(offset).searchWithin(unit);
-      int count = computers.length;
-      computers.forEach((c) {
-        c.computeFull(unit, node, suggestions).then((bool changed) {
-          var last = --count == 0;
-          if (changed || last) {
-            sendResults(last);
-          }
-        });
-      });
-    });
-  }
-
-  /**
-   * Build and initialize the list of completion computers
-   */
-  void initComputers() {
-    if (computers == null) {
-      computers = [new LocalComputer(), new ImportedTypeComputer()];
-    }
-    computers.forEach((CompletionComputer c) {
-      c.context = context;
-      c.source = source;
-      c.offset = offset;
-      c.searchEngine = searchEngine;
-    });
-  }
-
-  /**
-   * Send the current list of suggestions to the client.
-   */
-  void sendResults(bool last) {
-    controller.add(new CompletionResult(offset, 0, suggestions, last));
-    if (last) {
-      controller.close();
-    }
-  }
-
-  /**
-   * Wait for analysis to be complete and return the resolved unit
-   * or `null` if the unit could not be resolved.
-   */
-  Future<CompilationUnit> waitForAnalysis() {
-    LibraryElement library = context.getLibraryElement(source);
-    if (library != null) {
-      var unit = context.getResolvedCompilationUnit(source, library);
-      if (unit != null) {
-        return new Future.value(unit);
-      }
-    }
-    //TODO (danrubel) Determine if analysis is complete but unit not resolved
-    return new Future(waitForAnalysis);
-  }
-}
diff --git a/pkg/analysis_services/lib/src/completion/imported_type_computer.dart b/pkg/analysis_services/lib/src/completion/imported_type_computer.dart
deleted file mode 100644
index 959f4b4..0000000
--- a/pkg/analysis_services/lib/src/completion/imported_type_computer.dart
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library services.completion.computer.dart.toplevel;
-
-import 'dart:async';
-
-import 'package:analysis_services/completion/completion_computer.dart';
-import 'package:analysis_services/completion/completion_suggestion.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-
-/**
- * A computer for calculating imported class and top level variable
- * `completion.getSuggestions` request results.
- */
-class ImportedTypeComputer extends CompletionComputer {
-
-  @override
-  bool computeFast(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
-    // TODO: implement computeFast
-    // - compute results based upon current search, then replace those results
-    // during the full compute phase
-    // - filter results based upon completion offset
-    return false;
-  }
-
-  @override
-  Future<bool> computeFull(CompilationUnit unit, AstNode node,
-      List<CompletionSuggestion> suggestions) {
-    return node.accept(
-        new _ImportedTypeVisitor(searchEngine, unit, suggestions));
-  }
-}
-
-/**
- * Visits the node at which the completion is requested
- * and builds the list of suggestions.
- */
-class _ImportedTypeVisitor extends GeneralizingAstVisitor<Future<bool>> {
-  final SearchEngine searchEngine;
-  final CompilationUnit unit;
-  final List<CompletionSuggestion> suggestions;
-
-  _ImportedTypeVisitor(this.searchEngine, this.unit, this.suggestions);
-
-  Future<bool> visitCombinator(Combinator node) {
-    var directive = node.getAncestor((parent) => parent is NamespaceDirective);
-    if (directive is NamespaceDirective) {
-      return _addLibraryElements(directive.uriElement);
-    }
-    return new Future.value(true);
-  }
-
-  Future<bool> visitNode(AstNode node) {
-    return _addImportedElements();
-  }
-
-  Future<bool> visitSimpleIdentifier(SimpleIdentifier node) {
-    return node.parent.accept(this);
-  }
-
-  Future<bool> _addImportedElements() {
-    var future = searchEngine.searchTopLevelDeclarations('');
-    return future.then((List<SearchMatch> matches) {
-
-      Set<LibraryElement> visibleLibs = new Set<LibraryElement>();
-      Set<LibraryElement> excludedLibs = new Set<LibraryElement>();
-
-      Map<LibraryElement, Set<String>> showNames =
-          new Map<LibraryElement, Set<String>>();
-      Map<LibraryElement, Set<String>> hideNames =
-          new Map<LibraryElement, Set<String>>();
-
-      // Exclude elements from the local library
-      // as they will be included by the LocalComputer
-      excludedLibs.add(unit.element.library);
-      unit.directives.forEach((Directive directive) {
-        if (directive is ImportDirective) {
-          LibraryElement lib = directive.element.importedLibrary;
-          if (directive.prefix == null) {
-            visibleLibs.add(lib);
-            directive.combinators.forEach((Combinator combinator) {
-              if (combinator is ShowCombinator) {
-                showNames[lib] = combinator.shownNames.map(
-                    (SimpleIdentifier id) => id.name).toSet();
-              } else if (combinator is HideCombinator) {
-                hideNames[lib] = combinator.hiddenNames.map(
-                    (SimpleIdentifier id) => id.name).toSet();
-              }
-            });
-          } else {
-            excludedLibs.add(lib);
-          }
-        }
-      });
-
-      // Compute the set of possible classes, functions, and top level variables
-      matches.forEach((SearchMatch match) {
-        if (match.kind == MatchKind.DECLARATION) {
-          Element element = match.element;
-          LibraryElement lib = element.library;
-          if (element.isPublic && !excludedLibs.contains(lib)) {
-            String completion = element.displayName;
-            Set<String> show = showNames[lib];
-            Set<String> hide = hideNames[lib];
-            if ((show == null || show.contains(completion)) &&
-                (hide == null || !hide.contains(completion))) {
-              suggestions.add(
-                  new CompletionSuggestion(
-                      CompletionSuggestionKind.fromElementKind(element.kind),
-                      visibleLibs.contains(lib) || lib.isDartCore ?
-                          CompletionRelevance.DEFAULT :
-                          CompletionRelevance.LOW,
-                      completion,
-                      completion.length,
-                      0,
-                      element.isDeprecated,
-                      false // isPotential
-              ));
-            }
-          }
-        }
-      });
-      return true;
-    });
-  }
-
-  Future<bool> _addLibraryElements(LibraryElement library) {
-    library.visitChildren(new _LibraryElementVisitor(suggestions));
-    return new Future.value(true);
-  }
-}
-
-/**
- * Provides suggestions from a single library for the show/hide combinators
- * as in `import "foo.dart" show ` where the completion offset is after
- * the `show`.
- */
-class _LibraryElementVisitor extends GeneralizingElementVisitor {
-  final List<CompletionSuggestion> suggestions;
-
-  _LibraryElementVisitor(this.suggestions);
-
-  visitClassElement(ClassElement element) {
-    _addSuggestion(element);
-  }
-
-  visitCompilationUnitElement(CompilationUnitElement element) {
-    element.visitChildren(this);
-  }
-
-  visitElement(Element element) {
-    // ignored
-  }
-
-  visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
-    _addSuggestion(element);
-  }
-
-  visitTopLevelVariableElement(TopLevelVariableElement element) {
-    _addSuggestion(element);
-  }
-
-  void _addSuggestion(Element element) {
-    if (element != null) {
-      String completion = element.name;
-      if (completion != null && completion.length > 0) {
-        suggestions.add(
-            new CompletionSuggestion(
-                CompletionSuggestionKind.fromElementKind(element.kind),
-                CompletionRelevance.DEFAULT,
-                completion,
-                completion.length,
-                0,
-                element.isDeprecated,
-                false // isPotential
-        ));
-      }
-    }
-  }
-}
diff --git a/pkg/analysis_services/lib/src/generated/change.dart b/pkg/analysis_services/lib/src/generated/change.dart
deleted file mode 100644
index 9cc094f..0000000
--- a/pkg/analysis_services/lib/src/generated/change.dart
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library services.change;
-
-import 'dart:collection';
-import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * Describes some abstract operation to perform.
- *
- * [Change] implementations in "services" plugin cannot perform operation themselves, they are
- * just descriptions of operation. Actual operation should be performed by client.
- */
-abstract class Change {
-  final String name;
-
-  Change(this.name);
-}
-
-/**
- * Composition of several [Change]s.
- */
-class CompositeChange extends Change {
-  List<Change> _children = [];
-
-  CompositeChange(String name, [Iterable<Change> changes]) : super(name) {
-    if (changes != null) {
-      _children.addAll(changes);
-    }
-  }
-
-  /**
-   * Adds given [Change]s.
-   */
-  void add(List<Change> changes) {
-    _children.addAll(changes);
-  }
-
-  /**
-   * @return the children [Change]s.
-   */
-  List<Change> get children => _children;
-}
-
-/**
- * [Change] to create new file.
- */
-class CreateFileChange extends Change {
-  final JavaFile file;
-
-  final String content;
-
-  CreateFileChange(String name, this.file, this.content) : super(name);
-}
-
-/**
- * Describes a text edit. Edits are executed by applying them to a [Source].
- */
-class Edit {
-  /**
-   * The offset at which to apply the edit.
-   */
-  final int offset;
-
-  /**
-   * The length of the text interval to replace.
-   */
-  final int length;
-
-  /**
-   * The replacement text.
-   */
-  final String replacement;
-
-  /**
-   * Create an edit.
-   *
-   * @param offset the offset at which to apply the edit
-   * @param length the length of the text interval replace
-   * @param replacement the replacement text
-   */
-  Edit(this.offset, this.length, this.replacement);
-
-  /**
-   * Create an edit.
-   *
-   * @param range the [SourceRange] to replace
-   * @param replacement the replacement text
-   */
-  Edit.range(SourceRange range, String replacement) : this(range.offset, range.length, replacement);
-
-  @override
-  String toString() => "${(offset < 0 ? "(" : "X(")}offset: ${offset}, length ${length}, replacement :>${replacement}<:)";
-}
-
-/**
- * Composition of two [CompositeChange]s. First change should be displayed in preview, but
- * merged into second one before execution.
- */
-class MergeCompositeChange extends Change {
-  final CompositeChange previewChange;
-
-  final CompositeChange executeChange;
-
-  MergeCompositeChange(String name, this.previewChange, this.executeChange) : super(name);
-}
-
-/**
- * [Change] to apply to single [Source].
- */
-class SourceChange extends Change {
-  final Source source;
-
-  final List<Edit> edits = [];
-
-  Map<String, List<Edit>> _editGroups = new LinkedHashMap();
-
-  /**
-   * @param name the name of this change to display in UI
-   * @param source the [Source] to change
-   */
-  SourceChange(String name, this.source) : super(name);
-
-  /**
-   * Adds the [Edit] to apply.
-   */
-  void addEdit(Edit edit, [String description = '']) {
-    // add to all edits
-    edits.add(edit);
-    // add to group
-    {
-      List<Edit> group = _editGroups[description];
-      if (group == null) {
-        group = [];
-        _editGroups[description] = group;
-      }
-      group.add(edit);
-    }
-  }
-
-  /**
-   * @return the [Edit]s grouped by their descriptions.
-   */
-  Map<String, List<Edit>> get editGroups => _editGroups;
-}
-
-/**
- * Manages multiple [SourceChange] objects.
- */
-class SourceChangeManager {
-  Map<Source, SourceChange> _changeMap = {};
-
-  /**
-   * @return the [SourceChange] to record modifications for given [Source].
-   */
-  SourceChange get(Source source) {
-    SourceChange change = _changeMap[source];
-    if (change == null) {
-      change = new SourceChange(source.shortName, source);
-      _changeMap[source] = change;
-    }
-    return change;
-  }
-
-  /**
-   * @return all [SourceChange] in this manager.
-   */
-  List<SourceChange> get changes {
-    Iterable<SourceChange> changes = _changeMap.values;
-    return new List.from(changes);
-  }
-}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/proposal.dart b/pkg/analysis_services/lib/src/generated/proposal.dart
deleted file mode 100644
index 4e7f842..0000000
--- a/pkg/analysis_services/lib/src/generated/proposal.dart
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library services.proposal;
-
-import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'change.dart';
-
-/**
- * [CorrectionProposal] for adding new dependency into pubspec.
- */
-class AddDependencyCorrectionProposal extends CorrectionProposal {
-  final JavaFile file;
-
-  final String packageName;
-
-  AddDependencyCorrectionProposal(this.file, this.packageName, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
-}
-
-/**
- * [CorrectionProposal] with some [Change].
- */
-class ChangeCorrectionProposal extends CorrectionProposal {
-  final Change change;
-
-  ChangeCorrectionProposal(this.change, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
-}
-
-/**
- * Enumeration of images used by correction processors.
- */
-class CorrectionImage extends Enum<CorrectionImage> {
-  static const CorrectionImage IMG_CORRECTION_CHANGE = const CorrectionImage('IMG_CORRECTION_CHANGE', 0);
-
-  static const CorrectionImage IMG_CORRECTION_CLASS = const CorrectionImage('IMG_CORRECTION_CLASS', 1);
-
-  static const List<CorrectionImage> values = const [IMG_CORRECTION_CHANGE, IMG_CORRECTION_CLASS];
-
-  const CorrectionImage(String name, int ordinal) : super(name, ordinal);
-}
-
-/**
- * Identifier of [CorrectionProposal].
- */
-class CorrectionKind extends Enum<CorrectionKind> {
-  static const CorrectionKind QA_ADD_PART_DIRECTIVE = const CorrectionKind.con1('QA_ADD_PART_DIRECTIVE', 0, 30, "Add 'part' directive");
-
-  static const CorrectionKind QA_ADD_TYPE_ANNOTATION = const CorrectionKind.con1('QA_ADD_TYPE_ANNOTATION', 1, 30, "Add type annotation");
-
-  static const CorrectionKind QA_ASSIGN_TO_LOCAL_VARIABLE = const CorrectionKind.con1('QA_ASSIGN_TO_LOCAL_VARIABLE', 2, 30, "Assign value to new local variable");
-
-  static const CorrectionKind QA_CONVERT_INTO_BLOCK_BODY = const CorrectionKind.con1('QA_CONVERT_INTO_BLOCK_BODY', 3, 30, "Convert into block body");
-
-  static const CorrectionKind QA_CONVERT_INTO_EXPRESSION_BODY = const CorrectionKind.con1('QA_CONVERT_INTO_EXPRESSION_BODY', 4, 30, "Convert into expression body");
-
-  static const CorrectionKind QA_CONVERT_INTO_IS_NOT = const CorrectionKind.con1('QA_CONVERT_INTO_IS_NOT', 5, 30, "Convert into is!");
-
-  static const CorrectionKind QA_CONVERT_INTO_IS_NOT_EMPTY = const CorrectionKind.con1('QA_CONVERT_INTO_IS_NOT_EMPTY', 6, 30, "Convert into 'isNotEmpty'");
-
-  static const CorrectionKind QA_EXCHANGE_OPERANDS = const CorrectionKind.con1('QA_EXCHANGE_OPERANDS', 7, 30, "Exchange operands");
-
-  static const CorrectionKind QA_EXTRACT_CLASS = const CorrectionKind.con1('QA_EXTRACT_CLASS', 8, 30, "Extract class into file '%s'");
-
-  static const CorrectionKind QA_IMPORT_ADD_SHOW = const CorrectionKind.con1('QA_IMPORT_ADD_SHOW', 9, 30, "Add explicit 'show' combinator");
-
-  static const CorrectionKind QA_INVERT_IF_STATEMENT = const CorrectionKind.con1('QA_INVERT_IF_STATEMENT', 10, 30, "Invert 'if' statement");
-
-  static const CorrectionKind QA_JOIN_IF_WITH_INNER = const CorrectionKind.con1('QA_JOIN_IF_WITH_INNER', 11, 30, "Join 'if' statement with inner 'if' statement");
-
-  static const CorrectionKind QA_JOIN_IF_WITH_OUTER = const CorrectionKind.con1('QA_JOIN_IF_WITH_OUTER', 12, 30, "Join 'if' statement with outer 'if' statement");
-
-  static const CorrectionKind QA_JOIN_VARIABLE_DECLARATION = const CorrectionKind.con1('QA_JOIN_VARIABLE_DECLARATION', 13, 30, "Join variable declaration");
-
-  static const CorrectionKind QA_REMOVE_TYPE_ANNOTATION = const CorrectionKind.con1('QA_REMOVE_TYPE_ANNOTATION', 14, 29, "Remove type annotation");
-
-  static const CorrectionKind QA_REPLACE_CONDITIONAL_WITH_IF_ELSE = const CorrectionKind.con1('QA_REPLACE_CONDITIONAL_WITH_IF_ELSE', 15, 30, "Replace conditional with 'if-else'");
-
-  static const CorrectionKind QA_REPLACE_IF_ELSE_WITH_CONDITIONAL = const CorrectionKind.con1('QA_REPLACE_IF_ELSE_WITH_CONDITIONAL', 16, 30, "Replace 'if-else' with conditional ('c ? x : y')");
-
-  static const CorrectionKind QA_SPLIT_AND_CONDITION = const CorrectionKind.con1('QA_SPLIT_AND_CONDITION', 17, 30, "Split && condition");
-
-  static const CorrectionKind QA_SPLIT_VARIABLE_DECLARATION = const CorrectionKind.con1('QA_SPLIT_VARIABLE_DECLARATION', 18, 30, "Split variable declaration");
-
-  static const CorrectionKind QA_SURROUND_WITH_BLOCK = const CorrectionKind.con1('QA_SURROUND_WITH_BLOCK', 19, 30, "Surround with block");
-
-  static const CorrectionKind QA_SURROUND_WITH_DO_WHILE = const CorrectionKind.con1('QA_SURROUND_WITH_DO_WHILE', 20, 30, "Surround with 'do-while'");
-
-  static const CorrectionKind QA_SURROUND_WITH_FOR = const CorrectionKind.con1('QA_SURROUND_WITH_FOR', 21, 30, "Surround with 'for'");
-
-  static const CorrectionKind QA_SURROUND_WITH_FOR_IN = const CorrectionKind.con1('QA_SURROUND_WITH_FOR_IN', 22, 30, "Surround with 'for-in'");
-
-  static const CorrectionKind QA_SURROUND_WITH_IF = const CorrectionKind.con1('QA_SURROUND_WITH_IF', 23, 30, "Surround with 'if'");
-
-  static const CorrectionKind QA_SURROUND_WITH_TRY_CATCH = const CorrectionKind.con1('QA_SURROUND_WITH_TRY_CATCH', 24, 30, "Surround with 'try-catch'");
-
-  static const CorrectionKind QA_SURROUND_WITH_TRY_FINALLY = const CorrectionKind.con1('QA_SURROUND_WITH_TRY_FINALLY', 25, 30, "Surround with 'try-finally'");
-
-  static const CorrectionKind QA_SURROUND_WITH_WHILE = const CorrectionKind.con1('QA_SURROUND_WITH_WHILE', 26, 30, "Surround with 'while'");
-
-  static const CorrectionKind QF_ADD_PACKAGE_DEPENDENCY = const CorrectionKind.con1('QF_ADD_PACKAGE_DEPENDENCY', 27, 50, "Add dependency on package '%s'");
-
-  static const CorrectionKind QF_ADD_SUPER_CONSTRUCTOR_INVOCATION = const CorrectionKind.con1('QF_ADD_SUPER_CONSTRUCTOR_INVOCATION', 28, 50, "Add super constructor %s invocation");
-
-  static const CorrectionKind QF_CHANGE_TO = const CorrectionKind.con1('QF_CHANGE_TO', 29, 51, "Change to '%s'");
-
-  static const CorrectionKind QF_CHANGE_TO_STATIC_ACCESS = const CorrectionKind.con1('QF_CHANGE_TO_STATIC_ACCESS', 30, 50, "Change access to static using '%s'");
-
-  static const CorrectionKind QF_CREATE_CLASS = const CorrectionKind.con2('QF_CREATE_CLASS', 31, 50, "Create class '%s'", CorrectionImage.IMG_CORRECTION_CLASS);
-
-  static const CorrectionKind QF_CREATE_CONSTRUCTOR = const CorrectionKind.con1('QF_CREATE_CONSTRUCTOR', 32, 50, "Create constructor '%s'");
-
-  static const CorrectionKind QF_CREATE_CONSTRUCTOR_SUPER = const CorrectionKind.con1('QF_CREATE_CONSTRUCTOR_SUPER', 33, 50, "Create constructor to call %s");
-
-  static const CorrectionKind QF_CREATE_FUNCTION = const CorrectionKind.con1('QF_CREATE_FUNCTION', 34, 49, "Create function '%s'");
-
-  static const CorrectionKind QF_CREATE_METHOD = const CorrectionKind.con1('QF_CREATE_METHOD', 35, 50, "Create method '%s'");
-
-  static const CorrectionKind QF_CREATE_MISSING_OVERRIDES = const CorrectionKind.con1('QF_CREATE_MISSING_OVERRIDES', 36, 50, "Create %d missing override(s)");
-
-  static const CorrectionKind QF_CREATE_NO_SUCH_METHOD = const CorrectionKind.con1('QF_CREATE_NO_SUCH_METHOD', 37, 49, "Create 'noSuchMethod' method");
-
-  static const CorrectionKind QF_CREATE_PART = const CorrectionKind.con1('QF_CREATE_PART', 38, 50, "Create part '%s'");
-
-  static const CorrectionKind QF_IMPORT_LIBRARY_PREFIX = const CorrectionKind.con1('QF_IMPORT_LIBRARY_PREFIX', 39, 51, "Use imported library '%s' with prefix '%s'");
-
-  static const CorrectionKind QF_IMPORT_LIBRARY_PROJECT = const CorrectionKind.con1('QF_IMPORT_LIBRARY_PROJECT', 40, 51, "Import library '%s'");
-
-  static const CorrectionKind QF_IMPORT_LIBRARY_SDK = const CorrectionKind.con1('QF_IMPORT_LIBRARY_SDK', 41, 51, "Import library '%s'");
-
-  static const CorrectionKind QF_IMPORT_LIBRARY_SHOW = const CorrectionKind.con1('QF_IMPORT_LIBRARY_SHOW', 42, 51, "Update library '%s' import");
-
-  static const CorrectionKind QF_INSERT_SEMICOLON = const CorrectionKind.con1('QF_INSERT_SEMICOLON', 43, 50, "Insert ';'");
-
-  static const CorrectionKind QF_MAKE_CLASS_ABSTRACT = const CorrectionKind.con1('QF_MAKE_CLASS_ABSTRACT', 44, 50, "Make class '%s' abstract");
-
-  static const CorrectionKind QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION = const CorrectionKind.con1('QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION', 45, 50, "Remove parameters in getter declaration");
-
-  static const CorrectionKind QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION = const CorrectionKind.con1('QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION', 46, 50, "Remove parentheses in getter invocation");
-
-  static const CorrectionKind QF_REMOVE_UNNECASSARY_CAST = const CorrectionKind.con1('QF_REMOVE_UNNECASSARY_CAST', 47, 50, "Remove unnecessary cast");
-
-  static const CorrectionKind QF_REMOVE_UNUSED_IMPORT = const CorrectionKind.con1('QF_REMOVE_UNUSED_IMPORT', 48, 50, "Remove unused import");
-
-  static const CorrectionKind QF_REPLACE_BOOLEAN_WITH_BOOL = const CorrectionKind.con1('QF_REPLACE_BOOLEAN_WITH_BOOL', 49, 50, "Replace 'boolean' with 'bool'");
-
-  static const CorrectionKind QF_USE_CONST = const CorrectionKind.con1('QF_USE_CONST', 50, 50, "Change to constant");
-
-  static const CorrectionKind QF_USE_EFFECTIVE_INTEGER_DIVISION = const CorrectionKind.con1('QF_USE_EFFECTIVE_INTEGER_DIVISION', 51, 50, "Use effective integer division ~/");
-
-  static const CorrectionKind QF_USE_EQ_EQ_NULL = const CorrectionKind.con1('QF_USE_EQ_EQ_NULL', 52, 50, "Use == null instead of 'is Null'");
-
-  static const CorrectionKind QF_USE_NOT_EQ_NULL = const CorrectionKind.con1('QF_USE_NOT_EQ_NULL', 53, 50, "Use != null instead of 'is! Null'");
-
-  static const List<CorrectionKind> values = const [
-      QA_ADD_PART_DIRECTIVE,
-      QA_ADD_TYPE_ANNOTATION,
-      QA_ASSIGN_TO_LOCAL_VARIABLE,
-      QA_CONVERT_INTO_BLOCK_BODY,
-      QA_CONVERT_INTO_EXPRESSION_BODY,
-      QA_CONVERT_INTO_IS_NOT,
-      QA_CONVERT_INTO_IS_NOT_EMPTY,
-      QA_EXCHANGE_OPERANDS,
-      QA_EXTRACT_CLASS,
-      QA_IMPORT_ADD_SHOW,
-      QA_INVERT_IF_STATEMENT,
-      QA_JOIN_IF_WITH_INNER,
-      QA_JOIN_IF_WITH_OUTER,
-      QA_JOIN_VARIABLE_DECLARATION,
-      QA_REMOVE_TYPE_ANNOTATION,
-      QA_REPLACE_CONDITIONAL_WITH_IF_ELSE,
-      QA_REPLACE_IF_ELSE_WITH_CONDITIONAL,
-      QA_SPLIT_AND_CONDITION,
-      QA_SPLIT_VARIABLE_DECLARATION,
-      QA_SURROUND_WITH_BLOCK,
-      QA_SURROUND_WITH_DO_WHILE,
-      QA_SURROUND_WITH_FOR,
-      QA_SURROUND_WITH_FOR_IN,
-      QA_SURROUND_WITH_IF,
-      QA_SURROUND_WITH_TRY_CATCH,
-      QA_SURROUND_WITH_TRY_FINALLY,
-      QA_SURROUND_WITH_WHILE,
-      QF_ADD_PACKAGE_DEPENDENCY,
-      QF_ADD_SUPER_CONSTRUCTOR_INVOCATION,
-      QF_CHANGE_TO,
-      QF_CHANGE_TO_STATIC_ACCESS,
-      QF_CREATE_CLASS,
-      QF_CREATE_CONSTRUCTOR,
-      QF_CREATE_CONSTRUCTOR_SUPER,
-      QF_CREATE_FUNCTION,
-      QF_CREATE_METHOD,
-      QF_CREATE_MISSING_OVERRIDES,
-      QF_CREATE_NO_SUCH_METHOD,
-      QF_CREATE_PART,
-      QF_IMPORT_LIBRARY_PREFIX,
-      QF_IMPORT_LIBRARY_PROJECT,
-      QF_IMPORT_LIBRARY_SDK,
-      QF_IMPORT_LIBRARY_SHOW,
-      QF_INSERT_SEMICOLON,
-      QF_MAKE_CLASS_ABSTRACT,
-      QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION,
-      QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION,
-      QF_REMOVE_UNNECASSARY_CAST,
-      QF_REMOVE_UNUSED_IMPORT,
-      QF_REPLACE_BOOLEAN_WITH_BOOL,
-      QF_USE_CONST,
-      QF_USE_EFFECTIVE_INTEGER_DIVISION,
-      QF_USE_EQ_EQ_NULL,
-      QF_USE_NOT_EQ_NULL];
-
-  final int relevance;
-
-  final String message;
-
-  final CorrectionImage image;
-
-  const CorrectionKind.con1(String name, int ordinal, int relevance, String message) : this.con2(name, ordinal, relevance, message, CorrectionImage.IMG_CORRECTION_CHANGE);
-
-  const CorrectionKind.con2(String name, int ordinal, this.relevance, this.message, this.image) : super(name, ordinal);
-}
-
-/**
- * Proposal for some change.
- */
-class CorrectionProposal {
-  /**
-   * An empty array of [CorrectionProposal]s.
-   */
-  static List<CorrectionProposal> EMPTY_ARRAY = new List<CorrectionProposal>(0);
-
-  final CorrectionKind kind;
-
-  String _name;
-
-  CorrectionProposal(this.kind, List<Object> arguments) {
-    this._name = JavaString.format(kind.message, arguments);
-  }
-
-  /**
-   * @return the name to display for user.
-   */
-  String get name => _name;
-}
-
-/**
- * [CorrectionProposal] to create new file.
- */
-class CreateFileCorrectionProposal extends CorrectionProposal {
-  final JavaFile file;
-
-  final String content;
-
-  CreateFileCorrectionProposal(this.file, this.content, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
-}
-
-/**
- * Proposal for linked position.
- */
-class LinkedPositionProposal {
-  final CorrectionImage icon;
-
-  final String text;
-
-  LinkedPositionProposal(this.icon, this.text);
-}
-
-/**
- * [CorrectionProposal] with single [Source] change.
- */
-class SourceCorrectionProposal extends CorrectionProposal {
-  final SourceChange change;
-
-  Map<String, List<SourceRange>> _linkedPositions = {};
-
-  Map<String, List<LinkedPositionProposal>> _linkedPositionProposals = {};
-
-  SourceRange endRange;
-
-  SourceCorrectionProposal(this.change, CorrectionKind kind, List<Object> arguments) : super(kind, arguments);
-
-  /**
-   * @return the [Map] or position IDs to their proposals.
-   */
-  Map<String, List<LinkedPositionProposal>> get linkedPositionProposals => _linkedPositionProposals;
-
-  /**
-   * @return the [Map] of position IDs to their locations.
-   */
-  Map<String, List<SourceRange>> get linkedPositions => _linkedPositions;
-
-  /**
-   * Sets [Map] of position IDs to their proposals.
-   */
-  void set linkedPositionProposals(Map<String, List<LinkedPositionProposal>> linkedPositionProposals) {
-    this._linkedPositionProposals = {};
-  }
-
-  /**
-   * Sets the [Map] or position IDs to their locations.
-   */
-  void set linkedPositions(Map<String, List<SourceRange>> linkedPositions) {
-    this._linkedPositions = {};
-  }
-}
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/src/generated/status.dart b/pkg/analysis_services/lib/src/generated/status.dart
deleted file mode 100644
index 7a96304..0000000
--- a/pkg/analysis_services/lib/src/generated/status.dart
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This code was auto-generated, is not intended to be edited, and is subject to
-// significant change. Please see the README file for more information.
-
-library services.status;
-
-import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'stubs.dart';
-
-/**
- * Outcome of a condition checking operation.
- */
-class RefactoringStatus {
-  /**
-   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#ERROR].
-   */
-  static RefactoringStatus createErrorStatus(String msg) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addError(msg);
-    return status;
-  }
-
-  /**
-   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#FATAL].
-   */
-  static RefactoringStatus createFatalErrorStatus(String msg, [RefactoringStatusContext context]) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addFatalError(msg, context);
-    return status;
-  }
-
-  /**
-   * @return the new [RefactoringStatus] with [RefactoringStatusSeverity#WARNING].
-   */
-  static RefactoringStatus createWarningStatus(String msg) {
-    RefactoringStatus status = new RefactoringStatus();
-    status.addWarning(msg);
-    return status;
-  }
-
-  /**
-   * @return the [Enum] value with maximal ordinal.
-   */
-  static Enum _max(Enum a, Enum b) {
-    if (b.ordinal > a.ordinal) {
-      return b;
-    }
-    return a;
-  }
-
-  RefactoringStatusSeverity _severity = RefactoringStatusSeverity.OK;
-
-  final List<RefactoringStatusEntry> entries = [];
-
-  /**
-   * Adds a <code>ERROR</code> entry filled with the given message and status to this status.
-   */
-  void addError(String msg, [RefactoringStatusContext context]) {
-    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, msg, context));
-  }
-
-  /**
-   * Adds a <code>FATAL</code> entry filled with the given message and status to this status.
-   */
-  void addFatalError(String msg, [RefactoringStatusContext context]) {
-    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.FATAL, msg, context));
-  }
-
-  /**
-   * Adds a <code>WARNING</code> entry filled with the given message and status to this status.
-   */
-  void addWarning(String msg, [RefactoringStatusContext context]) {
-    _addEntry(new RefactoringStatusEntry(RefactoringStatusSeverity.WARNING, msg, context));
-  }
-
-  /**
-   * @return the copy of this [RefactoringStatus] with [RefactoringStatusSeverity#ERROR]
-   *         replaced with [RefactoringStatusSeverity#FATAL].
-   */
-  RefactoringStatus escalateErrorToFatal() {
-    RefactoringStatus result = new RefactoringStatus();
-    for (RefactoringStatusEntry entry in entries) {
-      RefactoringStatusSeverity severity = entry.severity;
-      if (severity == RefactoringStatusSeverity.ERROR) {
-        severity = RefactoringStatusSeverity.FATAL;
-      }
-      result._addEntry(new RefactoringStatusEntry(severity, entry.message, entry.context));
-    }
-    return result;
-  }
-
-  /**
-   * @return the RefactoringStatusEntry with the highest severity, or <code>null</code> if no
-   *         entries are present.
-   */
-  RefactoringStatusEntry get entryWithHighestSeverity {
-    if (entries.isEmpty) {
-      return null;
-    }
-    RefactoringStatusEntry result = entries[0];
-    for (RefactoringStatusEntry entry in entries) {
-      if (result.severity.ordinal < entry.severity.ordinal) {
-        result = entry;
-      }
-    }
-    return result;
-  }
-
-  /**
-   * @return the message from the [RefactoringStatusEntry] with highest severity; may be
-   *         <code>null</code> if not entries are present.
-   */
-  String get message {
-    RefactoringStatusEntry entry = entryWithHighestSeverity;
-    if (entry == null) {
-      return null;
-    }
-    return entry.message;
-  }
-
-  /**
-   * @return the current severity of the [RefactoringStatus].
-   */
-  RefactoringStatusSeverity get severity => _severity;
-
-  /**
-   * @return <code>true</code> if the current severity is <code>
-   *  FATAL</code> or <code>ERROR</code>.
-   */
-  bool get hasError => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR;
-
-  /**
-   * @return <code>true</code> if the current severity is <code>FATAL</code>.
-   */
-  bool get hasFatalError => _severity == RefactoringStatusSeverity.FATAL;
-
-  /**
-   * @return <code>true</code> if the current severity is <code>
-   *  FATAL</code>, <code>ERROR</code>, <code>WARNING</code> or <code>INFO</code>.
-   */
-  bool get hasInfo => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR || _severity == RefactoringStatusSeverity.WARNING || _severity == RefactoringStatusSeverity.INFO;
-
-  /**
-   * @return <code>true</code> if the current severity is <code>
-   *  FATAL</code>, <code>ERROR</code> or <code>WARNING</code>.
-   */
-  bool get hasWarning => _severity == RefactoringStatusSeverity.FATAL || _severity == RefactoringStatusSeverity.ERROR || _severity == RefactoringStatusSeverity.WARNING;
-
-  /**
-   * @return <code>true</code> if the severity is <code>OK</code>.
-   */
-  bool get isOK => _severity == RefactoringStatusSeverity.OK;
-
-  /**
-   * Merges the receiver and the parameter statuses. The resulting list of entries in the receiver
-   * will contain entries from both. The resulting severity in the receiver will be the more severe
-   * of its current severity and the parameter's severity. Merging with <code>null</code> is allowed
-   * - it has no effect.
-   */
-  void merge(RefactoringStatus other) {
-    if (other == null) {
-      return;
-    }
-    entries.addAll(other.entries);
-    _severity = _max(_severity, other.severity);
-  }
-
-  @override
-  String toString() {
-    JavaStringBuilder sb = new JavaStringBuilder();
-    sb.append("<").append(_severity.name);
-    if (!isOK) {
-      sb.append("\n");
-      for (RefactoringStatusEntry entry in entries) {
-        sb.append("\t").append(entry).append("\n");
-      }
-    }
-    sb.append(">");
-    return sb.toString();
-  }
-
-  /**
-   * Adds given [RefactoringStatusEntry] and updates [severity].
-   */
-  void _addEntry(RefactoringStatusEntry entry) {
-    entries.add(entry);
-    _severity = _max(_severity, entry.severity);
-  }
-}
-
-/**
- * [RefactoringStatusContext] can be used to annotate a [RefactoringStatusEntry] with
- * additional information typically presented in the user interface.
- */
-class RefactoringStatusContext {
-  /**
-   * @return the [RefactoringStatusContext] that corresponds to the given [SearchMatch].
-   */
-  static RefactoringStatusContext create(SearchMatch match) {
-    Element enclosingElement = match.element;
-    return new RefactoringStatusContext(enclosingElement.context, enclosingElement.source, match.sourceRange);
-  }
-
-  AnalysisContext _context;
-
-  Source _source;
-
-  SourceRange _range;
-
-  RefactoringStatusContext(AnalysisContext context, Source source, SourceRange range) {
-    this._context = context;
-    this._source = source;
-    this._range = range;
-  }
-
-  /**
-   * Creates a new [RefactoringStatusContext] which corresponds to the given [AstNode].
-   */
-  RefactoringStatusContext.forNode(AstNode node) {
-    CompilationUnit unit = node.getAncestor((node) => node is CompilationUnit);
-    CompilationUnitElement unitElement = unit.element;
-    this._context = unitElement.context;
-    this._source = unitElement.source;
-    this._range = SourceRangeFactory.rangeNode(node);
-  }
-
-  /**
-   * Creates a new [RefactoringStatusContext] which corresponds to given location in the
-   * [Source] of the given [CompilationUnit].
-   */
-  RefactoringStatusContext.forUnit(CompilationUnit unit, SourceRange range) {
-    CompilationUnitElement unitElement = unit.element;
-    this._context = unitElement.context;
-    this._source = unitElement.source;
-    this._range = range;
-  }
-
-  /**
-   * @return the [RefactoringStatusContext] which corresponds to the declaration of the given
-   *         [Element].
-   */
-  RefactoringStatusContext.forElement(Element element) {
-    this._context = element.context;
-    this._source = element.source;
-    this._range = SourceRangeFactory.rangeElementName(element);
-  }
-
-  /**
-   * @return the [AnalysisContext] in which this status occurs.
-   */
-  AnalysisContext get context => _context;
-
-  /**
-   * @return the [SourceRange] with specific location where this status occurs.
-   */
-  SourceRange get range => _range;
-
-  /**
-   * @return the [Source] in which this status occurs.
-   */
-  Source get source => _source;
-
-  @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[source=");
-    builder.append(_source);
-    builder.append(", range=");
-    builder.append(_range);
-    builder.append("]");
-    return builder.toString();
-  }
-}
-
-/**
- * An immutable object representing an entry in the list in [RefactoringStatus]. A refactoring
- * status entry consists of a severity, a message and a context object.
- */
-class RefactoringStatusEntry {
-  /**
-   * The severity level.
-   */
-  final RefactoringStatusSeverity severity;
-
-  /**
-   * The message of the status entry.
-   */
-  final String message;
-
-  /**
-   * The [RefactoringStatusContext] which can be used to show more detailed information
-   * regarding this status entry in the UI. May be `null` indicating that no context is
-   * available.
-   */
-  RefactoringStatusContext _context;
-
-  RefactoringStatusEntry(this.severity, this.message, [RefactoringStatusContext ctx]) {
-    this._context = ctx;
-  }
-
-  /**
-   * @return the [RefactoringStatusContext] which can be used to show more detailed
-   *         information regarding this status entry in the UI. The method may return `null`
-   *         indicating that no context is available.
-   */
-  RefactoringStatusContext get context => _context;
-
-  /**
-   * Returns whether the entry represents an error or not.
-   *
-   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.ERROR</code>).
-   */
-  bool get isError => severity == RefactoringStatusSeverity.ERROR;
-
-  /**
-   * Returns whether the entry represents a fatal error or not.
-   *
-   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.FATAL</code>)
-   */
-  bool get isFatalError => severity == RefactoringStatusSeverity.FATAL;
-
-  /**
-   * Returns whether the entry represents an information or not.
-   *
-   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.INFO</code>).
-   */
-  bool get isInfo => severity == RefactoringStatusSeverity.INFO;
-
-  /**
-   * Returns whether the entry represents a warning or not.
-   *
-   * @return <code>true</code> if (severity ==<code>RefactoringStatusSeverity.WARNING</code>).
-   */
-  bool get isWarning => severity == RefactoringStatusSeverity.WARNING;
-
-  @override
-  String toString() {
-    if (_context != null) {
-      return "${severity}: ${message}; Context: ${_context}";
-    } else {
-      return "${severity}: ${message}";
-    }
-  }
-}
-
-/**
- * Severity of [RefactoringStatus].
- */
-class RefactoringStatusSeverity extends Enum<RefactoringStatusSeverity> {
-  static const RefactoringStatusSeverity OK = const RefactoringStatusSeverity('OK', 0);
-
-  static const RefactoringStatusSeverity INFO = const RefactoringStatusSeverity('INFO', 1);
-
-  static const RefactoringStatusSeverity WARNING = const RefactoringStatusSeverity('WARNING', 2);
-
-  static const RefactoringStatusSeverity ERROR = const RefactoringStatusSeverity('ERROR', 3);
-
-  static const RefactoringStatusSeverity FATAL = const RefactoringStatusSeverity('FATAL', 4);
-
-  static const List<RefactoringStatusSeverity> values = const [OK, INFO, WARNING, ERROR, FATAL];
-
-  const RefactoringStatusSeverity(String name, int ordinal) : super(name, ordinal);
-}
\ No newline at end of file
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
deleted file mode 100644
index d679c35..0000000
--- a/pkg/analysis_services/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: analysis_services
-version: 0.4.0
-author: Dart Team <misc@dartlang.org>
-description: A set of services on top of Analysis Engine
-homepage: http://www.dartlang.org
-environment:
-  sdk: '>=1.0.0 <2.0.0'
-dependencies:
-  analyzer: '>=0.22.0-dev <0.23.0'
-dev_dependencies:
-  analysis_testing: '>=0.4.0 <0.5.0'
-  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_services/test/correction/change_test.dart b/pkg/analysis_services/test/correction/change_test.dart
deleted file mode 100644
index 49d458c..0000000
--- a/pkg/analysis_services/test/correction/change_test.dart
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.services.correction.change;
-
-import 'package:analysis_services/constants.dart';
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_testing/reflective_tests.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:unittest/unittest.dart';
-
-
-main() {
-  groupSep = ' | ';
-  runReflectiveTests(ChangeTest);
-  runReflectiveTests(EditTest);
-  runReflectiveTests(FileEditTest);
-  runReflectiveTests(LinkedEditGroupTest);
-  runReflectiveTests(LinkedEditSuggestionTest);
-  runReflectiveTests(PositionTest);
-}
-
-
-@ReflectiveTestCase()
-class ChangeTest {
-  void test_getFileEdit_empty() {
-    Change change = new Change('msg');
-    expect(change.getFileEdit('/some.dart'), isNull);
-  }
-
-  void test_addEdit() {
-    Change change = new Change('msg');
-    Edit edit1 = new Edit(1, 2, 'a');
-    Edit edit2 = new Edit(1, 2, 'b');
-    expect(change.fileEdits, hasLength(0));
-    change.addEdit('/a.dart', edit1);
-    expect(change.fileEdits, hasLength(1));
-    change.addEdit('/a.dart', edit2);
-    expect(change.fileEdits, hasLength(1));
-    {
-      FileEdit fileEdit = change.getFileEdit('/a.dart');
-      expect(fileEdit, isNotNull);
-      expect(fileEdit.edits, unorderedEquals([edit1, edit2]));
-    }
-  }
-
-  void test_getFileEdit() {
-    Change change = new Change('msg');
-    FileEdit fileEdit = new FileEdit('/a.dart');
-    change.addFileEdit(fileEdit);
-    expect(change.getFileEdit('/a.dart'), fileEdit);
-  }
-
-  void test_toJson() {
-    Change change = new Change('msg');
-    change.addFileEdit(new FileEdit('/a.dart')
-        ..add(new Edit(1, 2, 'aaa'))
-        ..add(new Edit(10, 20, 'bbb')));
-    change.addFileEdit(new FileEdit('/b.dart')
-        ..add(new Edit(21, 22, 'xxx'))
-        ..add(new Edit(210, 220, 'yyy')));
-    {
-      var group = new LinkedEditGroup('id-a');
-      change.addLinkedEditGroup(group
-          ..addPosition(new Position('/ga.dart', 1), 2)
-          ..addPosition(new Position('/ga.dart', 10), 2));
-      group.addSuggestion(
-          new LinkedEditSuggestion(LinkedEditSuggestionKind.TYPE, 'AA'));
-      group.addSuggestion(
-          new LinkedEditSuggestion(LinkedEditSuggestionKind.TYPE, 'BB'));
-    }
-    change.addLinkedEditGroup(new LinkedEditGroup('id-b')
-        ..addPosition(new Position('/gb.dart', 10), 5)
-        ..addPosition(new Position('/gb.dart', 100), 5));
-    change.selection = new Position('/selection.dart', 42);
-    var expectedJson = {
-      'message': 'msg',
-      'edits': [{
-          'file': '/a.dart',
-          'edits': [{
-              'offset': 1,
-              'length': 2,
-              'replacement': 'aaa'
-            }, {
-              'offset': 10,
-              'length': 20,
-              'replacement': 'bbb'
-            }]
-        }, {
-          'file': '/b.dart',
-          'edits': [{
-              'offset': 21,
-              'length': 22,
-              'replacement': 'xxx'
-            }, {
-              'offset': 210,
-              'length': 220,
-              'replacement': 'yyy'
-            }]
-        }],
-      'linkedEditGroups': [{
-          'id': 'id-a',
-          'length': 2,
-          'positions': [{
-              'file': '/ga.dart',
-              'offset': 1
-            }, {
-              'file': '/ga.dart',
-              'offset': 10
-            }],
-          'suggestions': [{
-              'kind': 'TYPE',
-              'value': 'AA'
-            }, {
-              'kind': 'TYPE',
-              'value': 'BB'
-            }]
-        }, {
-          'id': 'id-b',
-          'length': 5,
-          'positions': [{
-              'file': '/gb.dart',
-              'offset': 10
-            }, {
-              'file': '/gb.dart',
-              'offset': 100
-            }],
-          'suggestions': []
-        }],
-      'selection': {
-        'file': '/selection.dart',
-        'offset': 42
-      }
-    };
-    expect(change.toJson(), expectedJson);
-    // some toString()
-    change.toString();
-  }
-}
-
-
-@ReflectiveTestCase()
-class EditTest {
-  void test_end() {
-    Edit edit = new Edit(1, 2, 'foo');
-    expect(edit.end, 3);
-  }
-
-  void test_eqEq() {
-    Edit a = new Edit(1, 2, 'aaa');
-    Edit a2 = new Edit(1, 2, 'aaa');
-    Edit b = new Edit(1, 2, 'aaa');
-    expect(a == a, isTrue);
-    expect(a == new Edit(1, 2, 'aaa'), isTrue);
-    expect(a == this, isFalse);
-    expect(a == new Edit(1, 2, 'bbb'), isFalse);
-    expect(a == new Edit(10, 2, 'aaa'), isFalse);
-  }
-
-  void test_new() {
-    Edit edit = new Edit(1, 2, 'foo');
-    expect(edit.offset, 1);
-    expect(edit.length, 2);
-    expect(edit.replacement, 'foo');
-    expect(edit.toString(), 'Edit(offset=1, length=2, replacement=:>foo<:)');
-  }
-
-  void test_new_range() {
-    SourceRange range = new SourceRange(1, 2);
-    Edit edit = new Edit.range(range, 'foo');
-    expect(edit.offset, 1);
-    expect(edit.length, 2);
-    expect(edit.replacement, 'foo');
-  }
-  void test_toJson() {
-    Edit edit = new Edit(1, 2, 'foo');
-    var expectedJson = {
-      OFFSET: 1,
-      LENGTH: 2,
-      REPLACEMENT: 'foo'
-    };
-    expect(edit.toJson(), expectedJson);
-  }
-
-}
-
-
-@ReflectiveTestCase()
-class FileEditTest {
-  void test_new() {
-    FileEdit fileEdit = new FileEdit('/test.dart');
-    fileEdit.add(new Edit(1, 2, 'aaa'));
-    fileEdit.add(new Edit(10, 20, 'bbb'));
-    expect(
-        fileEdit.toString(),
-        'FileEdit(file=/test.dart, edits=['
-            'Edit(offset=1, length=2, replacement=:>aaa<:), '
-            'Edit(offset=10, length=20, replacement=:>bbb<:)])');
-  }
-
-  void test_toJson() {
-    FileEdit fileEdit = new FileEdit('/test.dart');
-    fileEdit.add(new Edit(1, 2, 'aaa'));
-    fileEdit.add(new Edit(10, 20, 'bbb'));
-    var expectedJson = {
-      FILE: '/test.dart',
-      EDITS: [{
-          OFFSET: 1,
-          LENGTH: 2,
-          REPLACEMENT: 'aaa'
-        }, {
-          OFFSET: 10,
-          LENGTH: 20,
-          REPLACEMENT: 'bbb'
-        },]
-    };
-    expect(fileEdit.toJson(), expectedJson);
-  }
-}
-
-
-@ReflectiveTestCase()
-class LinkedEditGroupTest {
-  void test_new() {
-    LinkedEditGroup group = new LinkedEditGroup('my-id');
-    group.addPosition(new Position('/a.dart', 1), 2);
-    group.addPosition(new Position('/b.dart', 10), 2);
-    expect(
-        group.toString(),
-        'LinkedEditGroup(id=my-id, length=2, positions=['
-            'Position(file=/a.dart, offset=1), '
-            'Position(file=/b.dart, offset=10)], suggestions=[])');
-  }
-
-  void test_toJson() {
-    LinkedEditGroup group = new LinkedEditGroup('my-id');
-    group.addPosition(new Position('/a.dart', 1), 2);
-    group.addPosition(new Position('/b.dart', 10), 2);
-    group.addSuggestion(
-        new LinkedEditSuggestion(LinkedEditSuggestionKind.TYPE, 'AA'));
-    group.addSuggestion(
-        new LinkedEditSuggestion(LinkedEditSuggestionKind.TYPE, 'BB'));
-    expect(group.toJson(), {
-      'id': 'my-id',
-      'length': 2,
-      'positions': [{
-          'file': '/a.dart',
-          'offset': 1
-        }, {
-          'file': '/b.dart',
-          'offset': 10
-        }],
-      'suggestions': [{
-          'kind': 'TYPE',
-          'value': 'AA'
-        }, {
-          'kind': 'TYPE',
-          'value': 'BB'
-        }]
-    });
-  }
-}
-
-
-@ReflectiveTestCase()
-class LinkedEditSuggestionTest {
-  void test_eqEq() {
-    var a = new LinkedEditSuggestion(LinkedEditSuggestionKind.METHOD, 'a');
-    var a2 = new LinkedEditSuggestion(LinkedEditSuggestionKind.METHOD, 'a');
-    var b = new LinkedEditSuggestion(LinkedEditSuggestionKind.TYPE, 'a');
-    var c = new LinkedEditSuggestion(LinkedEditSuggestionKind.METHOD, 'c');
-    expect(a == a, isTrue);
-    expect(a == a2, isTrue);
-    expect(a == this, isFalse);
-    expect(a == b, isFalse);
-    expect(a == c, isFalse);
-  }
-}
-
-
-@ReflectiveTestCase()
-class PositionTest {
-  void test_eqEq() {
-    Position a = new Position('/a.dart', 1);
-    Position a2 = new Position('/a.dart', 1);
-    Position b = new Position('/b.dart', 1);
-    expect(a == a, isTrue);
-    expect(a == a2, isTrue);
-    expect(a == b, isFalse);
-    expect(a == this, isFalse);
-  }
-
-  void test_hashCode() {
-    Position position = new Position('/test.dart', 1);
-    position.hashCode;
-  }
-
-  void test_new() {
-    Position position = new Position('/test.dart', 1);
-    expect(position.file, '/test.dart');
-    expect(position.offset, 1);
-    expect(position.toString(), 'Position(file=/test.dart, offset=1)');
-  }
-
-  void test_toJson() {
-    Position position = new Position('/test.dart', 1);
-    var expectedJson = {
-      FILE: '/test.dart',
-      OFFSET: 1
-    };
-    expect(position.toJson(), expectedJson);
-  }
-}
diff --git a/pkg/analysis_services/test/correction/status_test.dart b/pkg/analysis_services/test/correction/status_test.dart
deleted file mode 100644
index df4442f7..0000000
--- a/pkg/analysis_services/test/correction/status_test.dart
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.services.correction.status;
-
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/search/search_engine.dart';
-import 'package:analysis_services/src/correction/source_range.dart';
-import 'package:analysis_testing/abstract_single_unit.dart';
-import 'package:analysis_testing/reflective_tests.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:typed_mock/typed_mock.dart';
-import 'package:unittest/unittest.dart';
-
-
-main() {
-  groupSep = ' | ';
-  runReflectiveTests(RefactoringStatusContextTest);
-  runReflectiveTests(RefactoringStatusEntryTest);
-  runReflectiveTests(RefactoringStatusTest);
-}
-
-
-@ReflectiveTestCase()
-class RefactoringStatusContextTest extends AbstractSingleUnitTest {
-  void test_new_forElement() {
-    resolveTestUnit('class MyClass {}');
-    Element element = findElement('MyClass');
-    var statusContext = new RefactoringStatusContext.forElement(element);
-    // access
-    expect(statusContext.context, context);
-    expect(statusContext.source, testSource);
-    expect(
-        statusContext.range,
-        rangeStartLength(element.nameOffset, 'MyClass'.length));
-  }
-
-  void test_new_forMatch() {
-    resolveTestUnit('class MyClass {}');
-    Element element = findElement('MyClass');
-    SourceRange range = rangeElementName(element);
-    SearchMatch match = new SearchMatch(null, element, range, true, false);
-    var statusContext = new RefactoringStatusContext.forMatch(match);
-    // access
-    expect(statusContext.context, context);
-    expect(statusContext.source, testSource);
-    expect(statusContext.range, range);
-  }
-
-  void test_new_forNode() {
-    resolveTestUnit('''
-main() {
-}
-''');
-    AstNode node = findNodeAtString('main');
-    var statusContext = new RefactoringStatusContext.forNode(node);
-    // access
-    expect(statusContext.context, context);
-    expect(statusContext.source, testSource);
-    expect(statusContext.range, rangeNode(node));
-  }
-
-  void test_new_forUnit() {
-    resolveTestUnit('');
-    SourceRange range = rangeStartLength(10, 20);
-    var statusContext = new RefactoringStatusContext.forUnit(testUnit, range);
-    // access
-    expect(statusContext.context, context);
-    expect(statusContext.source, testSource);
-    expect(statusContext.range, range);
-  }
-}
-
-
-@ReflectiveTestCase()
-class RefactoringStatusEntryTest {
-  void test_new_withContext() {
-    RefactoringStatusContext context = new _MockRefactoringStatusContext();
-    RefactoringStatusEntry entry =
-        new RefactoringStatusEntry(
-            RefactoringStatusSeverity.ERROR,
-            "my message",
-            context);
-    // access
-    expect(entry.severity, RefactoringStatusSeverity.ERROR);
-    expect(entry.message, 'my message');
-    expect(entry.context, context);
-  }
-
-  void test_new_withoutContext() {
-    RefactoringStatusEntry entry =
-        new RefactoringStatusEntry(RefactoringStatusSeverity.ERROR, "my message");
-    // access
-    expect(entry.severity, RefactoringStatusSeverity.ERROR);
-    expect(entry.message, 'my message');
-    expect(entry.context, isNull);
-    // isX
-    expect(entry.isFatalError, isFalse);
-    expect(entry.isError, isTrue);
-    expect(entry.isWarning, isFalse);
-  }
-}
-
-
-@ReflectiveTestCase()
-class RefactoringStatusTest {
-  void test_addError() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    // initial state
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.OK);
-    // add ERROR
-    refactoringStatus.addError('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    expect(refactoringStatus.isOK, isFalse);
-    expect(refactoringStatus.hasFatalError, isFalse);
-    expect(refactoringStatus.hasError, isTrue);
-    // entries
-    List<RefactoringStatusEntry> entries = refactoringStatus.entries;
-    expect(entries, hasLength(1));
-    expect(entries[0].message, 'msg');
-  }
-
-  void test_addFatalError_withContext() {
-    RefactoringStatusContext context = new _MockRefactoringStatusContext();
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    // initial state
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.OK);
-    // add FATAL
-    refactoringStatus.addFatalError('msg', context);
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL);
-    expect(refactoringStatus.isOK, isFalse);
-    expect(refactoringStatus.hasFatalError, isTrue);
-    expect(refactoringStatus.hasError, isTrue);
-    // entries
-    List<RefactoringStatusEntry> entries = refactoringStatus.entries;
-    expect(entries, hasLength(1));
-    expect(entries[0].message, 'msg');
-    expect(entries[0].context, context);
-    // add WARNING, resulting severity is still FATAL
-    refactoringStatus.addWarning("warning");
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL);
-  }
-
-  void test_addFatalError_withoutContext() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    // initial state
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.OK);
-    // add FATAL
-    refactoringStatus.addFatalError('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL);
-    expect(refactoringStatus.isOK, isFalse);
-    expect(refactoringStatus.hasFatalError, isTrue);
-    expect(refactoringStatus.hasError, isTrue);
-    // entries
-    List<RefactoringStatusEntry> entries = refactoringStatus.entries;
-    expect(entries, hasLength(1));
-    expect(entries[0].message, 'msg');
-    expect(entries[0].context, isNull);
-  }
-
-  void test_addStatus_Error_withWarning() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    refactoringStatus.addError("err");
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    // merge with OK
-    {
-      RefactoringStatus other = new RefactoringStatus();
-      other.addWarning("warn");
-      refactoringStatus.addStatus(other);
-    }
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    expect(refactoringStatus.message, 'err');
-  }
-
-  void test_addStatus_Warning_null() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    refactoringStatus.addWarning("warn");
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING);
-    // merge with "null"
-    refactoringStatus.addStatus(null);
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING);
-  }
-
-  void test_addStatus_Warning_withError() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    refactoringStatus.addWarning("warn");
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING);
-    // merge with OK
-    {
-      RefactoringStatus other = new RefactoringStatus();
-      other.addError("err");
-      refactoringStatus.addStatus(other);
-    }
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    expect(refactoringStatus.message, 'err');
-  }
-
-  void test_addWarning() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    // initial state
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.OK);
-    // add WARNING
-    refactoringStatus.addWarning('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING);
-    expect(refactoringStatus.isOK, isFalse);
-    expect(refactoringStatus.hasFatalError, isFalse);
-    expect(refactoringStatus.hasError, isFalse);
-    expect(refactoringStatus.hasWarning, isTrue);
-    // entries
-    List<RefactoringStatusEntry> entries = refactoringStatus.entries;
-    expect(entries, hasLength(1));
-    expect(entries[0].message, 'msg');
-  }
-
-  void test_escalateErrorToFatal() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus.error('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    // escalated
-    RefactoringStatus escalated = refactoringStatus.escalateErrorToFatal();
-    expect(escalated.severity, RefactoringStatusSeverity.FATAL);
-  }
-
-  void test_get_entryWithHighestSeverity() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus();
-    // no entries
-    expect(refactoringStatus.entryWithHighestSeverity, isNull);
-    expect(refactoringStatus.message, isNull);
-    // add entries
-    refactoringStatus.addError('msgError');
-    refactoringStatus.addWarning('msgWarning');
-    refactoringStatus.addFatalError('msgFatalError');
-    // get entry
-    {
-      RefactoringStatusEntry entry = refactoringStatus.entryWithHighestSeverity;
-      expect(entry.severity, RefactoringStatusSeverity.FATAL);
-      expect(entry.message, 'msgFatalError');
-    }
-    // get message
-    expect(refactoringStatus.message, 'msgFatalError');
-  }
-
-  void test_newError() {
-    RefactoringStatusContext context = new _MockRefactoringStatusContext();
-    RefactoringStatus refactoringStatus =
-        new RefactoringStatus.error('msg', context);
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.ERROR);
-    expect(refactoringStatus.message, 'msg');
-    expect(refactoringStatus.entryWithHighestSeverity.context, context);
-  }
-
-  void test_newFatalError() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus.fatal('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.FATAL);
-    expect(refactoringStatus.message, 'msg');
-  }
-
-  void test_newWarning() {
-    RefactoringStatus refactoringStatus = new RefactoringStatus.warning('msg');
-    expect(refactoringStatus.severity, RefactoringStatusSeverity.WARNING);
-    expect(refactoringStatus.message, 'msg');
-  }
-}
-
-
-class _MockRefactoringStatusContext extends TypedMock implements
-    RefactoringStatusContext {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
diff --git a/pkg/analysis_services/test/refactoring/abstract_refactoring.dart b/pkg/analysis_services/test/refactoring/abstract_refactoring.dart
deleted file mode 100644
index 19490d4..0000000
--- a/pkg/analysis_services/test/refactoring/abstract_refactoring.dart
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.services.refactoring.rename;
-
-import 'dart:async';
-
-import 'package:analysis_services/correction/change.dart';
-import 'package:analysis_services/correction/status.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_services/refactoring/refactoring.dart';
-import 'package:analysis_services/src/search/search_engine.dart';
-import 'package:analysis_testing/abstract_single_unit.dart';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:unittest/unittest.dart';
-
-
-int findIdentifierLength(String search) {
-  int length = 0;
-  while (length < search.length) {
-    int c = search.codeUnitAt(length);
-    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-        c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-        c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-      break;
-    }
-    length++;
-  }
-  return length;
-}
-
-
-/**
- * The base class for all [Refactoring] tests.
- */
-abstract class RefactoringTest extends AbstractSingleUnitTest {
-  Index index;
-  SearchEngineImpl searchEngine;
-
-  Change refactoringChange;
-
-  Refactoring get refactoring;
-
-  /**
-   * Asserts that [refactoring] initial/final conditions status is OK.
-   */
-  Future assertRefactoringConditionsOK() {
-    return refactoring.checkInitialConditions().then((status) {
-      assertRefactoringStatusOK(status);
-      return refactoring.checkFinalConditions().then((status) {
-        assertRefactoringStatusOK(status);
-      });
-    });
-  }
-
-  /**
-   * Asserts that [status] has expected severity and message.
-   */
-  void assertRefactoringStatus(RefactoringStatus status,
-      RefactoringStatusSeverity expectedSeverity, {String expectedMessage,
-      SourceRange expectedContextRange, String expectedContextSearch}) {
-    expect(status.severity, expectedSeverity, reason: status.message);
-    if (expectedSeverity != RefactoringStatusSeverity.OK) {
-      RefactoringStatusEntry entry = status.entryWithHighestSeverity;
-      expect(entry.severity, expectedSeverity);
-      if (expectedMessage != null) {
-        expect(entry.message, expectedMessage);
-      }
-      if (expectedContextRange != null) {
-        expect(entry.context.range, expectedContextRange);
-      }
-      if (expectedContextSearch != null) {
-        SourceRange contextRange = entry.context.range;
-        int expectedOffset = findOffset(expectedContextSearch);
-        int expectedLength = findIdentifierLength(expectedContextSearch);
-        expect(contextRange.offset, expectedOffset);
-        expect(contextRange.length, expectedLength);
-      }
-    }
-  }
-
-  /**
-   * Asserts that [refactoring] status is OK.
-   */
-  void assertRefactoringStatusOK(RefactoringStatus status) {
-    assertRefactoringStatus(status, RefactoringStatusSeverity.OK);
-  }
-
-  void indexTestUnit(String code) {
-    resolveTestUnit(code);
-    index.indexUnit(context, testUnit);
-  }
-
-  void indexUnit(String file, String code) {
-    Source source = addSource(file, code);
-    CompilationUnit unit = resolveLibraryUnit(source);
-    index.indexUnit(context, unit);
-  }
-
-  void setUp() {
-    super.setUp();
-    index = createLocalMemoryIndex();
-    searchEngine = new SearchEngineImpl(index);
-  }
-}
diff --git a/pkg/analysis_services/test/refactoring/test_all.dart b/pkg/analysis_services/test/refactoring/test_all.dart
deleted file mode 100644
index bb18e15..0000000
--- a/pkg/analysis_services/test/refactoring/test_all.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test.services.refactoring;
-
-import 'package:unittest/unittest.dart';
-
-import 'naming_conventions_test.dart' as naming_conventions_test;
-import 'rename_library_test.dart' as rename_library_test;
-import 'rename_local_test.dart' as rename_local_test;
-
-/// Utility for manually running all tests.
-main() {
-  groupSep = ' | ';
-  group('refactoring', () {
-    naming_conventions_test.main();
-    rename_library_test.main();
-    rename_local_test.main();
-  });
-}
diff --git a/pkg/analysis_testing/lib/abstract_single_unit.dart b/pkg/analysis_testing/lib/abstract_single_unit.dart
index 7930d09..15e70d6 100644
--- a/pkg/analysis_testing/lib/abstract_single_unit.dart
+++ b/pkg/analysis_testing/lib/abstract_single_unit.dart
@@ -61,6 +61,10 @@
     return ElementLocator.locate(node);
   }
 
+  int findEnd(String search) {
+    return findOffset(search) + search.length;
+  }
+
   int findOffset(String search) {
     int offset = testCode.indexOf(search);
     expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
diff --git a/pkg/analysis_testing/lib/mock_sdk.dart b/pkg/analysis_testing/lib/mock_sdk.dart
index 0d63249..8525481 100644
--- a/pkg/analysis_testing/lib/mock_sdk.dart
+++ b/pkg/analysis_testing/lib/mock_sdk.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:path/path.dart';
 
 
 class MockSdk implements DartSdk {
@@ -33,10 +32,12 @@
 class String implements Comparable<String> {
   bool get isEmpty => false;
   bool get isNotEmpty => false;
+  int get length => 0;
 }
 
 class bool extends Object {}
 abstract class num implements Comparable<num> {
+  bool operator <(num other);
   num operator +(num other);
   num operator -(num other);
   num operator *(num other);
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 8e8cfad..1c1ec87 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.22.1
+
+* Changes in the async/await support.
+
+
 ## 0.22.0
 
   New API:
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index 7dae073..d4d760d 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -14,15 +14,8 @@
  * Analyzer commandline configuration options.
  */
 class CommandLineOptions {
-
-  /** Batch mode (for unit testing) */
-  final bool shouldBatch;
-
-  /** Whether to use machine format for error display */
-  final bool machineFormat;
-
-  /** Whether to display version information */
-  final bool displayVersion;
+  /** The path to the dart SDK */
+  final String dartSdkPath;
 
   /** A table mapping the names of defined variables to their values. */
   final Map<String, String> definedVariables;
@@ -30,55 +23,69 @@
   /** Whether to report hints */
   final bool disableHints;
 
+  /** Whether to display version information */
+  final bool displayVersion;
+
+  /** Whether to enable support for the proposed async feature. */
+  final bool enableAsync;
+
+  /** Whether to enable support for the proposed enum feature. */
+  final bool enableEnum;
+
   /** Whether to ignore unrecognized flags */
   final bool ignoreUnrecognizedFlags;
 
+  /** Whether to log additional analysis messages and exceptions */
+  final bool log;
+
+  /** Whether to use machine format for error display */
+  final bool machineFormat;
+
+  /** The path to the package root */
+  final String packageRootPath;
+
   /** Whether to show performance statistics */
   final bool perf;
 
+  /** Batch mode (for unit testing) */
+  final bool shouldBatch;
+
   /** Whether to show package: warnings */
   final bool showPackageWarnings;
 
   /** Whether to show SDK warnings */
   final bool showSdkWarnings;
 
+  /** The source files to analyze */
+  final List<String> sourceFiles;
+
   /** Whether to show both cold and hot performance statistics */
   final bool warmPerf;
 
   /** Whether to treat warnings as fatal */
   final bool warningsAreFatal;
 
-  /** The path to the dart SDK */
-  final String dartSdkPath;
-
-  /** The path to the package root */
-  final String packageRootPath;
-
-  /** The source files to analyze */
-  final List<String> sourceFiles;
-
-  /** Whether to log additional analysis messages and exceptions */
-  final bool log;
-
   /**
    * Initialize options from the given parsed [args].
    */
   CommandLineOptions._fromArgs(ArgResults args, Map<String, String> definedVariables)
-    : shouldBatch = args['batch'],
-      machineFormat = args['machine'] || args['format'] == 'machine',
-      displayVersion = args['version'],
+    : dartSdkPath = args['dart-sdk'],
+      this.definedVariables = definedVariables,
       disableHints = args['no-hints'],
+      displayVersion = args['version'],
+      enableAsync = args['enable-async'],
+      enableEnum = args['enable-enum'],
       ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
+      log = args['log'],
+      machineFormat = args['machine'] || args['format'] == 'machine',
+      packageRootPath = args['package-root'],
       perf = args['perf'],
+      shouldBatch = args['batch'],
       showPackageWarnings = args['show-package-warnings'] || args['package-warnings'],
       showSdkWarnings = args['show-sdk-warnings'] || args['warnings'],
-      warmPerf = args['warm-perf'],
-      warningsAreFatal = args['fatal-warnings'],
-      dartSdkPath = args['dart-sdk'],
-      packageRootPath = args['package-root'],
-      log = args['log'],
       sourceFiles = args.rest,
-      this.definedVariables = definedVariables;
+      warmPerf = args['warm-perf'],
+      warningsAreFatal = args['fatal-warnings'];
 
   /**
    * Parse [args] into [CommandLineOptions] describing the specified
@@ -135,17 +142,26 @@
       ..addFlag('perf',
           help: 'Show performance statistics',
           defaultsTo: false, negatable: false)
-      ..addFlag('warm-perf',
-          help: 'Show both cold and warm performance statistics',
-          defaultsTo: false, negatable: false, hide: true)
       ..addFlag('warnings', help: 'Show warnings from SDK imports',
           defaultsTo: false, negatable: false)
       ..addFlag('show-sdk-warnings', help: 'Show warnings from SDK imports (deprecated)',
           defaultsTo: false, negatable: false)
       ..addFlag('help', abbr: 'h', help: 'Display this help message',
           defaultsTo: false, negatable: false)
+      //
+      // Hidden flags.
+      //
+      ..addFlag('enable-async',
+          help: 'Enable support for the proposed async feature',
+          defaultsTo: false, negatable: false, hide: true)
+      ..addFlag('enable-enum',
+          help: 'Enable support for the proposed enum feature',
+          defaultsTo: false, negatable: false, hide: true)
       ..addFlag('log', help: 'Log additional messages and exceptions',
-        defaultsTo: false, negatable: false, hide: true);
+          defaultsTo: false, negatable: false, hide: true)
+      ..addFlag('warm-perf',
+          help: 'Show both cold and warm performance statistics',
+          defaultsTo: false, negatable: false, hide: true);
 
     try {
       // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
@@ -191,7 +207,9 @@
 
   static String _getVersion() {
     try {
-      String versionPath = Platform.script.resolve('../version').toFilePath();
+      // This is relative to bin/snapshot, so ../..
+      String versionPath =
+          Platform.script.resolve('../../version').toFilePath();
       File versionFile = new File(versionPath);
       return versionFile.readAsStringSync().trim();
     } catch (_) {
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index a2b8e13..dabeec2 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -264,6 +264,8 @@
     AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
     contextOptions.cacheSize = _MAX_CACHE_SIZE;
     contextOptions.hint = !options.disableHints;
+    contextOptions.enableAsync = options.enableAsync;
+    contextOptions.enableEnum = options.enableEnum;
     context.analysisOptions = contextOptions;
 
     // Create and add a ChangeSet
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 185d4da..cb81866 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -992,7 +992,7 @@
   AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(cloneNode(node.leftHandSide), node.operator, cloneNode(node.rightHandSide));
 
   @override
-  AwaitExpression visitAwaitExpression(AwaitExpression node) => new AwaitExpression(node.awaitKeyword, node.expression, node.semicolon);
+  AwaitExpression visitAwaitExpression(AwaitExpression node) => new AwaitExpression(node.awaitKeyword, node.expression);
 
   @override
   BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(cloneNode(node.leftOperand), node.operator, cloneNode(node.rightOperand));
@@ -1404,7 +1404,7 @@
   @override
   bool visitAwaitExpression(AwaitExpression node) {
     AwaitExpression other = this._other as AwaitExpression;
-    return _isEqualTokens(node.awaitKeyword, other.awaitKeyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+    return _isEqualTokens(node.awaitKeyword, other.awaitKeyword) && _isEqualNodes(node.expression, other.expression);
   }
 
   @override
@@ -2556,18 +2556,12 @@
   Expression _expression;
 
   /**
-   * The semicolon following the expression.
-   */
-  Token semicolon;
-
-  /**
    * Initialize a newly created await expression.
    *
    * @param awaitKeyword the 'await' keyword
    * @param expression the expression whose value is being waited on
-   * @param semicolon the semicolon following the expression
    */
-  AwaitExpression(this.awaitKeyword, Expression expression, this.semicolon) {
+  AwaitExpression(this.awaitKeyword, Expression expression) {
     this._expression = becomeParentOf(expression);
   }
 
@@ -2583,12 +2577,7 @@
   }
 
   @override
-  Token get endToken {
-    if (semicolon != null) {
-      return semicolon;
-    }
-    return _expression.endToken;
-  }
+  Token get endToken => _expression.endToken;
 
   /**
    * Return the expression whose value is being waited on.
@@ -9154,7 +9143,7 @@
   }
 
   @override
-  AwaitExpression visitAwaitExpression(AwaitExpression node) => new AwaitExpression(_mapToken(node.awaitKeyword), _cloneNode(node.expression), _mapToken(node.semicolon));
+  AwaitExpression visitAwaitExpression(AwaitExpression node) => new AwaitExpression(_mapToken(node.awaitKeyword), _cloneNode(node.expression));
 
   @override
   BinaryExpression visitBinaryExpression(BinaryExpression node) {
@@ -17130,7 +17119,6 @@
   @override
   Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     _visitNode(node.functionDeclaration);
-    _writer.print(';');
     return null;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 63d844d..0ea30f8 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1009,6 +1009,13 @@
   bool get isAbstract;
 
   /**
+   * Return `true` if this class is defined by an enum declaration.
+   *
+   * @return `true` if this class is defined by an enum declaration
+   */
+  bool get isEnum;
+
+  /**
    * Return `true` if this class [isProxy], or if it inherits the proxy annotation
    * from a supertype.
    *
@@ -1475,6 +1482,9 @@
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
   @override
+  bool get isEnum => hasModifier(Modifier.ENUM);
+
+  @override
   bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
 
   @override
@@ -1551,6 +1561,15 @@
   }
 
   /**
+   * Set whether this class is defined by an enum declaration to correspond to the given value.
+   *
+   * @param isEnum `true` if the class is defined by an enum declaration
+   */
+  void set enum2(bool isEnum) {
+    setModifier(Modifier.ENUM, isEnum);
+  }
+
+  /**
    * Set the fields contained in this class to the given fields.
    *
    * @param fields the fields contained in this class
@@ -4098,6 +4117,20 @@
   FunctionType get type;
 
   /**
+   * Return `true` if this executable element has body marked as being asynchronous.
+   *
+   * @return `true` if this executable element has body marked as being asynchronous
+   */
+  bool get isAsynchronous;
+
+  /**
+   * Return `true` if this executable element has a body marked as being a generator.
+   *
+   * @return `true` if this executable element has a body marked as being a generator
+   */
+  bool get isGenerator;
+
+  /**
    * Return `true` if this executable element is an operator. The test may be based on the
    * name of the executable element, in which case the result will be correct when the name is
    * legal.
@@ -4113,6 +4146,13 @@
    * @return `true` if this executable element is a static element
    */
   bool get isStatic;
+
+  /**
+   * Return `true` if this executable element has a body marked as being synchronous.
+   *
+   * @return `true` if this executable element has a body marked as being synchronous
+   */
+  bool get isSynchronous;
 }
 
 /**
@@ -4209,8 +4249,26 @@
   List<ParameterElement> get parameters => _parameters;
 
   @override
+  bool get isAsynchronous => hasModifier(Modifier.ASYNCHRONOUS);
+
+  @override
+  bool get isGenerator => hasModifier(Modifier.GENERATOR);
+
+  @override
   bool get isOperator => false;
 
+  @override
+  bool get isSynchronous => !hasModifier(Modifier.ASYNCHRONOUS);
+
+  /**
+   * Set whether this method's body is asynchronous to correspond to the given value.
+   *
+   * @param isAsynchronous `true` if the method's body is asynchronous
+   */
+  void set asynchronous(bool isAsynchronous) {
+    setModifier(Modifier.ASYNCHRONOUS, isAsynchronous);
+  }
+
   /**
    * Set the functions defined within this executable element to the given functions.
    *
@@ -4224,6 +4282,15 @@
   }
 
   /**
+   * Set whether this method's body is a generator to correspond to the given value.
+   *
+   * @param isGenerator `true` if the method's body is a generator
+   */
+  void set generator(bool isGenerator) {
+    setModifier(Modifier.GENERATOR, isGenerator);
+  }
+
+  /**
    * Set the labels defined within this executable element to the given labels.
    *
    * @param labels the labels defined within this executable element
@@ -4368,12 +4435,21 @@
   FunctionType get type => substituteFor(baseElement.type);
 
   @override
+  bool get isAsynchronous => baseElement.isAsynchronous;
+
+  @override
+  bool get isGenerator => baseElement.isGenerator;
+
+  @override
   bool get isOperator => baseElement.isOperator;
 
   @override
   bool get isStatic => baseElement.isStatic;
 
   @override
+  bool get isSynchronous => baseElement.isSynchronous;
+
+  @override
   void visitChildren(ElementVisitor visitor) {
     // TODO(brianwilkerson) We need to finish implementing the accessors used below so that we can
     // safely invoke them.
@@ -5428,6 +5504,8 @@
       return false;
     } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunction || type.isObject) {
       return true;
+    } else if (type is UnionType) {
+      return (type as UnionTypeImpl).internalUnionTypeIsMoreSpecificThan(this, withDynamic, visitedTypePairs);
     } else if (type is! FunctionType) {
       return false;
     } else if (this == type) {
@@ -5654,6 +5732,8 @@
       return false;
     } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunction || type.isObject) {
       return true;
+    } else if (type is UnionType) {
+      return (type as UnionTypeImpl).internalUnionTypeIsSuperTypeOf(this, visitedTypePairs);
     } else if (type is! FunctionType) {
       return false;
     } else if (this == type) {
@@ -7197,6 +7277,8 @@
     //
     if (identical(type, DynamicTypeImpl.instance)) {
       return true;
+    } else if (type is UnionType) {
+      return (type as UnionTypeImpl).internalUnionTypeIsMoreSpecificThan(this, withDynamic, visitedTypePairs);
     } else if (type is! InterfaceType) {
       return false;
     }
@@ -7212,6 +7294,8 @@
       return true;
     } else if (type is TypeParameterType) {
       return false;
+    } else if (type is UnionType) {
+      return (type as UnionTypeImpl).internalUnionTypeIsSuperTypeOf(this, visitedTypePairs);
     } else if (type is FunctionType) {
       // This implementation assumes transitivity
       // for function type subtyping on the RHS, but a literal reading
@@ -8621,75 +8705,103 @@
   static const Modifier ABSTRACT = const Modifier('ABSTRACT', 0);
 
   /**
+   * Indicates that an executable element has a body marked as being asynchronous.
+   */
+  static const Modifier ASYNCHRONOUS = const Modifier('ASYNCHRONOUS', 1);
+
+  /**
    * Indicates that the modifier 'const' was applied to the element.
    */
-  static const Modifier CONST = const Modifier('CONST', 1);
+  static const Modifier CONST = const Modifier('CONST', 2);
 
   /**
    * Indicates that the import element represents a deferred library.
    */
-  static const Modifier DEFERRED = const Modifier('DEFERRED', 2);
+  static const Modifier DEFERRED = const Modifier('DEFERRED', 3);
+
+  /**
+   * Indicates that a class element was defined by an enum declaration.
+   */
+  static const Modifier ENUM = const Modifier('ENUM', 4);
 
   /**
    * Indicates that the modifier 'factory' was applied to the element.
    */
-  static const Modifier FACTORY = const Modifier('FACTORY', 3);
+  static const Modifier FACTORY = const Modifier('FACTORY', 5);
 
   /**
    * Indicates that the modifier 'final' was applied to the element.
    */
-  static const Modifier FINAL = const Modifier('FINAL', 4);
+  static const Modifier FINAL = const Modifier('FINAL', 6);
+
+  /**
+   * Indicates that an executable element has a body marked as being a generator.
+   */
+  static const Modifier GENERATOR = const Modifier('GENERATOR', 7);
 
   /**
    * Indicates that the pseudo-modifier 'get' was applied to the element.
    */
-  static const Modifier GETTER = const Modifier('GETTER', 5);
+  static const Modifier GETTER = const Modifier('GETTER', 8);
 
   /**
    * A flag used for libraries indicating that the defining compilation unit contains at least one
    * import directive whose URI uses the "dart-ext" scheme.
    */
-  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 6);
+  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 9);
 
-  static const Modifier MIXIN = const Modifier('MIXIN', 7);
+  /**
+   * Indicates that a class can validly be used as a mixin.
+   */
+  static const Modifier MIXIN = const Modifier('MIXIN', 10);
 
   /**
    * 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);
+  static const Modifier POTENTIALLY_MUTATED_IN_CONTEXT = const Modifier('POTENTIALLY_MUTATED_IN_CONTEXT', 11);
 
   /**
    * 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 POTENTIALLY_MUTATED_IN_SCOPE = const Modifier('POTENTIALLY_MUTATED_IN_SCOPE', 12);
 
-  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 10);
+  /**
+   * Indicates that a class contains an explicit reference to 'super'.
+   */
+  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 13);
 
   /**
    * Indicates that the pseudo-modifier 'set' was applied to the element.
    */
-  static const Modifier SETTER = const Modifier('SETTER', 11);
+  static const Modifier SETTER = const Modifier('SETTER', 14);
 
   /**
    * Indicates that the modifier 'static' was applied to the element.
    */
-  static const Modifier STATIC = const Modifier('STATIC', 12);
+  static const Modifier STATIC = const Modifier('STATIC', 15);
 
   /**
    * 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', 13);
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 16);
 
-  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 14);
+  /**
+   * Indicates that a class was defined using an alias. TODO(brianwilkerson) This should be renamed
+   * to 'ALIAS'.
+   */
+  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 17);
 
   static const List<Modifier> values = const [
       ABSTRACT,
+      ASYNCHRONOUS,
       CONST,
       DEFERRED,
+      ENUM,
       FACTORY,
       FINAL,
+      GENERATOR,
       GETTER,
       HAS_EXT_URI,
       MIXIN,
@@ -9750,6 +9862,7 @@
    */
   PropertyAccessorElementImpl.forVariable(PropertyInducingElementImpl variable) : super(variable.name, variable.nameOffset) {
     this.variable = variable;
+    static = variable.isStatic;
     synthetic = true;
   }
 
@@ -11000,6 +11113,203 @@
 }
 
 /**
+ * A flat immutable union of `Type`s. Here "flat" means a union type never contains another
+ * union type.
+ */
+abstract class UnionType implements DartType {
+  /**
+   * @return an immutable view of the types in this union type.
+   */
+  Set<DartType> get elements;
+}
+
+/**
+ * In addition to the methods of the `UnionType` interface we add a factory method
+ * `union` for building unions.
+ */
+class UnionTypeImpl extends TypeImpl implements UnionType {
+  /**
+   * Any unions in the `types` will be flattened in the returned union. If there is only one
+   * type after flattening then it will be returned directly, instead of a singleton union.
+   *
+   * @param types the `Type`s to union
+   * @return a `Type` comprising the `Type`s in `types`
+   */
+  static DartType union(List<DartType> types) {
+    Set<DartType> set = new HashSet<DartType>();
+    for (DartType t in types) {
+      if (t is UnionType) {
+        set.addAll(t.elements);
+      } else {
+        set.add(t);
+      }
+    }
+    if (set.length == 0) {
+      throw new IllegalArgumentException("No known use case for empty unions.");
+    } else if (set.length == 1) {
+      return new JavaIterator(set).next();
+    } else {
+      return new UnionTypeImpl(set);
+    }
+  }
+
+  /**
+   * The types in this union.
+   */
+  final Set<DartType> _types;
+
+  /**
+   * This constructor should only be called by the `union` factory: it does not check that its
+   * argument `types` contains no union types.
+   *
+   * @param types
+   */
+  UnionTypeImpl(this._types) : super(null, null);
+
+  @override
+  bool operator ==(Object other) {
+    if (other == null || other is! UnionType) {
+      return false;
+    } else if (identical(this, other)) {
+      return true;
+    } else {
+      return javaSetEquals(_types, (other as UnionType).elements);
+    }
+  }
+
+  @override
+  String get displayName {
+    JavaStringBuilder builder = new JavaStringBuilder();
+    String prefix = "{";
+    for (DartType t in _types) {
+      builder.append(prefix);
+      builder.append(t.displayName);
+      prefix = ",";
+    }
+    builder.append("}");
+    return builder.toString();
+  }
+
+  @override
+  Set<DartType> get elements => _types;
+
+  @override
+  int get hashCode => _types.hashCode;
+
+  @override
+  DartType substitute2(List<DartType> argumentTypes, List<DartType> parameterTypes) {
+    List<DartType> out = new List<DartType>();
+    for (DartType t in _types) {
+      out.add(t.substitute2(argumentTypes, parameterTypes));
+    }
+    return union(new List.from(out));
+  }
+
+  @override
+  void appendTo(JavaStringBuilder builder) {
+    String prefix = "{";
+    for (DartType t in _types) {
+      builder.append(prefix);
+      (t as TypeImpl).appendTo(builder);
+      prefix = ",";
+    }
+    builder.append("}");
+  }
+
+  @override
+  bool internalEquals(Object object, Set<ElementPair> visitedElementPairs) => this == object;
+
+  @override
+  bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+    // TODO(collinsn): what version of subtyping do we want?
+    //
+    // The more unsound version: any.
+    /*
+    for (Type t : types) {
+      if (((TypeImpl) t).internalIsMoreSpecificThan(type, withDynamic, visitedTypePairs)) {
+        return true;
+      }
+    }
+    return false;
+    */
+    // The less unsound version: all.
+    for (DartType t in _types) {
+      if (!(t as TypeImpl).internalIsMoreSpecificThan(type, withDynamic, visitedTypePairs)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
+    // TODO(collinsn): what version of subtyping do we want?
+    //
+    // The more unsound version: any.
+    /*
+    for (Type t : types) {
+      if (((TypeImpl) t).internalIsSubtypeOf(type, visitedTypePairs)) {
+        return true;
+      }
+    }
+    return false;
+    */
+    // The less unsound version: all.
+    for (DartType t in _types) {
+      if (!(t as TypeImpl).internalIsSubtypeOf(type, visitedTypePairs)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * The more-specific-than test for union types on the RHS is uniform in non-union LHSs. So, other
+   * `TypeImpl`s can call this method to implement `internalIsMoreSpecificThan` for
+   * union types.
+   *
+   * @param type
+   * @param visitedTypePairs
+   * @return true if `type` is more specific than this union type
+   */
+  bool internalUnionTypeIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+    // This implementation does not make sense when [type] is a union type, at least
+    // for the "less unsound" version of [internalIsMoreSpecificThan] above.
+    if (type is UnionType) {
+      throw new IllegalArgumentException("Only non-union types are supported.");
+    }
+    for (DartType t in _types) {
+      if ((type as TypeImpl).internalIsMoreSpecificThan(t, withDynamic, visitedTypePairs)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * The supertype test for union types is uniform in non-union subtypes. So, other `TypeImpl`
+   * s can call this method to implement `internalIsSubtypeOf` for union types.
+   *
+   * @param type
+   * @param visitedTypePairs
+   * @return true if this union type is a super type of `type`
+   */
+  bool internalUnionTypeIsSuperTypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
+    // This implementation does not make sense when [type] is a union type, at least
+    // for the "less unsound" version of [internalIsSubtypeOf] above.
+    if (type is UnionType) {
+      throw new IllegalArgumentException("Only non-union types are supported.");
+    }
+    for (DartType t in _types) {
+      if ((type as TypeImpl).internalIsSubtypeOf(t, visitedTypePairs)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
  * The interface `UriReferencedElement` defines the behavior of objects included into a
  * library using some URI.
  */
@@ -11334,5 +11644,14 @@
   bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) => isSubtypeOf(type);
 
   @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => identical(type, this) || identical(type, DynamicTypeImpl.instance);
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
+    if (type is UnionType) {
+      return (type as UnionTypeImpl).internalUnionTypeIsSuperTypeOf(this, visitedTypePairs);
+    }
+    // The only subtype relations that pertain to void are therefore:
+    // void <: void (by reflexivity)
+    // bottom <: void (as bottom is a subtype of all types).
+    // void <: dynamic (as dynamic is a supertype of all types)
+    return identical(type, this) || identical(type, DynamicTypeImpl.instance);
+  }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 6bcd4d4..6addb24 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -96,6 +96,9 @@
   bool get isAbstract => actualElement.isAbstract;
 
   @override
+  bool get isEnum => actualElement.isEnum;
+
+  @override
   bool get isOrInheritsProxy => actualElement.isOrInheritsProxy;
 
   @override
@@ -464,12 +467,21 @@
   FunctionType get type => actualElement.type;
 
   @override
+  bool get isAsynchronous => actualElement.isAsynchronous;
+
+  @override
+  bool get isGenerator => actualElement.isGenerator;
+
+  @override
   bool get isOperator => actualElement.isOperator;
 
   @override
   bool get isStatic => actualElement.isStatic;
 
   @override
+  bool get isSynchronous => actualElement.isSynchronous;
+
+  @override
   ExecutableElement get actualElement => super.actualElement as ExecutableElement;
 }
 
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index f3095a3..79ccb0c 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -251,6 +251,14 @@
  */
 abstract class AnalysisContext {
   /**
+   * Add the given listener to the list of objects that are to be notified when various analysis
+   * results are produced in this context.
+   *
+   * @param listener the listener to be added
+   */
+  void addListener(AnalysisListener listener);
+
+  /**
    * Apply the given delta to change the level of analysis that will be performed for the sources
    * known to this context.
    *
@@ -726,6 +734,14 @@
   AnalysisResult performAnalysisTask();
 
   /**
+   * Remove the given listener from the list of objects that are to be notified when various
+   * analysis results are produced in this context.
+   *
+   * @param listener the listener to be removed
+   */
+  void removeListener(AnalysisListener listener);
+
+  /**
    * Parse and resolve a single source within the given context to produce a fully resolved AST.
    *
    * <b>Note:</b> This method cannot be used in an async environment.
@@ -941,6 +957,12 @@
   Set<AngularApplication> _angularApplications = new Set();
 
   /**
+   * The listeners that are to be notified when various analysis results are produced in this
+   * context.
+   */
+  List<AnalysisListener> _listeners = new List<AnalysisListener>();
+
+  /**
    * Initialize a newly created analysis context.
    */
   AnalysisContextImpl() : super() {
@@ -950,6 +972,13 @@
   }
 
   @override
+  void addListener(AnalysisListener listener) {
+    if (!_listeners.contains(listener)) {
+      _listeners.add(listener);
+    }
+  }
+
+  @override
   void addSourceInfo(Source source, SourceEntry info) {
     // This implementation assumes that the access to the cache does not need to be synchronized
     // because no other object can have access to this context while this method is being invoked.
@@ -1701,30 +1730,46 @@
     if (task == null) {
       return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null, -1);
     }
-    String taskDescriptor = task.toString();
-    //    if (recentTasks.add(taskDescriptor)) {
-    //      logInformation("Performing task: " + taskDescriptor);
+    String taskDescription = task.toString();
+    //    if (recentTasks.add(taskDescription)) {
+    //      logInformation("Performing task: " + taskDescription);
     //    } else {
     //      if (TRACE_PERFORM_TASK) {
     //        System.out.print("* ");
     //      }
-    //      logInformation("*** Performing repeated task: " + taskDescriptor);
+    //      logInformation("*** Performing repeated task: " + taskDescription);
     //    }
+    _notifyAboutToPerformTask(taskDescription);
     if (_TRACE_PERFORM_TASK) {
-      print(taskDescriptor);
+      print(taskDescription);
     }
     int performStart = JavaSystem.currentTimeMillis();
     try {
       task.perform(_resultRecorder);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescriptor}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescription}", exception);
     } on AnalysisException catch (exception) {
       if (exception.cause is! JavaIOException) {
         AnalysisEngine.instance.logger.logError2("Internal error while performing the task: ${task}", exception);
       }
     }
     int performEnd = JavaSystem.currentTimeMillis();
-    return new AnalysisResult(_getChangeNotices(false), getEnd - getStart, task.runtimeType.toString(), performEnd - performStart);
+    List<ChangeNotice> notices = _getChangeNotices(false);
+    int noticeCount = notices.length;
+    for (int i = 0; i < noticeCount; i++) {
+      ChangeNotice notice = notices[i];
+      Source source = notice.source;
+      // TODO(brianwilkerson) Figure out whether the compilation unit is always resolved, or whether
+      // we need to decide whether to invoke the "parsed" or "resolved" method. This might be better
+      // done when recording task results in order to reduce the chance of errors.
+      //      if (notice.getCompilationUnit() != null) {
+      //        notifyResolvedDart(source, notice.getCompilationUnit());
+      //      } else if (notice.getHtmlUnit() != null) {
+      //        notifyResolvedHtml(source, notice.getHtmlUnit());
+      //      }
+      _notifyErrors(source, notice.errors, notice.lineInfo);
+    }
+    return new AnalysisResult(notices, getEnd - getStart, task.runtimeType.toString(), performEnd - performStart);
   }
 
   @override
@@ -1743,7 +1788,6 @@
         dartCopy.setValue(DartEntry.SCAN_ERRORS, AnalysisError.NO_ERRORS);
         dartCopy.setValue(DartEntry.PARSE_ERRORS, AnalysisError.NO_ERRORS);
         dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
-        dartCopy.setValueInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, librarySource, AnalysisError.NO_ERRORS);
         dartCopy.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource, AnalysisError.NO_ERRORS);
         dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED);
         dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, AnalysisError.NO_ERRORS);
@@ -1755,6 +1799,11 @@
   }
 
   @override
+  void removeListener(AnalysisListener listener) {
+    _listeners.remove(listener);
+  }
+
+  @override
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     if (library == null) {
       return null;
@@ -2594,35 +2643,6 @@
   }
 
   /**
-   * Create a [BuildDartElementModelTask] for the given source, marking the built unit as
-   * being in-process.
-   *
-   * @param source the source for the library whose element model is to be built
-   * @param dartEntry the entry for the source
-   * @return task data representing the created task
-   */
-  AnalysisContextImpl_TaskData _createBuildDartElementModelTask(Source source, DartEntry dartEntry) {
-    try {
-      AnalysisContextImpl_CycleBuilder builder = new AnalysisContextImpl_CycleBuilder(this);
-      builder.computeCycleContaining(source);
-      AnalysisContextImpl_TaskData taskData = builder.taskData;
-      if (taskData != null) {
-        return taskData;
-      }
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      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, stackTrace) {
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      dartCopy.recordBuildElementErrorInLibrary(source, new CaughtException(exception, stackTrace));
-      _cache.put(source, dartCopy);
-      AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", new CaughtException(exception, stackTrace));
-    }
-    return new AnalysisContextImpl_TaskData(null, false);
-  }
-
-  /**
    * Create a [GenerateDartErrorsTask] for the given source, marking the verification errors
    * as being in-process. The compilation unit and the library can be the same if the compilation
    * unit is the defining compilation unit of the library.
@@ -3862,6 +3882,111 @@
   }
 
   /**
+   * Notify all of the analysis listeners that a task is about to be performed.
+   *
+   * @param taskDescription a human readable description of the task that is about to be performed
+   */
+  void _notifyAboutToPerformTask(String taskDescription) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].aboutToPerformTask(this, taskDescription);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the errors associated with the given source has been
+   * updated to the given errors.
+   *
+   * @param source the source containing the errors that were computed
+   * @param errors the errors that were computed
+   * @param lineInfo the line information associated with the source
+   */
+  void _notifyErrors(Source source, List<AnalysisError> errors, LineInfo lineInfo) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].computedErrors(this, source, errors, lineInfo);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given source is no longer included in the set of
+   * sources that are being analyzed.
+   *
+   * @param source the source that is no longer being analyzed
+   */
+  void _notifyExcludedSource(Source source) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].excludedSource(this, source);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given source is now included in the set of
+   * sources that are being analyzed.
+   *
+   * @param source the source that is now being analyzed
+   */
+  void _notifyIncludedSource(Source source) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].includedSource(this, source);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given Dart source was parsed.
+   *
+   * @param source the source that was parsed
+   * @param unit the result of parsing the source
+   */
+  void _notifyParsedDart(Source source, CompilationUnit unit) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].parsedDart(this, source, unit);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given HTML source was parsed.
+   *
+   * @param source the source that was parsed
+   * @param unit the result of parsing the source
+   */
+  void _notifyParsedHtml(Source source, ht.HtmlUnit unit) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].parsedHtml(this, source, unit);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given Dart source was resolved.
+   *
+   * @param source the source that was resolved
+   * @param unit the result of resolving the source
+   */
+  void _notifyResolvedDart(Source source, CompilationUnit unit) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].resolvedDart(this, source, unit);
+    }
+  }
+
+  /**
+   * Notify all of the analysis listeners that the given HTML source was resolved.
+   *
+   * @param source the source that was resolved
+   * @param unit the result of resolving the source
+   */
+  void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) {
+    int count = _listeners.length;
+    for (int i = 0; i < count; i++) {
+      _listeners[i].resolvedHtml(this, source, unit);
+    }
+  }
+
+  /**
    * Updates [HtmlEntry]s that correspond to the previously known and new Angular application
    * information.
    */
@@ -3908,103 +4033,6 @@
   }
 
   /**
-   * Record the results produced by performing a [BuildDartElementModelTask]. If the results
-   * were computed from data that is now out-of-date, then the results will not be recorded.
-   *
-   * @param task the task that was performed
-   * @return an entry containing the recorded results
-   * @throws AnalysisException if the results could not be recorded
-   */
-  DartEntry _recordBuildDartElementModelTask(BuildDartElementModelTask task) {
-    Source targetLibrary = task.targetLibrary;
-    List<ResolvableLibrary> builtLibraries = task.librariesInCycle;
-    CaughtException thrownException = task.exception;
-    DartEntry targetEntry = null;
-    if (_allModificationTimesMatch(builtLibraries)) {
-      Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
-      RecordingErrorListener errorListener = task.errorListener;
-      for (ResolvableLibrary library in builtLibraries) {
-        Source librarySource = library.librarySource;
-        for (Source source in library.compilationUnitSources) {
-          CompilationUnit unit = library.getAST(source);
-          List<AnalysisError> errors = errorListener.getErrorsForSource(source);
-          LineInfo lineInfo = getLineInfo(source);
-          DartEntryImpl dartCopy = _cache.get(source).writableCopy as DartEntryImpl;
-          if (thrownException == null) {
-            dartCopy.setValueInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, librarySource, errors);
-            dartCopy.setValueInLibrary(DartEntry.BUILT_UNIT, librarySource, unit);
-            if (source == librarySource) {
-              LibraryElementImpl libraryElement = library.libraryElement;
-              dartCopy.setValue(DartEntry.ELEMENT, libraryElement);
-              dartCopy.setValue(DartEntry.IS_LAUNCHABLE, libraryElement.entryPoint != null);
-              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new HashSet<LibraryElement>()));
-            }
-          } else {
-            dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
-            _cache.remove(source);
-          }
-          _cache.put(source, dartCopy);
-          if (source != librarySource) {
-            _workManager.add(librarySource, SourcePriority.PRIORITY_PART);
-          }
-          if (source == targetLibrary) {
-            targetEntry = dartCopy;
-          }
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.compilationUnit = unit;
-          notice.setErrors(dartCopy.allErrors, lineInfo);
-        }
-      }
-    } else {
-      PrintStringWriter writer = new PrintStringWriter();
-      writer.println("Build element model results discarded for");
-      for (ResolvableLibrary library in builtLibraries) {
-        Source librarySource = library.librarySource;
-        for (Source source in library.compilationUnitSources) {
-          DartEntry dartEntry = _getReadableDartEntry(source);
-          if (dartEntry != null) {
-            int resultTime = library.getModificationTime(source);
-            writer.println("  ${_debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}");
-            DartEntryImpl dartCopy = dartEntry.writableCopy;
-            if (thrownException == null || resultTime >= 0) {
-              //
-              // The analysis was performed on out-of-date sources. Mark the cache so that the
-              // sources will be re-analyzed using the up-to-date sources.
-              //
-              dartCopy.recordBuildElementNotInProcess();
-            } else {
-              //
-              // We could not determine whether the sources were up-to-date or out-of-date. Mark
-              // the cache so that we won't attempt to re-analyze the sources until there's a
-              // good chance that we'll be able to do so without error.
-              //
-              dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
-              _cache.remove(source);
-            }
-            _cache.put(source, dartCopy);
-            if (source == targetLibrary) {
-              targetEntry = dartCopy;
-            }
-          } else {
-            writer.println("  ${_debuggingString(source)}; sourceTime = ${getModificationStamp(source)}, no entry");
-          }
-        }
-      }
-      _logInformation(writer.toString());
-    }
-    if (thrownException != null) {
-      throw new AnalysisException('<rethrow>', thrownException);
-    }
-    if (targetEntry == null) {
-      targetEntry = _getReadableDartEntry(targetLibrary);
-      if (targetEntry == null) {
-        throw new AnalysisException("A Dart file became a non-Dart file: ${targetLibrary.fullName}");
-      }
-    }
-    return targetEntry;
-  }
-
-  /**
    * Given a cache entry and a library element, record the library element and other information
    * gleaned from the element in the cache entry.
    *
@@ -5240,9 +5268,6 @@
   AnalysisContextImpl_AnalysisTaskResultRecorder(this.AnalysisContextImpl_this);
 
   @override
-  DartEntry visitBuildDartElementModelTask(BuildDartElementModelTask task) => AnalysisContextImpl_this._recordBuildDartElementModelTask(task);
-
-  @override
   DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => AnalysisContextImpl_this._recordGenerateDartErrorsTask(task);
 
   @override
@@ -5712,7 +5737,12 @@
     if (libraryEntry == null) {
       throw new AnalysisException("Cannot find entry for ${librarySource.fullName}");
     } else if (libraryEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) {
-      throw new AnalysisException("Cannot compute parsed unit for ${librarySource.fullName}");
+      String message = "Cannot compute parsed unit for ${librarySource.fullName}";
+      CaughtException exception = libraryEntry.exception;
+      if (exception == null) {
+        throw new AnalysisException(message);
+      }
+      throw new AnalysisException(message, new CaughtException(exception, null));
     }
     _ensureResolvableCompilationUnit(librarySource, libraryEntry);
     pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
@@ -6296,6 +6326,85 @@
 }
 
 /**
+ * The interface `AnalysisListener` defines the behavior of objects that are listening for
+ * results being produced by an analysis context.
+ */
+abstract class AnalysisListener {
+  /**
+   * Reports that a task is about to be performed by the given context.
+   *
+   * @param context the context in which the task is to be performed
+   * @param taskDescription a human readable description of the task that is about to be performed
+   */
+  void aboutToPerformTask(AnalysisContext context, String taskDescription);
+
+  /**
+   * Reports that the errors associated with the given source in the given context has been updated
+   * to the given errors.
+   *
+   * @param context the context in which the new list of errors was produced
+   * @param source the source containing the errors that were computed
+   * @param errors the errors that were computed
+   * @param lineInfo the line information associated with the source
+   */
+  void computedErrors(AnalysisContext context, Source source, List<AnalysisError> errors, LineInfo lineInfo);
+
+  /**
+   * Reports that the given source is no longer included in the set of sources that are being
+   * analyzed by the given analysis context.
+   *
+   * @param context the context in which the source is being analyzed
+   * @param source the source that is no longer being analyzed
+   */
+  void excludedSource(AnalysisContext context, Source source);
+
+  /**
+   * Reports that the given source is now included in the set of sources that are being analyzed by
+   * the given analysis context.
+   *
+   * @param context the context in which the source is being analyzed
+   * @param source the source that is now being analyzed
+   */
+  void includedSource(AnalysisContext context, Source source);
+
+  /**
+   * Reports that the given Dart source was parsed in the given context.
+   *
+   * @param context the context in which the source was parsed
+   * @param source the source that was parsed
+   * @param unit the result of parsing the source in the given context
+   */
+  void parsedDart(AnalysisContext context, Source source, CompilationUnit unit);
+
+  /**
+   * Reports that the given HTML source was parsed in the given context.
+   *
+   * @param context the context in which the source was parsed
+   * @param source the source that was parsed
+   * @param unit the result of parsing the source in the given context
+   */
+  void parsedHtml(AnalysisContext context, Source source, ht.HtmlUnit unit);
+
+  /**
+   * Reports that the given Dart source was resolved in the given context.
+   *
+   * @param context the context in which the source was resolved
+   * @param source the source that was resolved
+   * @param unit the result of resolving the source in the given context
+   */
+  void resolvedDart(AnalysisContext context, Source source, CompilationUnit unit);
+
+  /**
+   * Reports that the given HTML source was resolved in the given context.
+   *
+   * @param context the context in which the source was resolved
+   * @param source the source that was resolved
+   * @param unit the result of resolving the source in the given context
+   */
+  void resolvedHtml(AnalysisContext context, Source source, ht.HtmlUnit unit);
+}
+
+/**
  * The interface `AnalysisOptions` defines the behavior of objects that provide access to a
  * set of analysis options used to control the behavior of an analysis context.
  */
@@ -6664,15 +6773,6 @@
  */
 abstract class AnalysisTaskVisitor<E> {
   /**
-   * Visit a [BuildDartElementModelTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitBuildDartElementModelTask(BuildDartElementModelTask task);
-
-  /**
    * Visit a [GenerateDartErrorsTask].
    *
    * @param task the task to be visited
@@ -7727,322 +7827,6 @@
 }
 
 /**
- * Instances of the class `BuildDartElementModelTask` build the element models for all of the
- * libraries in a cycle.
- */
-class BuildDartElementModelTask extends AnalysisTask {
-  /**
-   * The library for which an element model was originally requested.
-   */
-  final Source targetLibrary;
-
-  /**
-   * The libraries that are part of the cycle to be resolved.
-   */
-  final List<ResolvableLibrary> librariesInCycle;
-
-  /**
-   * The listener to which analysis errors will be reported.
-   */
-  RecordingErrorListener _errorListener;
-
-  /**
-   * A source object representing the core library (dart:core).
-   */
-  Source _coreLibrarySource;
-
-  /**
-   * The object representing the core library.
-   */
-  ResolvableLibrary _coreLibrary;
-
-  /**
-   * A table mapping library sources to the information being maintained for those libraries.
-   */
-  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param targetLibrary the library for which an element model was originally requested
-   * @param librariesInCycle the libraries that are part of the cycle to be resolved
-   */
-  BuildDartElementModelTask(InternalAnalysisContext context, this.targetLibrary, this.librariesInCycle) : super(context) {
-    this._errorListener = new RecordingErrorListener();
-    _coreLibrarySource = context.sourceFactory.forUri(DartSdk.DART_CORE);
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitBuildDartElementModelTask(this);
-
-  /**
-   * Return the listener to which analysis errors were (or will be) reported.
-   *
-   * @return the listener to which analysis errors were reported
-   */
-  RecordingErrorListener get errorListener => _errorListener;
-
-  @override
-  String get taskDescription {
-    Source librarySource = librariesInCycle[0].librarySource;
-    if (librarySource == null) {
-      return "build an element model for unknown library";
-    }
-    return "build an element model for ${librarySource.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.BuildDartElementModel.internalPerform");
-    try {
-      //
-      // Build the map of libraries that are known.
-      //
-      _libraryMap = _buildLibraryMap();
-      _coreLibrary = _libraryMap[_coreLibrarySource];
-      LibraryElement coreElement = _coreLibrary.libraryElement;
-      if (coreElement == null) {
-        throw new AnalysisException("Could not resolve dart:core");
-      }
-      instrumentation.metric3("buildLibraryMap", "complete");
-      //
-      // Build the element models representing the libraries being resolved. This is done in three
-      // steps.
-      //
-      // 1. Build the basic element models without making any connections between elements other than
-      //    the basic parent/child relationships. This includes building the elements representing the
-      //    libraries.
-      //
-      _buildElementModels();
-      instrumentation.metric3("buildElementModels", "complete");
-      //
-      // 2. Build the elements for the import and export directives. This requires that we have the
-      //    elements built for the referenced libraries, but because of the possibility of circular
-      //    references needs to happen after all of the library elements have been created.
-      //
-      _buildDirectiveModels();
-      instrumentation.metric3("buildDirectiveModels", "complete");
-      //
-      // 3. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
-      //    requires that we be able to compute the names visible in the libraries being resolved,
-      //    which in turn requires that we have resolved the import directives.
-      //
-      _buildTypeHierarchies(new TypeProviderImpl(coreElement));
-      instrumentation.metric3("buildTypeHierarchies", "complete");
-      instrumentation.metric2("librariesInCycles", librariesInCycle.length);
-      for (ResolvableLibrary lib in librariesInCycle) {
-        instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size", lib.compilationUnitSources.length);
-      }
-    } finally {
-      instrumentation.log();
-    }
-  }
-
-  /**
-   * Build the element model representing the combinators declared by the given directive.
-   *
-   * @param directive the directive that declares the combinators
-   * @return an array containing the import combinators that were built
-   */
-  List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
-    List<NamespaceCombinator> combinators = new List<NamespaceCombinator>();
-    for (Combinator combinator in directive.combinators) {
-      if (combinator is HideCombinator) {
-        HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
-        hide.hiddenNames = _getIdentifiers(combinator.hiddenNames);
-        combinators.add(hide);
-      } else {
-        ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
-        show.offset = combinator.offset;
-        show.end = combinator.end;
-        show.shownNames = _getIdentifiers((combinator as ShowCombinator).shownNames);
-        combinators.add(show);
-      }
-    }
-    return new List.from(combinators);
-  }
-
-  /**
-   * Every library now has a corresponding [LibraryElement], so it is now possible to resolve
-   * the import and export directives.
-   *
-   * @throws AnalysisException if the defining compilation unit for any of the libraries could not
-   *           be accessed
-   */
-  void _buildDirectiveModels() {
-    AnalysisContext analysisContext = context;
-    for (ResolvableLibrary library in librariesInCycle) {
-      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
-      List<ImportElement> imports = new List<ImportElement>();
-      List<ExportElement> exports = new List<ExportElement>();
-      for (Directive directive in library.definingCompilationUnit.directives) {
-        if (directive is ImportDirective) {
-          ImportDirective importDirective = directive;
-          String uriContent = importDirective.uriContent;
-          if (DartUriResolver.isDartExtUri(uriContent)) {
-            library.libraryElement.hasExtUri = true;
-          }
-          Source importedSource = importDirective.source;
-          if (importedSource != null && analysisContext.exists(importedSource)) {
-            // The imported source will be null if the URI in the import directive was invalid.
-            ResolvableLibrary importedLibrary = _libraryMap[importedSource];
-            if (importedLibrary != null) {
-              ImportElementImpl importElement = new ImportElementImpl(directive.offset);
-              StringLiteral uriLiteral = importDirective.uri;
-              if (uriLiteral != null) {
-                importElement.uriOffset = uriLiteral.offset;
-                importElement.uriEnd = uriLiteral.end;
-              }
-              importElement.uri = uriContent;
-              importElement.combinators = _buildCombinators(importDirective);
-              LibraryElement importedLibraryElement = importedLibrary.libraryElement;
-              if (importedLibraryElement != null) {
-                importElement.importedLibrary = importedLibraryElement;
-              }
-              SimpleIdentifier prefixNode = directive.prefix;
-              if (prefixNode != null) {
-                importElement.prefixOffset = prefixNode.offset;
-                String prefixName = prefixNode.name;
-                PrefixElementImpl prefix = nameToPrefixMap[prefixName];
-                if (prefix == null) {
-                  prefix = new PrefixElementImpl.forNode(prefixNode);
-                  nameToPrefixMap[prefixName] = prefix;
-                }
-                importElement.prefix = prefix;
-                prefixNode.staticElement = prefix;
-              }
-              directive.element = importElement;
-              imports.add(importElement);
-              if (analysisContext.computeKindOf(importedSource) != SourceKind.LIBRARY) {
-                ErrorCode errorCode = (importElement.isDeferred ? StaticWarningCode.IMPORT_OF_NON_LIBRARY : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY);
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, errorCode, [uriLiteral.toSource()]));
-              }
-            }
-          }
-        } else if (directive is ExportDirective) {
-          ExportDirective exportDirective = directive;
-          Source exportedSource = exportDirective.source;
-          if (exportedSource != null && analysisContext.exists(exportedSource)) {
-            // The exported source will be null if the URI in the export directive was invalid.
-            ResolvableLibrary exportedLibrary = _libraryMap[exportedSource];
-            if (exportedLibrary != null) {
-              ExportElementImpl exportElement = new ExportElementImpl();
-              StringLiteral uriLiteral = exportDirective.uri;
-              if (uriLiteral != null) {
-                exportElement.uriOffset = uriLiteral.offset;
-                exportElement.uriEnd = uriLiteral.end;
-              }
-              exportElement.uri = exportDirective.uriContent;
-              exportElement.combinators = _buildCombinators(exportDirective);
-              LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
-              if (exportedLibraryElement != null) {
-                exportElement.exportedLibrary = exportedLibraryElement;
-              }
-              directive.element = exportElement;
-              exports.add(exportElement);
-              if (analysisContext.computeKindOf(exportedSource) != SourceKind.LIBRARY) {
-                _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
-              }
-            }
-          }
-        }
-      }
-      Source librarySource = library.librarySource;
-      if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource) {
-        ImportElementImpl importElement = new ImportElementImpl(-1);
-        importElement.importedLibrary = _coreLibrary.libraryElement;
-        importElement.synthetic = true;
-        imports.add(importElement);
-      }
-      LibraryElementImpl libraryElement = library.libraryElement;
-      libraryElement.imports = new List.from(imports);
-      libraryElement.exports = new List.from(exports);
-      if (libraryElement.entryPoint == null) {
-        Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
-        Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
-        if (element is FunctionElement) {
-          libraryElement.entryPoint = element;
-        }
-      }
-    }
-  }
-
-  /**
-   * Build element models for all of the libraries in the current cycle.
-   *
-   * @throws AnalysisException if any of the element models cannot be built
-   */
-  void _buildElementModels() {
-    for (ResolvableLibrary library in librariesInCycle) {
-      LibraryElementBuilder builder = new LibraryElementBuilder(context, _errorListener);
-      LibraryElementImpl libraryElement = builder.buildLibrary2(library);
-      library.libraryElement = libraryElement;
-    }
-  }
-
-  /**
-   * Build a table mapping library sources to the resolvable libraries representing those libraries.
-   *
-   * @return the map that was built
-   */
-  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
-    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
-    int libraryCount = librariesInCycle.length;
-    for (int i = 0; i < libraryCount; i++) {
-      ResolvableLibrary library = librariesInCycle[i];
-      library.errorListener = _errorListener;
-      libraryMap[library.librarySource] = library;
-      List<ResolvableLibrary> dependencies = library.importsAndExports;
-      int dependencyCount = dependencies.length;
-      for (int j = 0; j < dependencyCount; j++) {
-        ResolvableLibrary dependency = dependencies[j];
-        //dependency.setErrorListener(errorListener);
-        libraryMap[dependency.librarySource] = dependency;
-      }
-    }
-    return libraryMap;
-  }
-
-  /**
-   * Resolve the type hierarchy across all of the types declared in the libraries in the current
-   * cycle.
-   *
-   * @throws AnalysisException if any of the type hierarchies could not be resolved
-   */
-  void _buildTypeHierarchies(TypeProvider typeProvider) {
-    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
-    try {
-      for (ResolvableLibrary library in librariesInCycle) {
-        for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits) {
-          Source source = unit.source;
-          CompilationUnit ast = unit.compilationUnit;
-          TypeResolverVisitor visitor = new TypeResolverVisitor.con4(library, source, typeProvider);
-          ast.accept(visitor);
-        }
-      }
-    } finally {
-      timeCounter.stop();
-    }
-  }
-
-  /**
-   * Return an array containing the lexical identifiers associated with the nodes in the given list.
-   *
-   * @param names the AST nodes representing the identifiers
-   * @return the lexical identifiers associated with the nodes in the list
-   */
-  List<String> _getIdentifiers(NodeList<SimpleIdentifier> names) {
-    int count = names.length;
-    List<String> identifiers = new List<String>(count);
-    for (int i = 0; i < count; i++) {
-      identifiers[i] = names[i].name;
-    }
-    return identifiers;
-  }
-}
-
-/**
  * Instances of the class `CachePartition` implement a single partition in an LRU cache of
  * information related to analysis.
  */
@@ -8771,16 +8555,6 @@
   static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.ANGULAR_ERRORS");
 
   /**
-   * The data descriptor representing the errors reported while building an element model.
-   */
-  static final DataDescriptor<List<AnalysisError>> BUILD_ELEMENT_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.BUILD_ELEMENT_ERRORS");
-
-  /**
-   * The data descriptor representing the AST structure resulting from building the element model.
-   */
-  static final DataDescriptor<CompilationUnit> BUILT_UNIT = new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT");
-
-  /**
    * The data descriptor representing the list of libraries that contain this compilation unit.
    */
   static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
@@ -9273,11 +9047,7 @@
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       if (librarySource == state._librarySource) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrorsState;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnitState;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+        if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
           return state._resolutionErrorsState;
         } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
           return state._resolvedUnitState;
@@ -9292,7 +9062,7 @@
       state = state._nextState;
     }
     ;
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
       return CacheState.INVALID;
     } else {
       throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
@@ -9339,11 +9109,7 @@
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       if (librarySource == state._librarySource) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrors;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnit;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+        if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
           return state._resolutionErrors;
         } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
           return state._resolvedUnit;
@@ -9358,7 +9124,7 @@
       state = state._nextState;
     }
     ;
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
       return AnalysisError.NO_ERRORS;
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
       return null;
@@ -9400,14 +9166,10 @@
       return _sourceKindState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
       return _tokenStreamState == CacheState.INVALID;
-    } else if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS) || identical(descriptor, DartEntry.BUILT_UNIT) || identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
+    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
       DartEntryImpl_ResolutionState state = _resolutionState;
       while (state != null) {
-        if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-          return state._buildElementErrorsState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-          return state._builtUnitState == CacheState.INVALID;
-        } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+        if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
           return state._resolutionErrorsState == CacheState.INVALID;
         } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
           return state._resolvedUnitState == CacheState.INVALID;
@@ -9861,13 +9623,7 @@
    */
   void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) {
     DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-      state._buildElementErrors = updatedValue(cacheState, state._buildElementErrors, AnalysisError.NO_ERRORS);
-      state._buildElementErrorsState = cacheState;
-    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-      state._builtUnit = updatedValue(cacheState, state._builtUnit, null);
-      state._builtUnitState = cacheState;
-    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors, AnalysisError.NO_ERRORS);
       state._resolutionErrorsState = cacheState;
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
@@ -9941,13 +9697,7 @@
    */
   void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) {
     DartEntryImpl_ResolutionState state = _getOrCreateResolutionState(librarySource);
-    if (identical(descriptor, DartEntry.BUILD_ELEMENT_ERRORS)) {
-      state._buildElementErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-      state._buildElementErrorsState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.BUILT_UNIT)) {
-      state._builtUnit = value as CompilationUnit;
-      state._builtUnitState = CacheState.VALID;
-    } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
+    if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
       state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
       state._resolutionErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
@@ -10420,8 +10170,6 @@
    * @return `true` if some difference was written
    */
   bool writeDiffOn(JavaStringBuilder builder, bool needsSeparator, DartEntry oldEntry) {
-    needsSeparator = writeStateDiffOn(builder, needsSeparator, oldEntry, DartEntry.BUILT_UNIT, _builtUnitState, "builtUnit");
-    needsSeparator = writeStateDiffOn(builder, needsSeparator, oldEntry, DartEntry.BUILD_ELEMENT_ERRORS, _buildElementErrorsState, "buildElementErrors");
     needsSeparator = writeStateDiffOn(builder, needsSeparator, oldEntry, DartEntry.RESOLVED_UNIT, _resolvedUnitState, "resolvedUnit");
     needsSeparator = writeStateDiffOn(builder, needsSeparator, oldEntry, DartEntry.RESOLUTION_ERRORS, _resolutionErrorsState, "resolutionErrors");
     needsSeparator = writeStateDiffOn(builder, needsSeparator, oldEntry, DartEntry.VERIFICATION_ERRORS, _verificationErrorsState, "verificationErrors");
@@ -11834,6 +11582,11 @@
   }
 
   @override
+  void addListener(AnalysisListener listener) {
+    _basis.addListener(listener);
+  }
+
+  @override
   void addSourceInfo(Source source, SourceEntry info) {
     _basis.addSourceInfo(source, info);
   }
@@ -12437,6 +12190,11 @@
   }
 
   @override
+  void removeListener(AnalysisListener listener) {
+    _basis.removeListener(listener);
+  }
+
+  @override
   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit");
     _checkThread(instrumentation);
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 94a648b..9918613 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -97,7 +97,7 @@
    * @param arguments the arguments used to build the error message
    */
   AnalysisError.con1(this.source, this.errorCode, List<Object> arguments) {
-    this._message = JavaString.format(errorCode.message, arguments);
+    this._message = formatList(errorCode.message, arguments);
   }
 
   /**
@@ -112,10 +112,10 @@
   AnalysisError.con2(this.source, int offset, int length, this.errorCode, List<Object> arguments) {
     this._offset = offset;
     this._length = length;
-    this._message = JavaString.format(errorCode.message, arguments);
+    this._message = formatList(errorCode.message, arguments);
     String correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
-      this._correction = JavaString.format(correctionTemplate, arguments);
+      this._correction = formatList(correctionTemplate, arguments);
     }
   }
 
@@ -287,13 +287,13 @@
  * The enumeration `AngularCode` defines Angular specific problems.
  */
 class AngularCode extends Enum<AngularCode> implements ErrorCode {
-  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode('CANNOT_PARSE_SELECTOR', 0, "The selector '%s' cannot be parsed");
+  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode('CANNOT_PARSE_SELECTOR', 0, "The selector '{0}' cannot be parsed");
 
   static const AngularCode INVALID_FORMATTER_NAME = const AngularCode('INVALID_FORMATTER_NAME', 1, "Formatter name must be a simple identifier");
 
-  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode('INVALID_PROPERTY_KIND', 2, "Unknown property binding kind '%s', use one of the '@', '=>', '=>!' or '<=>'");
+  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode('INVALID_PROPERTY_KIND', 2, "Unknown property binding kind '{0}', use one of the '@', '=>', '=>!' or '<=>'");
 
-  static const AngularCode INVALID_PROPERTY_FIELD = const AngularCode('INVALID_PROPERTY_FIELD', 3, "Unknown property field '%s'");
+  static const AngularCode INVALID_PROPERTY_FIELD = const AngularCode('INVALID_PROPERTY_FIELD', 3, "Unknown property field '{0}'");
 
   static const AngularCode INVALID_PROPERTY_MAP = const AngularCode('INVALID_PROPERTY_MAP', 4, "Argument 'map' must be a constant map literal");
 
@@ -305,7 +305,7 @@
 
   static const AngularCode INVALID_REPEAT_ITEM_SYNTAX = const AngularCode('INVALID_REPEAT_ITEM_SYNTAX', 8, "Item must by identifier or in '(_key_, _value_)' pair.");
 
-  static const AngularCode INVALID_URI = const AngularCode('INVALID_URI', 9, "Invalid URI syntax: '%s'");
+  static const AngularCode INVALID_URI = const AngularCode('INVALID_URI', 9, "Invalid URI syntax: '{0}'");
 
   static const AngularCode MISSING_FORMATTER_COLON = const AngularCode('MISSING_FORMATTER_COLON', 10, "Missing ':' before formatter argument");
 
@@ -315,7 +315,7 @@
 
   static const AngularCode MISSING_SELECTOR = const AngularCode('MISSING_SELECTOR', 13, "Argument 'selector' must be provided");
 
-  static const AngularCode URI_DOES_NOT_EXIST = const AngularCode('URI_DOES_NOT_EXIST', 14, "Target of URI does not exist: '%s'");
+  static const AngularCode URI_DOES_NOT_EXIST = const AngularCode('URI_DOES_NOT_EXIST', 14, "Target of URI does not exist: '{0}'");
 
   static const List<AngularCode> values = const [
       CANNOT_PARSE_SELECTOR,
@@ -404,7 +404,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 1, "The name '%s' is defined in the libraries '%s' and '%s'");
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 1, "The name '{0}' is defined in the libraries '{1}' and '{2}'");
 
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
@@ -412,37 +412,37 @@
    *
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
-  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 2, "'%s' is not a parameter");
+  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 2, "'{0}' is not a parameter");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '{0}' cannot be as a type");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '{0}' cannot be used as a type name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '{0}' cannot be used as a type alias name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 6, "The built-in identifier '%s' cannot be used as a type parameter name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 6, "The built-in identifier '{0}' cannot be used as a type parameter name");
 
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
-  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '{0}' cannot override the == operator");
 
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
@@ -455,14 +455,14 @@
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 9, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 9, "Class '{0}' cannot have both getter '{1}.{2}' and method with the same name");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 10, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 10, "Class '{0}' cannot have both method '{1}.{2}' and getter with the same name");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -470,7 +470,7 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'%s' cannot be used to name a constructor and a field in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'{0}' cannot be used to name a constructor and a field in this class");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -478,19 +478,19 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'%s' cannot be used to name a constructor and a method in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'{0}' cannot be used to name a constructor and a method in this class");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 13, "'%s' cannot be used to name a type varaible in a class with the same name");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 13, "'{0}' cannot be used to name a type varaible in a class with the same name");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 14, "'%s' cannot be used to name a type varaible and member in this class");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 14, "'{0}' cannot be used to name a type varaible and member in this class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
@@ -503,7 +503,7 @@
    * by a class C if any instance variable declared in C is initialized with an expression that is
    * not a constant expression.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST', 16, "Can't define the 'const' constructor because the field '%s' is initialized with a non-constant value");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST', 16, "Can't define the 'const' constructor because the field '{0}' is initialized with a non-constant value");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
@@ -520,7 +520,7 @@
    * 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', 18, "Constant constructor cannot call non-constant super constructor of '%s'");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 18, "Constant constructor cannot call non-constant super constructor of '{0}'");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -546,7 +546,7 @@
    * @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', 21, "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', 21, "The initializer type '{0}' cannot be assigned to the field type '{1}'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
@@ -580,7 +580,7 @@
    * 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', 26, "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', 26, "The constant map entry key expression type '{0}' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -588,7 +588,7 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 27, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 27, "The const variable '{0}' 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
@@ -639,7 +639,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', 34, "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', 34, "The type '{0}' is declared with {1} type parameters, but {2} 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>,
@@ -666,7 +666,7 @@
    *
    * @param name the name of the non-type element
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 37, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 37, "The name '{0}' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
@@ -680,7 +680,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', 39, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 39, "The class '{0}' does not have a constant constructor '{1}'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -688,7 +688,7 @@
    *
    * @param typeName the name of the type
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 40, "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', 40, "The class '{0}' 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
@@ -721,7 +721,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 45, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 45, "The constructor with name '{0}' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -734,7 +734,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 46, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 46, "The name '{0}' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -746,21 +746,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 47, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 47, "The name '{0}' is already defined in '{1}'");
 
   /**
    * 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', 48, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 48, "The argument for the named parameter '{0}' 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', 49, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 49, "The library '{0}' 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
@@ -768,7 +768,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', 50, "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', 50, "The exported library '{0}' must not have a part-of directive");
 
   /**
    * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
@@ -800,7 +800,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', 53, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 53, "Classes cannot extend '{0}'");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -810,7 +810,7 @@
    * @see #IMPLEMENTS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 54, "This class cannot extend the deferred class '%s'");
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 54, "This class cannot extend the deferred class '{0}'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -822,14 +822,14 @@
    * @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', 55, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 55, "{0} positional arguments expected, but {1} 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', 56, "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', 56, "The field '{0}' 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
@@ -845,7 +845,7 @@
    *
    * @param name the name of the field in question
    */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 58, "'%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', 58, "'{0}' 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
@@ -874,7 +874,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', 62, "'%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', 62, "'{0}' 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>
@@ -884,7 +884,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 63, "This class cannot implement the deferred class '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 63, "This class cannot implement the deferred class '{0}'");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -903,7 +903,7 @@
    * @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', 64, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 64, "Classes cannot implement '{0}'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
@@ -931,7 +931,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 68, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 68, "'{0}' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -939,7 +939,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', 69, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 69, "'{0}' 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
@@ -958,7 +958,7 @@
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 71, "The library '%s' is internal and cannot be imported");
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 71, "The library '{0}' 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
@@ -967,7 +967,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', 72, "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', 72, "The imported library '{0}' 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
@@ -976,7 +976,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', 73, "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', 73, "Case expressions must have the same types, '{0}' is not a '{1}'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -987,7 +987,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', 74, "'%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', 74, "'{0}' 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
@@ -998,7 +998,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 75, "'%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', 75, "'{0}' 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
@@ -1010,7 +1010,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', 76, "'%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', 76, "'{0}' 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
@@ -1021,7 +1021,7 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 77, "'%s' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 77, "'{0}' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
@@ -1091,7 +1091,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', 87, "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', 87, "Constant list literals cannot include a type parameter as a type argument, such as '{0}'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1099,7 +1099,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', 88, "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', 88, "Constant map literals cannot include a type parameter as a type argument, such as '{0}'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1114,7 +1114,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 89, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 89, "Invalid URI syntax: '{0}'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1125,7 +1125,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 90, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 90, "Cannot reference label '{0}' 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
@@ -1136,7 +1136,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 91, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 91, "Cannot reference undefined label '{0}'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1150,7 +1150,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', 92, "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', 92, "The element type '{0}' cannot be assigned to the list type '{1}'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1164,7 +1164,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', 93, "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', 93, "The element type '{0}' cannot be assigned to the map key type '{1}'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1178,7 +1178,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_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 94, "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', 94, "The element type '{0}' cannot be assigned to the map value type '{1}'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
@@ -1192,7 +1192,7 @@
    *
    * @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', 96, "'%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', 96, "'{0}' 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.
@@ -1214,7 +1214,7 @@
    *
    * @param constantName the name of the constant that is missing
    */
-  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH = const CompileTimeErrorCode.con2('MISSING_ENUM_CONSTANT_IN_SWITCH', 99, "Missing case clause for '%s'", "Add a case clause for the missing constant or add a default clause.");
+  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH = const CompileTimeErrorCode.con2('MISSING_ENUM_CONSTANT_IN_SWITCH', 99, "Missing case clause for '{0}'", "Add a case clause for the missing constant or add a default clause.");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1222,7 +1222,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 100, "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', 100, "The class '{0}' 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
@@ -1232,7 +1232,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 101, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 101, "This class cannot mixin the deferred class '{0}'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1240,7 +1240,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', 102, "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', 102, "The class '{0}' 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.
@@ -1259,7 +1259,7 @@
    * @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', 103, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 103, "Classes cannot mixin '{0}'");
 
   /**
    * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
@@ -1275,7 +1275,7 @@
   /**
    * 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', 106, "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', 106, "The class '{0}' 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
@@ -1310,7 +1310,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', 111, "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', 111, "The class '{0}' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1319,7 +1319,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_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 112, "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', 112, "The class '{0}' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
@@ -1446,7 +1446,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', 127, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 127, "{0} required argument(s) expected, but {1} found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1454,7 +1454,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 NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 128, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 128, "The generative constructor '{0}' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
@@ -1472,13 +1472,13 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 131, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 131, "The included part '{0}' 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', 132, "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', 132, "The name '{0}' 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
@@ -1520,7 +1520,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', 137, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 137, "'{0}' cannot be a superinterface of itself: {1}");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1532,7 +1532,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', 138, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 138, "'{0}' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1544,7 +1544,7 @@
    *
    * @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', 139, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 139, "'{0}' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1556,19 +1556,19 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 140, "'%s' cannot use itself as a mixin");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 140, "'{0}' cannot use itself as a mixin");
 
   /**
    * 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', 141, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 141, "The constructor '{0}' could not be found in '{1}'");
 
   /**
    * 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', 142, "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', 142, "The name '{0}' 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
@@ -1580,7 +1580,7 @@
    * 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', 144, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 144, "The constructor '{0}' could not be found in '{1}'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
@@ -1651,7 +1651,7 @@
    * @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', 153, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 153, "'{0}' does not extend '{1}'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
@@ -1663,7 +1663,7 @@
    * 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', 155, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 155, "Undefined class '{0}'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1671,7 +1671,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', 156, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 156, "The class '{0}' does not have a generative constructor '{1}'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1679,7 +1679,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', 157, "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', 157, "The class '{0}' 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>,
@@ -1691,7 +1691,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 158, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 158, "The named parameter '{0}' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1706,7 +1706,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', 159, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 159, "Target of URI does not exist: '{0}'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1731,7 +1731,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', 161, "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', 161, "Operator '{0}' should declare exactly {1} parameter(s), but {2} found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1739,7 +1739,7 @@
    *
    * @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', 162, "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', 162, "Operator '-' should declare 0 or 1 parameter, but {0} found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
@@ -2347,7 +2347,7 @@
    * @param expectedType the name of the expected type
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
 
   /**
    * Dead code is code that is never reached, this can happen for instance if a statement follows a
@@ -2368,14 +2368,14 @@
    * @param subtypeName name of the subtype
    * @param supertypeName name of the supertype
    */
-  static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = const HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 3, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
+  static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = const HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 3, "Dead code, this on-catch block will never be executed since '{0}' is a subtype of '{1}'");
 
   /**
    * Deprecated members should not be invoked or used.
    *
    * @param memberName the name of the member
    */
-  static const HintCode DEPRECATED_MEMBER_USE = const HintCode.con1('DEPRECATED_MEMBER_USE', 4, "'%s' is deprecated");
+  static const HintCode DEPRECATED_MEMBER_USE = const HintCode.con1('DEPRECATED_MEMBER_USE', 4, "'{0}' is deprecated");
 
   /**
    * Duplicate imports.
@@ -2410,7 +2410,7 @@
   /**
    * Deferred libraries shouldn't define a top level function 'loadLibrary'.
    */
-  static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const HintCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 11, "The library '%s' defines a top-level function named 'loadLibrary' which is hidden by deferring this library");
+  static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = const HintCode.con1('IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION', 11, "The library '{0}' defines a top-level function named 'loadLibrary' which is hidden by deferring this library");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#INVALID_ASSIGNMENT]
@@ -2420,7 +2420,7 @@
    * @param lhsTypeName the name of the left hand side type
    * @see StaticTypeWarningCode#INVALID_ASSIGNMENT
    */
-  static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 12, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+  static const HintCode INVALID_ASSIGNMENT = const HintCode.con1('INVALID_ASSIGNMENT', 12, "A value of type '{0}' cannot be assigned to a variable of type '{1}'");
 
   /**
    * Generate a hint for methods or functions that have a return type, but do not have a non-void
@@ -2429,7 +2429,7 @@
    *
    * @param returnType the name of the declared return type
    */
-  static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 13, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
+  static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 13, "This function declares a return type of '{0}', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
 
   /**
    * A getter with the override annotation does not override an existing getter.
@@ -2451,7 +2451,7 @@
    *
    * @param className the name of the current class
    */
-  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 17, "The class '%s' overrides 'operator==', but not 'get hashCode'");
+  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 17, "The class '{0}' overrides 'operator==', but not 'get hashCode'");
 
   /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
@@ -2473,7 +2473,7 @@
    * @see StaticTypeWarningCode#UNDEFINED_GETTER
    * @see StaticWarningCode#UNDEFINED_GETTER
    */
-  static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 20, "There is no such getter '%s' in '%s'");
+  static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 20, "There is no such getter '{0}' in '{1}'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_METHOD] would
@@ -2483,7 +2483,7 @@
    * @param typeName the resolved type name that the method lookup is happening on
    * @see StaticTypeWarningCode#UNDEFINED_METHOD
    */
-  static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 21, "The method '%s' is not defined for the class '%s'");
+  static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 21, "The method '{0}' is not defined for the class '{1}'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_OPERATOR]
@@ -2493,7 +2493,7 @@
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    * @see StaticTypeWarningCode#UNDEFINED_OPERATOR
    */
-  static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 22, "There is no such operator '%s' in '%s'");
+  static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 22, "There is no such operator '{0}' in '{1}'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_SETTER] or
@@ -2505,7 +2505,7 @@
    * @see StaticTypeWarningCode#UNDEFINED_SETTER
    * @see StaticWarningCode#UNDEFINED_SETTER
    */
-  static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 23, "There is no such setter '%s' in '%s'");
+  static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 23, "There is no such setter '{0}' in '{1}'");
 
   /**
    * Unnecessary cast.
@@ -2533,7 +2533,7 @@
    *
    * @param name the name of the method or function that returns void
    */
-  static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 28, "The result of '%s' is being used, even though it is declared to be 'void'");
+  static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 28, "The result of '{0}' is being used, even though it is declared to be 'void'");
 
   static const List<HintCode> values = const [
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -2615,7 +2615,7 @@
    *
    * @param uri the URI that is invalid
    */
-  static const HtmlWarningCode INVALID_URI = const HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
+  static const HtmlWarningCode INVALID_URI = const HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '{0}'");
 
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag references
@@ -2623,7 +2623,7 @@
    *
    * @param uri the URI pointing to a non-existent file
    */
-  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
+  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '{0}'");
 
   static const List<HtmlWarningCode> values = const [INVALID_URI, URI_DOES_NOT_EXIST];
 
@@ -2667,19 +2667,19 @@
  * The enumeration `PolymerCode` defines Polymer specific problems.
  */
 class PolymerCode extends Enum<PolymerCode> implements ErrorCode {
-  static const PolymerCode ATTRIBUTE_FIELD_NOT_PUBLISHED = const PolymerCode('ATTRIBUTE_FIELD_NOT_PUBLISHED', 0, "Field '%s' in '%s' must be @published");
+  static const PolymerCode ATTRIBUTE_FIELD_NOT_PUBLISHED = const PolymerCode('ATTRIBUTE_FIELD_NOT_PUBLISHED', 0, "Field '{0}' in '{1}' must be @published");
 
-  static const PolymerCode DUPLICATE_ATTRIBUTE_DEFINITION = const PolymerCode('DUPLICATE_ATTRIBUTE_DEFINITION', 1, "The attribute '%s' is already defined");
+  static const PolymerCode DUPLICATE_ATTRIBUTE_DEFINITION = const PolymerCode('DUPLICATE_ATTRIBUTE_DEFINITION', 1, "The attribute '{0}' is already defined");
 
   static const PolymerCode EMPTY_ATTRIBUTES = const PolymerCode('EMPTY_ATTRIBUTES', 2, "Empty 'attributes' attribute is useless");
 
-  static const PolymerCode INVALID_ATTRIBUTE_NAME = const PolymerCode('INVALID_ATTRIBUTE_NAME', 3, "'%s' is not a valid name for a custom element attribute");
+  static const PolymerCode INVALID_ATTRIBUTE_NAME = const PolymerCode('INVALID_ATTRIBUTE_NAME', 3, "'{0}' is not a valid name for a custom element attribute");
 
-  static const PolymerCode INVALID_TAG_NAME = const PolymerCode('INVALID_TAG_NAME', 4, "'%s' is not a valid name for a custom element");
+  static const PolymerCode INVALID_TAG_NAME = const PolymerCode('INVALID_TAG_NAME', 4, "'{0}' is not a valid name for a custom element");
 
   static const PolymerCode MISSING_TAG_NAME = const PolymerCode('MISSING_TAG_NAME', 5, "Missing tag name of the custom element. Please include an attribute like name='your-tag-name'");
 
-  static const PolymerCode UNDEFINED_ATTRIBUTE_FIELD = const PolymerCode('UNDEFINED_ATTRIBUTE_FIELD', 6, "There is no such field '%s' in '%s'");
+  static const PolymerCode UNDEFINED_ATTRIBUTE_FIELD = const PolymerCode('UNDEFINED_ATTRIBUTE_FIELD', 6, "There is no such field '{0}' in '{1}'");
 
   static const List<PolymerCode> values = const [
       ATTRIBUTE_FIELD_NOT_PUBLISHED,
@@ -2799,7 +2799,7 @@
    *
    * @param numTypeArgument the number of provided type arguments
    */
-  static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 0, "List literal requires exactly one type arguments or none, but %d found");
+  static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 0, "List literal requires exactly one type arguments or none, but {0} found");
 
   /**
    * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class implements the
@@ -2807,7 +2807,7 @@
    *
    * @param numTypeArgument the number of provided type arguments
    */
-  static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 1, "Map literal requires exactly two type arguments or none, but %d found");
+  static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 1, "Map literal requires exactly two type arguments or none, but {0} found");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -2839,7 +2839,7 @@
    * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>.
    * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
    */
-  static const StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = const StaticTypeWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE', 3, "'%s' is inherited by at least two interfaces inconsistently, from %s");
+  static const StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = const StaticTypeWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE', 3, "'{0}' is inherited by at least two interfaces inconsistently, from {1}");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -2848,7 +2848,7 @@
    * @param memberName the name of the static member
    * @see UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
    */
-  static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER = const StaticTypeWarningCode.con1('INSTANCE_ACCESS_TO_STATIC_MEMBER', 4, "Static member '%s' cannot be accessed using instance access");
+  static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER = const StaticTypeWarningCode.con1('INSTANCE_ACCESS_TO_STATIC_MEMBER', 4, "Static member '{0}' cannot be accessed using instance access");
 
   /**
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
@@ -2865,7 +2865,7 @@
    * @param rhsTypeName the name of the right hand side type
    * @param lhsTypeName the name of the left hand side type
    */
-  static const StaticTypeWarningCode INVALID_ASSIGNMENT = const StaticTypeWarningCode.con1('INVALID_ASSIGNMENT', 5, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+  static const StaticTypeWarningCode INVALID_ASSIGNMENT = const StaticTypeWarningCode.con1('INVALID_ASSIGNMENT', 5, "A value of type '{0}' cannot be assigned to a variable of type '{1}'");
 
   /**
    * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the form
@@ -2887,7 +2887,7 @@
    *
    * @param nonFunctionIdentifier the name of the identifier that is not a function type
    */
-  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = const StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION', 6, "'%s' is not a method");
+  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = const StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION', 6, "'{0}' is not a method");
 
   /**
    * 12.14.4 Function Expression Invocation: A function expression invocation <i>i</i> has the form
@@ -2933,13 +2933,13 @@
    *
    * @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'");
+  static const StaticTypeWarningCode NON_BOOL_OPERAND = const StaticTypeWarningCode.con1('NON_BOOL_OPERAND', 11, "The operands of the '{0}' 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', 12, "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 '{0}' 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
@@ -2949,7 +2949,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', 13, "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 '{0}' is not a '{1}', as defined by the method '{2}'");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -2974,7 +2974,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', 14, "'%s' does not extend '%s'");
+  static const StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 14, "'{0}' does not extend '{1}'");
 
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype of its upper bound.
@@ -2982,7 +2982,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', 15, "'%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, "'{0}' cannot be a supertype of its upper bound");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -2992,7 +2992,7 @@
    * @param constantName the name of the enumeration constant that is not defined
    * @param enumName the name of the enumeration used to access the constant
    */
-  static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT = const StaticTypeWarningCode.con1('UNDEFINED_ENUM_CONSTANT', 16, "There is no constant named '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT = const StaticTypeWarningCode.con1('UNDEFINED_ENUM_CONSTANT', 16, "There is no constant named '{0}' in '{1}'");
 
   /**
    * 12.15.3 Unqualified Invocation: If there exists a lexically visible declaration named
@@ -3003,7 +3003,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 17, "The function '%s' is not defined");
+  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 17, "The function '{0}' is not defined");
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
@@ -3012,7 +3012,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', 18, "There is no such getter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 18, "There is no such getter '{0}' in '{1}'");
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
@@ -3021,7 +3021,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', 19, "The method '%s' is not defined for the class '%s'");
+  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 19, "The method '{0}' is not defined for the class '{1}'");
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -3039,7 +3039,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', 20, "There is no such operator '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 20, "There is no such operator '{0}' in '{1}'");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -3049,7 +3049,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', 21, "There is no such setter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 21, "There is no such setter '{0}' in '{1}'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -3060,7 +3060,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', 22, "There is no such method '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 22, "There is no such method '{0}' in '{1}'");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -3082,7 +3082,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', 24, "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', 24, "The type '{0}' is declared with {1} type parameters, but {2} type arguments were given");
 
   static const List<StaticTypeWarningCode> values = const [
       EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
@@ -3168,7 +3168,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The name '%s' is defined in the libraries %s");
+  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The name '{0}' is defined in the libraries {1}");
 
   /**
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
@@ -3194,7 +3194,7 @@
    * @param actualType the name of the actual argument type
    * @param expectedType the name of the expected type
    */
-  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '{0}' cannot be assigned to the parameter type '{1}'");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
@@ -3210,14 +3210,14 @@
    * 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_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'{0}' cannot be used as a setter, it is final");
 
   /**
    * 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_FINAL_NO_SETTER = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL_NO_SETTER', 4, "No setter named '%s' in class '%s'");
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL_NO_SETTER = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL_NO_SETTER', 4, "No setter named '{0}' in class '{1}'");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -3243,13 +3243,13 @@
    * 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', 8, "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 '{0}' 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', 9, "'%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, "'{0}' must have a method body because '{1}' 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
@@ -3262,7 +3262,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', 10, "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 '{0}' from SDK library '{1}' is implicitly hidden by '{2}'");
 
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
@@ -3271,19 +3271,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', 11, "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 '{0}' 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', 12, "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 '{0}' declares instance method '{1}', but also has a setter with the same name from '{2}'");
 
   /**
    * 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', 13, "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 '{0}' declares the setter '{1}', 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
@@ -3292,19 +3292,19 @@
    *
    * @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', 14, "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 '{0}' 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', 15, "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 '{0}' 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', 16, "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 '{0}' 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>,
@@ -3325,7 +3325,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', 19, "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 '{0}' and '{1}' should not have the same name '{2}'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -3335,7 +3335,7 @@
    * @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', 20, "%d positional arguments expected, but %d found");
+  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 20, "{0} positional arguments expected, but {1} found");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
@@ -3349,7 +3349,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', 22, "'%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, "'{0}' 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> =
@@ -3366,7 +3366,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', 23, "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 '{0}' cannot be assigned to the field type '{1}'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -3375,7 +3375,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', 24, "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 '{0}' is incompatable with the field type '{1}'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -3390,7 +3390,7 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 25, "The final variable '%s' must be initialized");
+  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 25, "The final variable '{0}' must be initialized");
 
   /**
    * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
@@ -3405,7 +3405,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', 27, "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 '{0}' and '{1}' should not have the same name '{2}'");
 
   /**
    * 14.1 Imports: It is a static warning if the specified URI of a deferred import does not refer
@@ -3414,7 +3414,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', 28, "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 '{0}' must not have a part-of directive");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if the above rules would cause multiple members
@@ -3425,7 +3425,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', 29, "'%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, "'{0}' 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
@@ -3435,7 +3435,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', 30, "'%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, "'{0}' collides with a static member in the superclass '{1}'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -3447,7 +3447,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', 31, "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 '{0}' is not assignable to '{1}' as required by the getter it is overriding from '{2}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3458,7 +3458,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', 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_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 32, "The parameter type '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3470,7 +3470,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', 33, "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 '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3481,7 +3481,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', 34, "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 '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3493,7 +3493,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', 35, "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 '{0}' is not assignable to '{1}' as required by the method it is overriding from '{2}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3501,7 +3501,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', 36, "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 '{0}.{1}' where '{2}' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3509,7 +3509,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', 37, "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 '{0}.{1}' 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
@@ -3519,7 +3519,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', 38, "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 '{0}' to match the overridden method from '{1}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3528,7 +3528,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', 39, "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 {0} parameters to match the overridden method from '{1}'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -3538,7 +3538,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', 40, "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 {0} required parameters or less to match the overridden method from '{1}'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -3550,7 +3550,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', 41, "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 '{0}' is not assignable to '{1}' as required by the setter it is overriding from '{2}'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> &hellip;
@@ -3564,7 +3564,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', 42, "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 '{0}' cannot be assigned to the list type '{1}'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -3579,7 +3579,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', 43, "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 '{0}' cannot be assigned to the map key type '{1}'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -3594,21 +3594,21 @@
    * 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', 44, "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 '{0}' cannot be assigned to the map value type '{1}'");
 
   /**
    * 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', 45, "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 '{0}' is '{1}' which is not assignable to its getter (of type '{2}')");
 
   /**
    * 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', 46, "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 '{0}' is '{1}' which is not assignable to its getter (of type '{2}'), from superclass '{3}'");
 
   /**
    * 13.12 Return: It is a static warning if a function contains both one or more return statements
@@ -3631,7 +3631,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', 49, "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 '{0}' is declared with {1} type parameters, but {2} 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,
@@ -3639,7 +3639,7 @@
    *
    * @param name the name of the non-type element
    */
-  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 50, "The name '%s' is not a class");
+  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 50, "The name '{0}' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -3650,7 +3650,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', 51, "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 '{0}' does not have a constructor '{1}'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -3661,7 +3661,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', 52, "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 '{0}' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3681,7 +3681,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', 53, "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 {0}, {1}, {2}, {3} and {4} more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3700,7 +3700,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', 54, "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 {0}, {1}, {2} and {3}");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3716,7 +3716,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', 55, "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 {0}");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3734,7 +3734,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', 56, "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 {0}, {1} and {2}");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -3751,7 +3751,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', 57, "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 {0} and {1}");
 
   /**
    * 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
@@ -3761,7 +3761,7 @@
    *
    * @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', 58, "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 '{0}' 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
@@ -3785,7 +3785,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 61, "%s is not a type");
+  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 61, "{0} 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;
@@ -3795,7 +3795,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', 62, "%d required argument(s) expected, but %d found");
+  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 62, "{0} required argument(s) expected, but {1} found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -3804,7 +3804,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', 63, "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 '{0}', not '{1}'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3813,7 +3813,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', 64, "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 '{0}' has incompatible parameters with '{1}'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3822,21 +3822,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', 65, "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 '{0}' of the redirected constructor is not assignable to '{1}'");
 
   /**
    * 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', 66, "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 '{0}' could not be found in '{1}'");
 
   /**
    * 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', 67, "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 '{0}' 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
@@ -3854,26 +3854,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', 69, "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 '{0}' 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', 70, "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 '{0}' of the switch expression is not assignable to the type '{1}' 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', 71, "The deferred type '%s' cannot be used in a declaration, cast or type test");
+  static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS = const StaticWarningCode.con1('TYPE_ANNOTATION_DEFERRED_CLASS', 71, "The deferred type '{0}' 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', 72, "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 '{0}' 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
@@ -3892,7 +3892,7 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 74, "Undefined class '%s'");
+  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 74, "Undefined class '{0}'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
@@ -3907,7 +3907,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', 76, "There is no such getter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 76, "There is no such getter '{0}' in '{1}'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -3917,7 +3917,7 @@
    *
    * @param name the name of the identifier
    */
-  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 77, "Undefined name '%s'");
+  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 77, "Undefined name '{0}'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -3926,7 +3926,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 78, "The named parameter '%s' is not defined");
+  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 78, "The named parameter '{0}' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -3941,7 +3941,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', 79, "There is no such setter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 79, "There is no such setter '{0}' in '{1}'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3950,7 +3950,7 @@
    * @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', 80, "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 '{0}' in '{1}'");
 
   /**
    * 7.2 Getters: It is a static warning if the return type of a getter is void.
@@ -4112,7 +4112,7 @@
   ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
 
   @override
-  String get message => "%s";
+  String get message => "{0}";
 
   @override
   ErrorType get type => ErrorType.TODO;
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 64ae986..8b69fd6 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -132,21 +132,6 @@
 }
 
 class JavaString {
-  static String format(String fmt, List args) {
-    var index = 0;
-    return fmt.replaceAllMapped(new RegExp(r'%(.)'), (match) {
-      switch (match.group(1)) {
-        case '%': return '%';
-        case 'd':
-        case 's':
-          if (index >= args.length) {
-            throw new MissingFormatArgumentException(match.group(0));
-          }
-          return args[index++].toString();
-        default: return match.group(1);
-      }
-    });
-  }
   static int indexOf(String target, String str, int fromIndex) {
     if (fromIndex > target.length) return -1;
     if (fromIndex < 0) fromIndex = 0;
@@ -330,6 +315,10 @@
   IllegalStateException([message = ""]) : super(message);
 }
 
+class NotImplementedException extends JavaException {
+  NotImplementedException(message) : super(message);
+}
+
 class UnsupportedOperationException extends JavaException {
   UnsupportedOperationException([message = ""]) : super(message);
 }
@@ -432,6 +421,10 @@
   return c.fold(true, (bool prev, e) => prev && list.contains(e));
 }
 
+bool javaSetEquals(Set a, Set b) {
+  return a.containsAll(b) && b.containsAll(a);
+}
+
 javaMapPut(Map target, key, value) {
   var oldValue = target[key];
   target[key] = value;
@@ -523,3 +516,31 @@
   int start() => _match.start;
   int end() => _match.end;
 }
+
+/**
+ * Inserts the given arguments into [pattern].
+ *
+ *     format('Hello, {0}!', 'John') = 'Hello, John!'
+ *     format('{0} are you {1}ing?', 'How', 'do') = 'How are you doing?'
+ *     format('{0} are you {1}ing?', 'What', 'read') = 'What are you reading?'
+ */
+String format(String pattern, [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7])
+    {
+  return formatList(pattern, [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7]);
+}
+
+/**
+ * Inserts the given [args] into [pattern].
+ *
+ *     format('Hello, {0}!', ['John']) = 'Hello, John!'
+ *     format('{0} are you {1}ing?', ['How', 'do']) = 'How are you doing?'
+ *     format('{0} are you {1}ing?', ['What', 'read']) = 'What are you reading?'
+ */
+String formatList(String pattern, List args) {
+  return pattern.replaceAllMapped(new RegExp(r'\{(\d+)\}'), (match) {
+    String indexStr = match.group(1);
+    int index = int.parse(indexStr);
+    var arg = args[index];
+    return arg != null ? arg.toString() : null;
+  });
+}
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index 245bd04..b2c95e1 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -84,7 +84,11 @@
     if (parent == null) return null;
     return new JavaFile(parent);
   }
-  String getAbsolutePath() => pathos.absolute(_path);
+  String getAbsolutePath() {
+    String path = pathos.absolute(_path);
+    path = pathos.normalize(path);
+    return path;
+  }
   String getCanonicalPath() {
     try {
       return _newFile().resolveSymbolicLinksSync();
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 129168f..c003da1 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1500,6 +1500,11 @@
   Token _currentToken;
 
   /**
+   * A flag indicating whether the parser is currently in a function body marked as being 'async'.
+   */
+  bool _inAsync = false;
+
+  /**
    * A flag indicating whether the parser is currently in the body of a loop.
    */
   bool _inLoop = false;
@@ -1897,6 +1902,22 @@
         _validateModifiersForOperator(modifiers);
         return _parseOperator(commentAndMetadata, modifiers.externalKeyword, null);
       }
+      Token keyword = modifiers.varKeyword;
+      if (keyword == null) {
+        keyword = modifiers.finalKeyword;
+      }
+      if (keyword == null) {
+        keyword = modifiers.constKeyword;
+      }
+      if (keyword != null) {
+        //
+        // We appear to have found an incomplete field declaration.
+        //
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+        List<VariableDeclaration> variables = new List<VariableDeclaration>();
+        variables.add(new VariableDeclaration(null, null, _createSyntheticIdentifier(), null, null));
+        return new FieldDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, null, new VariableDeclarationList(null, null, keyword, null, variables), _expectSemicolon());
+      }
       _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken, []);
       if (commentAndMetadata.comment != null || !commentAndMetadata.metadata.isEmpty) {
         //
@@ -2146,8 +2167,6 @@
     } else if (_matchesKeyword(Keyword.RETHROW)) {
       // TODO(brianwilkerson) Rethrow is a statement again.
       return _parseRethrowExpression();
-    } else if (_parseAsync && _matchesString(_AWAIT)) {
-      return _parseAwaitExpression();
     }
     //
     // assignableExpression is a subset of conditionalExpression, so we can parse a conditional
@@ -3644,16 +3663,15 @@
    *
    * <pre>
    * awaitExpression ::=
-   *     'await' expression ';'
+   *     'await' unaryExpression
    * </pre>
    *
    * @return the await expression that was parsed
    */
   AwaitExpression _parseAwaitExpression() {
     Token awaitToken = andAdvance;
-    Expression expression = parseExpression2();
-    Token semicolon = _expect(TokenType.SEMICOLON);
-    return new AwaitExpression(awaitToken, expression, semicolon);
+    Expression expression = _parseUnaryExpression();
+    return new AwaitExpression(awaitToken, expression);
   }
 
   /**
@@ -4243,6 +4261,22 @@
       _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []);
       return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, modifiers.externalKeyword, null));
     } else if (!_matchesIdentifier()) {
+      Token keyword = modifiers.varKeyword;
+      if (keyword == null) {
+        keyword = modifiers.finalKeyword;
+      }
+      if (keyword == null) {
+        keyword = modifiers.constKeyword;
+      }
+      if (keyword != null) {
+        //
+        // We appear to have found an incomplete top-level variable declaration.
+        //
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+        List<VariableDeclaration> variables = new List<VariableDeclaration>();
+        variables.add(new VariableDeclaration(null, null, _createSyntheticIdentifier(), null, null));
+        return new TopLevelVariableDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, new VariableDeclarationList(null, null, keyword, null, variables), _expectSemicolon());
+      }
       _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, []);
       return null;
     } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
@@ -4889,8 +4923,10 @@
    * @return the function body that was parsed
    */
   FunctionBody _parseFunctionBody(bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
+    bool wasInAsync = _inAsync;
     bool wasInLoop = _inLoop;
     bool wasInSwitch = _inSwitch;
+    _inAsync = false;
     _inLoop = false;
     _inSwitch = false;
     try {
@@ -4915,6 +4951,7 @@
           if (_matches(TokenType.STAR)) {
             star = andAdvance;
           }
+          _inAsync = true;
         } else if (_matchesString(SYNC)) {
           keyword = andAdvance;
           if (_matches(TokenType.STAR)) {
@@ -4958,6 +4995,7 @@
         return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON));
       }
     } finally {
+      _inAsync = wasInAsync;
       _inLoop = wasInLoop;
       _inSwitch = wasInSwitch;
     }
@@ -5741,10 +5779,13 @@
         _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []);
         return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
       }
-    } else if (_parseAsync && _matchesString(_YIELD)) {
+    } else if (_inAsync && _matchesString(_YIELD)) {
       return _parseYieldStatement();
-    } else if (_parseAsync && _matchesString(_AWAIT) && _tokenMatchesKeyword(_peek(), Keyword.FOR)) {
-      return _parseForStatement();
+    } else if (_inAsync && _matchesString(_AWAIT)) {
+      if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) {
+        return _parseForStatement();
+      }
+      return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
     } else if (_matches(TokenType.SEMICOLON)) {
       return _parseEmptyStatement();
     } else if (_isInitializedVariableDeclaration()) {
@@ -6507,6 +6548,7 @@
    * <pre>
    * unaryExpression ::=
    *     prefixOperator unaryExpression
+   *   | awaitExpression
    *   | postfixExpression
    *   | unaryOperator 'super'
    *   | '-' 'super'
@@ -6559,6 +6601,8 @@
     } else if (_matches(TokenType.PLUS)) {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
       return _createSyntheticIdentifier();
+    } else if (_inAsync && _matchesString(_AWAIT)) {
+      return _parseAwaitExpression();
     }
     return _parsePostfixExpression();
   }
@@ -7757,9 +7801,9 @@
 
   static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 24, "Directives must appear before any declarations");
 
-  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 25, "The label %s was already used in this switch statement");
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 25, "The label {0} was already used in this switch statement");
 
-  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 26, "The modifier '%s' was already specified.");
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 26, "The modifier '{0}' was already specified.");
 
   static const ParserErrorCode EMPTY_ENUM_BODY = const ParserErrorCode.con3('EMPTY_ENUM_BODY', 27, "An enum must declare at least one constant name");
 
@@ -7775,7 +7819,7 @@
 
   static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 33, "Expected a string literal");
 
-  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 34, "Expected to find '%s'");
+  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 34, "Expected to find '{0}'");
 
   static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 35, "Expected a type name");
 
@@ -7841,15 +7885,15 @@
 
   static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode.con4('INVALID_AWAIT_IN_FOR', 66, "The modifier 'await' is not allowed for a normal 'for' statement", "Remove the keyword or use a for-each statement.");
 
-  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 67, "The escape sequence '%s' is not a valid code point");
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 67, "The escape sequence '{0}' is not a valid code point");
 
   static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 68, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
 
   static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 69, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
 
-  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 70, "The string '%s' is not a valid operator");
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 70, "The string '{0}' is not a valid operator");
 
-  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 71, "The operator '%s' cannot be used with 'super'");
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 71, "The operator '{0}' cannot be used with 'super'");
 
   static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode.con4('INVALID_STAR_AFTER_ASYNC', 72, "The modifier 'async*' is not allowed for an expression function body", "Convert the body to a block.");
 
@@ -7895,7 +7939,7 @@
 
   static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 93, "Expected a statement");
 
-  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 94, "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', 94, "There is no '{0}' to close the parameter group");
 
   static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 95, "Type aliases for functions must have an explicit list of parameters");
 
@@ -7915,7 +7959,7 @@
 
   static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 103, "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', 104, "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', 104, "A single loop variable must be declared in a for-each loop before the 'in', but {0} were found");
 
   static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 105, "Each class definition can have at most one with clause");
 
@@ -7933,7 +7977,7 @@
 
   static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 112, "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', 113, "The operator '%s' is not user definable");
+  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 113, "The operator '{0}' is not user definable");
 
   static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 114, "Normal parameters must occur before optional parameters");
 
@@ -7967,9 +8011,9 @@
 
   static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 129, "Operators must be declared within a class");
 
-  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 130, "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', 130, "There is no '{0}' to open a parameter group");
 
-  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 131, "Unexpected token '%s'");
+  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 131, "Unexpected token '{0}'");
 
   static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 132, "The extends clause must be before the with clause");
 
@@ -7979,7 +8023,7 @@
 
   static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 135, "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', 136, "Expected '%s' to close parameter group");
+  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 136, "Expected '{0}' to close parameter group");
 
   static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 137, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
 
@@ -8296,7 +8340,7 @@
   @override
   bool visitAwaitExpression(AwaitExpression node) {
     AwaitExpression toNode = this._toNode as AwaitExpression;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return javaBooleanAnd(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword), _isEqualNodes(node.expression, toNode.expression));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 7887804..f3e71ad 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3529,6 +3529,7 @@
     } finally {
       _inFunction = wasInFunction;
     }
+    FunctionBody body = node.body;
     SimpleIdentifier constructorName = node.name;
     ConstructorElementImpl element = new ConstructorElementImpl.forNode(constructorName);
     if (node.factoryKeyword != null) {
@@ -3539,6 +3540,12 @@
     element.localVariables = holder.localVariables;
     element.parameters = holder.parameters;
     element.const2 = node.constKeyword != null;
+    if (body.isAsynchronous) {
+      element.asynchronous = true;
+    }
+    if (body.isGenerator) {
+      element.generator = true;
+    }
     _currentHolder.addConstructor(element);
     node.element = element;
     if (constructorName == null) {
@@ -3613,6 +3620,7 @@
   Object visitEnumDeclaration(EnumDeclaration node) {
     SimpleIdentifier enumName = node.name;
     ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
+    enumElement.enum2 = true;
     InterfaceTypeImpl enumType = new InterfaceTypeImpl.con1(enumElement);
     enumElement.type = enumType;
     _currentHolder.addEnum(enumElement);
@@ -3669,6 +3677,7 @@
       } finally {
         _inFunction = wasInFunction;
       }
+      FunctionBody body = expression.body;
       sc.Token property = node.propertyKeyword;
       if (property == null) {
         SimpleIdentifier functionName = node.name;
@@ -3677,6 +3686,12 @@
         element.labels = holder.labels;
         element.localVariables = holder.localVariables;
         element.parameters = holder.parameters;
+        if (body.isAsynchronous) {
+          element.asynchronous = true;
+        }
+        if (body.isGenerator) {
+          element.generator = true;
+        }
         if (_inFunction) {
           Block enclosingBlock = node.getAncestor((node) => node is Block);
           if (enclosingBlock != null) {
@@ -3707,6 +3722,12 @@
           getter.functions = holder.functions;
           getter.labels = holder.labels;
           getter.localVariables = holder.localVariables;
+          if (body.isAsynchronous) {
+            getter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            getter.generator = true;
+          }
           getter.variable = variable;
           getter.getter = true;
           getter.static = true;
@@ -3720,6 +3741,12 @@
           setter.labels = holder.labels;
           setter.localVariables = holder.localVariables;
           setter.parameters = holder.parameters;
+          if (body.isAsynchronous) {
+            setter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            setter.generator = true;
+          }
           setter.variable = variable;
           setter.setter = true;
           setter.static = true;
@@ -3745,11 +3772,18 @@
     } finally {
       _inFunction = wasInFunction;
     }
+    FunctionBody body = node.body;
     FunctionElementImpl element = new FunctionElementImpl.forOffset(node.beginToken.offset);
     element.functions = holder.functions;
     element.labels = holder.labels;
     element.localVariables = holder.localVariables;
     element.parameters = holder.parameters;
+    if (body.isAsynchronous) {
+      element.asynchronous = true;
+    }
+    if (body.isGenerator) {
+      element.generator = true;
+    }
     if (_inFunction) {
       Block enclosingBlock = node.getAncestor((node) => node is Block);
       if (enclosingBlock != null) {
@@ -3833,6 +3867,7 @@
       }
       bool isStatic = node.isStatic;
       sc.Token property = node.propertyKeyword;
+      FunctionBody body = node.body;
       if (property == null) {
         SimpleIdentifier methodName = node.name;
         String nameOfMethod = methodName.name;
@@ -3846,6 +3881,12 @@
         element.localVariables = holder.localVariables;
         element.parameters = holder.parameters;
         element.static = isStatic;
+        if (body.isAsynchronous) {
+          element.asynchronous = true;
+        }
+        if (body.isGenerator) {
+          element.generator = true;
+        }
         _currentHolder.addMethod(element);
         methodName.staticElement = element;
       } else {
@@ -3864,8 +3905,14 @@
           getter.functions = holder.functions;
           getter.labels = holder.labels;
           getter.localVariables = holder.localVariables;
+          if (body.isAsynchronous) {
+            getter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            getter.generator = true;
+          }
           getter.variable = field;
-          getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
+          getter.abstract = body is EmptyFunctionBody && node.externalKeyword == null;
           getter.getter = true;
           getter.static = isStatic;
           field.getter = getter;
@@ -3877,8 +3924,14 @@
           setter.labels = holder.labels;
           setter.localVariables = holder.localVariables;
           setter.parameters = holder.parameters;
+          if (body.isAsynchronous) {
+            setter.asynchronous = true;
+          }
+          if (body.isGenerator) {
+            setter.generator = true;
+          }
           setter.variable = field;
-          setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
+          setter.abstract = body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
           setter.setter = true;
           setter.static = isStatic;
           field.setter = setter;
@@ -4043,13 +4096,11 @@
       }
       PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(variable);
       getter.getter = true;
-      getter.static = variable.isStatic;
       _currentHolder.addAccessor(getter);
       variable.getter = getter;
       if (!isFinal) {
         PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forVariable(variable);
         setter.setter = true;
-        setter.static = variable.isStatic;
         ParameterElementImpl parameter = new ParameterElementImpl("_${variable.name}", variable.nameOffset);
         parameter.synthetic = true;
         parameter.parameterKind = ParameterKind.REQUIRED;
@@ -6832,11 +6883,15 @@
             }
           } else {
             if (staticOrPropagatedEnclosingElt is ClassElement) {
-              InterfaceType targetType = staticOrPropagatedEnclosingElt.type;
+              ClassElement classElement = staticOrPropagatedEnclosingElt;
+              InterfaceType targetType = classElement.type;
               if (targetType != null && targetType.isDartCoreFunction && propertyName.name == FunctionElement.CALL_METHOD_NAME) {
                 // TODO(brianwilkerson) Can we ever resolve the function being invoked?
                 //resolveArgumentsToParameters(node.getArgumentList(), invokedFunction);
                 return;
+              } else if (classElement.isEnum && propertyName.name == "_name") {
+                _resolver.reportErrorForNode(CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, propertyName, [propertyName.name]);
+                return;
               }
             }
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_GETTER : HintCode.UNDEFINED_GETTER);
@@ -7128,23 +7183,22 @@
     // Populate the fields.
     //
     List<FieldElement> fields = new List<FieldElement>();
+    List<PropertyAccessorElement> getters = new List<PropertyAccessorElement>();
     InterfaceType intType = _typeProvider.intType;
-    InterfaceType stringType = _typeProvider.stringType;
     String indexFieldName = "index";
     FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
     indexField.final2 = true;
+    indexField.synthetic = true;
     indexField.type = intType;
     fields.add(indexField);
-    String nameFieldName = "_name";
-    FieldElementImpl nameField = new FieldElementImpl(nameFieldName, -1);
-    nameField.final2 = true;
-    nameField.type = stringType;
-    fields.add(nameField);
+    getters.add(_createGetter(indexField));
     FieldElementImpl valuesField = new FieldElementImpl("values", -1);
     valuesField.static = true;
     valuesField.const3 = true;
+    valuesField.synthetic = true;
     valuesField.type = _typeProvider.listType.substitute4(<DartType> [enumType]);
     fields.add(valuesField);
+    getters.add(_createGetter(valuesField));
     //
     // Build the enum constants.
     //
@@ -7152,25 +7206,43 @@
     int constantCount = constants.length;
     for (int i = 0; i < constantCount; i++) {
       SimpleIdentifier constantName = constants[i].name;
-      FieldElementImpl constantElement = new ConstFieldElementImpl.con1(constantName);
-      constantElement.static = true;
-      constantElement.const3 = true;
-      constantElement.type = enumType;
+      FieldElementImpl constantField = new ConstFieldElementImpl.con1(constantName);
+      constantField.static = true;
+      constantField.const3 = true;
+      constantField.type = enumType;
+      //
+      // Create a value for the constant.
+      //
       HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
       fieldMap[indexFieldName] = new DartObjectImpl(intType, new IntState(i));
-      fieldMap[nameFieldName] = new DartObjectImpl(stringType, new StringState(constantName.name));
       DartObjectImpl value = new DartObjectImpl(enumType, new GenericState(fieldMap));
-      constantElement.evaluationResult = new ValidResult(value);
-      fields.add(constantElement);
-      constantName.staticElement = constantElement;
+      constantField.evaluationResult = new ValidResult(value);
+      fields.add(constantField);
+      getters.add(_createGetter(constantField));
+      constantName.staticElement = constantField;
     }
     //
     // Finish building the enum.
     //
     enumElement.fields = new List.from(fields);
+    enumElement.accessors = new List.from(getters);
     // Client code isn't allowed to invoke the constructor, so we do not model it.
     return super.visitEnumDeclaration(node);
   }
+
+  /**
+   * Create a getter that corresponds to the given field.
+   *
+   * @param field the field for which a getter is to be created
+   * @return the getter that was created
+   */
+  PropertyAccessorElement _createGetter(FieldElementImpl field) {
+    PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(field);
+    getter.getter = true;
+    getter.returnType = field.type;
+    field.getter = getter;
+    return getter;
+  }
 }
 
 /**
@@ -7857,6 +7929,7 @@
       if (type is InterfaceType) {
         InterfaceType interfaceType = type;
         _checkForConstOrNewWithAbstractClass(node, typeName, interfaceType);
+        _checkForConstOrNewWithEnum(node, typeName, interfaceType);
         if (_isInConstInstanceCreation) {
           _checkForConstWithNonConst(node);
           _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
@@ -8075,6 +8148,7 @@
   Object visitSwitchStatement(SwitchStatement node) {
     _checkForSwitchExpressionNotAssignable(node);
     _checkForCaseBlocksNotTerminated(node);
+    _checkForMissingEnumConstantInSwitch(node);
     return super.visitSwitchStatement(node);
   }
 
@@ -9544,12 +9618,30 @@
   }
 
   /**
+   * This verifies that the passed instance creation expression is not being invoked on an enum.
+   *
+   * @param node the instance creation expression to verify
+   * @param typeName the [TypeName] of the [ConstructorName] from the
+   *          [InstanceCreationExpression], this is the AST node that the error is attached to
+   * @param type the type being constructed with this [InstanceCreationExpression]
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see CompileTimeErrorCode#INSTANTIATE_ENUM
+   */
+  bool _checkForConstOrNewWithEnum(InstanceCreationExpression node, TypeName typeName, InterfaceType type) {
+    if (type.element.isEnum) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANTIATE_ENUM, typeName, []);
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * This verifies that the passed 'const' instance creation expression is not being invoked on a
    * constructor that is not 'const'.
    *
    * This method assumes that the instance creation was tested to be 'const' before being called.
    *
-   * @param node the instance creation expression to evaluate
+   * @param node the instance creation expression to verify
    * @return `true` if and only if an error code is generated on the passed node
    * @see CompileTimeErrorCode#CONST_WITH_NON_CONST
    */
@@ -9613,6 +9705,14 @@
     if (node.staticElement != null) {
       return false;
     }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
     Identifier className = typeName.name;
     // report as named or default constructor absence
     SimpleIdentifier name = constructorName.name;
@@ -10724,6 +10824,59 @@
   }
 
   /**
+   * Check to make sure that switch statements whose static type is an enum type either have a
+   * default case or include all of the enum constants.
+   *
+   * @param statement the switch statement to check
+   * @return `true` if and only if an error code is generated on the passed node
+   */
+  bool _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
+    // TODO(brianwilkerson) This needs to be checked after constant values have been computed.
+    Expression expression = statement.expression;
+    DartType expressionType = getStaticType(expression);
+    if (expressionType == null) {
+      return false;
+    }
+    Element expressionElement = expressionType.element;
+    if (expressionElement is! ClassElement) {
+      return false;
+    }
+    ClassElement classElement = expressionElement as ClassElement;
+    if (!classElement.isEnum) {
+      return false;
+    }
+    List<String> constantNames = new List<String>();
+    List<FieldElement> fields = classElement.fields;
+    int fieldCount = fields.length;
+    for (int i = 0; i < fieldCount; i++) {
+      FieldElement field = fields[i];
+      if (field.isStatic && !field.isSynthetic) {
+        constantNames.add(field.name);
+      }
+    }
+    NodeList<SwitchMember> members = statement.members;
+    int memberCount = members.length;
+    for (int i = 0; i < memberCount; i++) {
+      SwitchMember member = members[i];
+      if (member is SwitchDefault) {
+        return false;
+      }
+      String constantName = _getConstantName((member as SwitchCase).expression);
+      if (constantName != null) {
+        constantNames.remove(constantName);
+      }
+    }
+    int nameCount = constantNames.length;
+    if (nameCount == 0) {
+      return false;
+    }
+    for (int i = 0; i < nameCount; i++) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH, statement, [constantNames[i]]);
+    }
+    return true;
+  }
+
+  /**
    * This verifies that the given function body does not contain return statements that both have
    * and do not have return values.
    *
@@ -10852,6 +11005,14 @@
     if (node.staticElement != null) {
       return false;
     }
+    DartType type = typeName.type;
+    if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        // We have already reported the error.
+        return false;
+      }
+    }
     // prepare class name
     Identifier className = typeName.name;
     // report as named or default constructor absence
@@ -11451,6 +11612,9 @@
    * @see StaticTypeWarningCode#RETURN_OF_INVALID_TYPE
    */
   bool _checkForReturnOfInvalidType(Expression returnExpression, DartType expectedReturnType) {
+    if (_enclosingFunction == null) {
+      return false;
+    }
     DartType staticReturnType = getStaticType(returnExpression);
     if (expectedReturnType.isVoid) {
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
@@ -11462,8 +11626,23 @@
           _enclosingFunction.displayName]);
       return true;
     }
-    bool isStaticAssignable = staticReturnType.isAssignableTo(expectedReturnType);
-    if (isStaticAssignable) {
+    if (_enclosingFunction.isAsynchronous && !_enclosingFunction.isGenerator) {
+      // TODO(brianwilkerson) Figure out how to get the type "Future" so that we can build the type
+      // we need to test against.
+      //      InterfaceType impliedType = "Future<" + flatten(staticReturnType) + ">"
+      //      if (impliedType.isAssignableTo(expectedReturnType)) {
+      //        return false;
+      //      }
+      //      errorReporter.reportTypeErrorForNode(
+      //          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
+      //          returnExpression,
+      //          impliedType,
+      //          expectedReturnType.getDisplayName(),
+      //          enclosingFunction.getDisplayName());
+      //      return true;
+      return false;
+    }
+    if (staticReturnType.isAssignableTo(expectedReturnType)) {
       return false;
     }
     _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
@@ -11930,6 +12109,25 @@
   }
 
   /**
+   * Return the flattened version of the given type, as defined by the specification: <blockquote>
+   * Let <i>flatten(T) = flatten(S)</i> if <i>T = Future&lt;S&gt;</i>, and <i>T</i> otherwise.
+   * </blockquote>
+   *
+   * @param type the type to be flattened
+   * @return the flattened version of the given type
+   */
+  DartType _flatten(DartType type) {
+    while (_isFuture(type)) {
+      List<DartType> arguments = (type as InterfaceType).typeArguments;
+      if (arguments.length != 1) {
+        return type;
+      }
+      type = arguments[0];
+    }
+    return type;
+  }
+
+  /**
    * Return the error code that should be used when the given class references itself directly.
    *
    * @param classElt the class that references itself
@@ -11950,6 +12148,25 @@
   }
 
   /**
+   * Given an expression in a switch case whose value is expected to be an enum constant, return the
+   * name of the constant.
+   *
+   * @param expression the expression from the switch case
+   * @return the name of the constant referenced by the expression
+   */
+  String _getConstantName(Expression expression) {
+    // TODO(brianwilkerson) Convert this to return the element representing the constant.
+    if (expression is SimpleIdentifier) {
+      return expression.name;
+    } else if (expression is PrefixedIdentifier) {
+      return expression.identifier.name;
+    } else if (expression is PropertyAccess) {
+      return expression.propertyName.name;
+    }
+    return null;
+  }
+
+  /**
    * Returns the Type (return type) for a given getter.
    *
    * @param propertyAccessorElement
@@ -12072,6 +12289,30 @@
   }
 
   /**
+   * Return `true` if the given type represents the class `Future` from the
+   * `dart:async` library.
+   *
+   * @param type the type to be tested
+   * @return `true` if the given type represents the class `Future` from the
+   *         `dart:async` library
+   */
+  bool _isFuture(DartType type) {
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      if (interfaceType.name == "Future") {
+        ClassElement element = interfaceType.element;
+        if (element != null) {
+          LibraryElement library = element.library;
+          if (library.name == "dart.async") {
+            return true;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
    * Return `true` iff the passed [ClassElement] has a method, getter or setter that
    * matches the name of the passed [ExecutableElement] in either the class itself, or one of
    * its' mixins that is concrete.
@@ -22990,7 +23231,7 @@
     InterfaceType superclassType = null;
     if (extendsClause != null) {
       ErrorCode errorCode = (withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
-      superclassType = _resolveType(extendsClause.superclass, errorCode, errorCode);
+      superclassType = _resolveType(extendsClause.superclass, errorCode, CompileTimeErrorCode.EXTENDS_ENUM, errorCode);
       if (!identical(superclassType, typeProvider.objectType)) {
         classElement.validMixin = false;
       }
@@ -23014,7 +23255,7 @@
     super.visitClassTypeAlias(node);
     ClassElementImpl classElement = _getClassElement(node.name);
     ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
-    InterfaceType superclassType = _resolveType(node.superclass, errorCode, errorCode);
+    InterfaceType superclassType = _resolveType(node.superclass, errorCode, CompileTimeErrorCode.EXTENDS_ENUM, errorCode);
     if (superclassType == null) {
       superclassType = typeProvider.objectType;
     }
@@ -23841,14 +24082,14 @@
    */
   void _resolve(ClassElementImpl classElement, WithClause withClause, ImplementsClause implementsClause) {
     if (withClause != null) {
-      List<InterfaceType> mixinTypes = _resolveTypes(withClause.mixinTypes, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
+      List<InterfaceType> mixinTypes = _resolveTypes(withClause.mixinTypes, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, CompileTimeErrorCode.MIXIN_OF_ENUM, CompileTimeErrorCode.MIXIN_OF_NON_CLASS);
       if (classElement != null) {
         classElement.mixins = mixinTypes;
       }
     }
     if (implementsClause != null) {
       NodeList<TypeName> interfaces = implementsClause.interfaces;
-      List<InterfaceType> interfaceTypes = _resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
+      List<InterfaceType> interfaceTypes = _resolveTypes(interfaces, CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, CompileTimeErrorCode.IMPLEMENTS_ENUM, CompileTimeErrorCode.IMPLEMENTS_DYNAMIC);
       if (classElement != null) {
         classElement.interfaces = interfaceTypes;
       }
@@ -23883,12 +24124,18 @@
    * @param typeName the type name specifying the type to be returned
    * @param nonTypeError the error to produce if the type name is defined to be something other than
    *          a type
+   * @param enumTypeError the error to produce if the type name is defined to be an enum
    * @param dynamicTypeError the error to produce if the type name is "dynamic"
    * @return the type specified by the type name
    */
-  InterfaceType _resolveType(TypeName typeName, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
+  InterfaceType _resolveType(TypeName typeName, ErrorCode nonTypeError, ErrorCode enumTypeError, ErrorCode dynamicTypeError) {
     DartType type = typeName.type;
     if (type is InterfaceType) {
+      ClassElement element = type.element;
+      if (element != null && element.isEnum) {
+        reportErrorForNode(enumTypeError, typeName, []);
+        return null;
+      }
       return type;
     }
     // If the type is not an InterfaceType, then visitTypeName() sets the type to be a DynamicTypeImpl
@@ -23907,13 +24154,14 @@
    * @param typeNames the type names to be resolved
    * @param nonTypeError the error to produce if the type name is defined to be something other than
    *          a type
+   * @param enumTypeError the error to produce if the type name is defined to be an enum
    * @param dynamicTypeError the error to produce if the type name is "dynamic"
    * @return an array containing all of the types that were resolved.
    */
-  List<InterfaceType> _resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTypeError, ErrorCode dynamicTypeError) {
+  List<InterfaceType> _resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTypeError, ErrorCode enumTypeError, ErrorCode dynamicTypeError) {
     List<InterfaceType> types = new List<InterfaceType>();
     for (TypeName typeName in typeNames) {
-      InterfaceType type = _resolveType(typeName, nonTypeError, dynamicTypeError);
+      InterfaceType type = _resolveType(typeName, nonTypeError, enumTypeError, dynamicTypeError);
       if (type != null) {
         types.add(type);
       }
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 2d50d11..c2e714d 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -1870,7 +1870,7 @@
  * scanner.
  */
 class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
-  static const ScannerErrorCode ILLEGAL_CHARACTER = const ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
+  static const ScannerErrorCode ILLEGAL_CHARACTER = const ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character {0}");
 
   static const ScannerErrorCode MISSING_DIGIT = const ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
 
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
index f0223de..18490e3 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
@@ -46,7 +46,7 @@
 
   static BlockFunctionBody asyncGeneratorBlockFunctionBody(List<Statement> statements) => new BlockFunctionBody(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"), TokenFactory.tokenFromType(TokenType.STAR), block(statements));
 
-  static AwaitExpression awaitExpression(Expression expression) => new AwaitExpression(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "await"), expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
+  static AwaitExpression awaitExpression(Expression expression) => new AwaitExpression(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "await"), expression);
 
   static BinaryExpression binaryExpression(Expression leftOperand, TokenType operator, Expression rightOperand) => new BinaryExpression(leftOperand, TokenFactory.tokenFromType(operator), rightOperand);
 
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 083ca30..e2b44c1 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -148,7 +148,6 @@
     field.type = type;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(field);
     getter.getter = true;
-    getter.static = isStatic;
     getter.synthetic = true;
     getter.variable = field;
     getter.returnType = type;
@@ -158,7 +157,6 @@
     if (!isConst && !isFinal) {
       PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forVariable(field);
       setter.setter = true;
-      setter.static = isStatic;
       setter.synthetic = true;
       setter.variable = field;
       setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
@@ -274,7 +272,6 @@
     field.type = type;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(field);
     getter.getter = true;
-    getter.static = isStatic;
     getter.variable = field;
     getter.returnType = type;
     field.getter = getter;
@@ -385,7 +382,6 @@
     field.type = type;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(field);
     getter.getter = true;
-    getter.static = isStatic;
     getter.variable = field;
     getter.returnType = type;
     field.getter = getter;
@@ -394,7 +390,6 @@
     ParameterElementImpl parameter = requiredParameter2("a", type);
     PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forVariable(field);
     setter.setter = true;
-    setter.static = isStatic;
     setter.synthetic = true;
     setter.variable = field;
     setter.parameters = <ParameterElement> [parameter];
@@ -415,7 +410,6 @@
     variable.synthetic = true;
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(variable);
     getter.getter = true;
-    getter.static = true;
     getter.synthetic = true;
     getter.variable = variable;
     getter.returnType = type;
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 192b1d1..0c272f1 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -457,7 +457,7 @@
     space();
     token(node.operator);
     allowContinuedLines((){
-      space();
+      levelSpace(SINGLE_SPACE_WEIGHT);
       visit(node.rightHandSide);
     });
   }
@@ -467,8 +467,6 @@
     token(node.awaitKeyword);
     space();
     visit(node.expression);
-    // TODO(scheglov) a bug in the spec, there sould not be a ';'
-    token(node.semicolon);
   }
 
   visitBinaryExpression(BinaryExpression node) {
@@ -680,7 +678,7 @@
       newlines();
     } else {
       preserveLeadingNewlines();
-      space();
+      levelSpace(lastSpaceWeight++);
     }
     indent(2);
     token(node.separator /* : */);
@@ -1368,14 +1366,9 @@
           levelSpace(lastSpaceWeight);
           visit(initializer);
         });
-      } else if (initializer is ConditionalExpression) {
-        allowContinuedLines(() {
-          space();
-          visit(initializer);
-        });
       } else {
         allowContinuedLines(() {
-          levelSpace(lastSpaceWeight++);
+          levelSpace(SINGLE_SPACE_WEIGHT);
           visit(initializer);
         });
       }
diff --git a/pkg/analyzer/lib/src/services/writer.dart b/pkg/analyzer/lib/src/services/writer.dart
index f4443cd..6c4ae5c 100644
--- a/pkg/analyzer/lib/src/services/writer.dart
+++ b/pkg/analyzer/lib/src/services/writer.dart
@@ -101,6 +101,31 @@
   List<Chunk> breakLine(Line line) {
     List<LineToken> tokens = preprocess(line.tokens);
     List<Chunk> chunks = <Chunk>[new Chunk(line.indentLevel, maxLength, tokens)];
+    // try SINGLE_SPACE_WEIGHT
+    {
+      Chunk chunk = chunks[0];
+      if (chunk.length > maxLength) {
+        for (int i = 0; i < tokens.length; i++) {
+          LineToken token = tokens[i];
+          if (token is SpaceToken && token.breakWeight == SINGLE_SPACE_WEIGHT) {
+            var beforeChunk = chunk.subChunk(chunk.indent, 0, i);
+            var restChunk = chunk.subChunk(chunk.indent + 2, i + 1);
+            // check if 'init' in 'var v = init;' fits a line
+            if (restChunk.length < maxLength) {
+              return [beforeChunk, restChunk];
+            }
+            // check if 'var v = method(' in 'var v = method(args)' does not fit
+            int weight = chunk.findMinSpaceWeight();
+            if (chunk.getLengthToSpaceWithWeight(weight) > maxLength) {
+              chunks = [beforeChunk, restChunk];
+            }
+            // done anyway
+            break;
+          }
+        }
+      }
+    }
+    // other spaces
     while (true) {
       List<Chunk> newChunks = <Chunk>[];
       bool hasChanges = false;
@@ -115,8 +140,8 @@
               int length = 0;
               for (int i = 0; i < tokens.length; i++) {
                 LineToken token = tokens[i];
-                if (token is SpaceToken && token.breakWeight == weight
-                    && i < tokens.length - 1) {
+                if (token is SpaceToken && token.breakWeight == weight &&
+                    i < tokens.length - 1) {
                   LineToken nextToken = tokens[i + 1];
                   if (length + token.length + nextToken.length > maxLength) {
                     newChunks.add(chunk.subChunk(newIndent, start, i));
@@ -211,6 +236,8 @@
 final LINE_START = new SpaceToken(0);
 
 const DEFAULT_SPACE_WEIGHT = UNBREAKABLE_SPACE_WEIGHT - 1;
+/// The weight of a space after '=' in variable declaration or assignment
+const SINGLE_SPACE_WEIGHT = UNBREAKABLE_SPACE_WEIGHT - 2;
 const UNBREAKABLE_SPACE_WEIGHT = 100000000;
 
 /// Simple non-breaking printer
@@ -243,7 +270,20 @@
     this.tokens.addAll(tokens);
   }
 
-  int get length => tokens.fold(0, (len, token) => len + token.length);
+  int get length {
+    return tokens.fold(0, (len, token) => len + token.length);
+  }
+
+  int getLengthToSpaceWithWeight(int weight) {
+    int length = 0;
+    for (LineToken token in tokens) {
+      if (token is SpaceToken && token.breakWeight == weight) {
+        break;
+      }
+      length += token.length;
+    }
+    return length;
+  }
 
   bool fits(LineToken a, LineToken b) {
     return length + a.length + a.length <= maxLength;
@@ -253,6 +293,12 @@
     tokens.add(token);
   }
 
+  bool hasInitializerSpace() {
+    return tokens.any((token) {
+      return token is SpaceToken && token.breakWeight == SINGLE_SPACE_WEIGHT;
+    });
+  }
+
   bool hasAnySpace() {
     return tokens.any((token) => token is SpaceToken);
   }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 4e03306..276c2e6 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.22.0+2
+version: 0.22.3
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/all_the_rest.dart b/pkg/analyzer/test/generated/all_the_rest.dart
index 1ee9a48..27c303e 100644
--- a/pkg/analyzer/test/generated/all_the_rest.dart
+++ b/pkg/analyzer/test/generated/all_the_rest.dart
@@ -9433,38 +9433,40 @@
 //     EnumDeclaration enumDeclaration = AstFactory.enumDeclaration2("E", [firstName, secondName, thirdName]);
 //     ClassElement enumElement = _buildElement(enumDeclaration);
 //     List<FieldElement> fields = enumElement.fields;
-//     EngineTestCase.assertLength(6, fields);
-//     FieldElement constant = fields[3];
+//     EngineTestCase.assertLength(5, fields);
+//     FieldElement constant = fields[2];
 //     JUnitTestCase.assertNotNull(constant);
 //     JUnitTestCase.assertEquals(firstName, constant.name);
-//     constant = fields[4];
+//     JUnitTestCase.assertTrue(constant.isStatic);
+//     constant = fields[3];
 //     JUnitTestCase.assertNotNull(constant);
 //     JUnitTestCase.assertEquals(secondName, constant.name);
-//     constant = fields[5];
+//     JUnitTestCase.assertTrue(constant.isStatic);
+//     constant = fields[4];
 //     JUnitTestCase.assertNotNull(constant);
 //     JUnitTestCase.assertEquals(thirdName, constant.name);
+//     JUnitTestCase.assertTrue(constant.isStatic);
 //   }
 //   void test_visitEnumDeclaration_single() {
 //     String firstName = "ONE";
 //     EnumDeclaration enumDeclaration = AstFactory.enumDeclaration2("E", [firstName]);
 //     ClassElement enumElement = _buildElement(enumDeclaration);
 //     List<FieldElement> fields = enumElement.fields;
-//     EngineTestCase.assertLength(4, fields);
+//     EngineTestCase.assertLength(3, fields);
 //     FieldElement field = fields[0];
 //     JUnitTestCase.assertNotNull(field);
 //     JUnitTestCase.assertEquals("index", field.name);
 //     JUnitTestCase.assertFalse(field.isStatic);
+//     JUnitTestCase.assertTrue(field.isSynthetic);
 //     field = fields[1];
 //     JUnitTestCase.assertNotNull(field);
-//     JUnitTestCase.assertEquals("_name", field.name);
-//     JUnitTestCase.assertFalse(field.isStatic);
-//     field = fields[2];
-//     JUnitTestCase.assertNotNull(field);
 //     JUnitTestCase.assertEquals("values", field.name);
 //     JUnitTestCase.assertTrue(field.isStatic);
-//     FieldElement constant = fields[3];
+//     JUnitTestCase.assertTrue(field.isSynthetic);
+//     FieldElement constant = fields[2];
 //     JUnitTestCase.assertNotNull(constant);
 //     JUnitTestCase.assertEquals(firstName, constant.name);
+//     JUnitTestCase.assertTrue(constant.isStatic);
 //   }
 //   ClassElement _buildElement(EnumDeclaration enumDeclaration) {
 //     ElementHolder holder = new ElementHolder();
@@ -13366,7 +13368,6 @@
 //   static Test suite() {
 //     TestSuite suite = new ExtendedTestSuite("Tests in ${TestAll.getPackage().getName()}");
 //     suite.addTestSuite(AnalysisTaskTest);
-//     suite.addTestSuite(BuildDartElementModelTaskTest);
 //     suite.addTestSuite(GenerateDartErrorsTaskTest);
 //     suite.addTestSuite(GenerateDartHintsTaskTest);
 //     suite.addTestSuite(GetContentTaskTest);
@@ -13386,6 +13387,7 @@
 //     suite.addTestSuite(FunctionTypeImplTest);
 //     suite.addTestSuite(InterfaceTypeImplTest);
 //     suite.addTestSuite(TypeParameterTypeImplTest);
+//     suite.addTestSuite(UnionTypeImplTest);
 //     suite.addTestSuite(VoidTypeImplTest);
 //     return suite;
 //   }
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 995324c..ce60089 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -2206,6 +2206,22 @@
     _assertSource("get f() {}", AstFactory.functionDeclaration(null, Keyword.GET, "f", AstFactory.functionExpression()));
   }
 
+  void test_visitFunctionDeclaration_local_blockBody() {
+    FunctionDeclaration f = AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression());
+    FunctionDeclarationStatement fStatement = new FunctionDeclarationStatement(f);
+    _assertSource("main() {f() {} 42;}", AstFactory.functionDeclaration(null, null, "main", AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([
+        fStatement,
+        AstFactory.expressionStatement(AstFactory.integer(42))]))));
+  }
+
+  void test_visitFunctionDeclaration_local_expressionBody() {
+    FunctionDeclaration f = AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.expressionFunctionBody(AstFactory.integer(1))));
+    FunctionDeclarationStatement fStatement = new FunctionDeclarationStatement(f);
+    _assertSource("main() {f() => 1; 2;}", AstFactory.functionDeclaration(null, null, "main", AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.blockFunctionBody2([
+        fStatement,
+        AstFactory.expressionStatement(AstFactory.integer(2))]))));
+  }
+
   void test_visitFunctionDeclaration_normal() {
     _assertSource("f() {}", AstFactory.functionDeclaration(null, null, "f", AstFactory.functionExpression()));
   }
@@ -2221,7 +2237,7 @@
   }
 
   void test_visitFunctionDeclarationStatement() {
-    _assertSource("f() {};", AstFactory.functionDeclarationStatement(null, null, "f", AstFactory.functionExpression()));
+    _assertSource("f() {}", AstFactory.functionDeclarationStatement(null, null, "f", AstFactory.functionExpression()));
   }
 
   void test_visitFunctionExpression() {
@@ -3386,6 +3402,14 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionDeclaration_getter);
       });
+      _ut.test('test_visitFunctionDeclaration_local_blockBody', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionDeclaration_local_blockBody);
+      });
+      _ut.test('test_visitFunctionDeclaration_local_expressionBody', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitFunctionDeclaration_local_expressionBody);
+      });
       _ut.test('test_visitFunctionDeclaration_normal', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitFunctionDeclaration_normal);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index d0181b3..62abc48 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -3496,15 +3496,14 @@
   }
 
   void test_substitute_equal() {
-    ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    TypeParameterElementImpl parameterElement = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
-    InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
-    TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(parameterElement);
-    type.typeArguments = <DartType> [parameter];
+    ClassElement classAE = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeAE = classAE.type;
     InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
-    InterfaceType result = type.substitute2(<DartType> [argumentType], <DartType> [parameter]);
-    JUnitTestCase.assertEquals(classA, result.element);
-    List<DartType> resultArguments = result.typeArguments;
+    List<DartType> args = [argumentType];
+    List<DartType> params = [classAE.typeParameters[0].type];
+    InterfaceType typeAESubbed = typeAE.substitute2(args, params);
+    JUnitTestCase.assertEquals(classAE, typeAESubbed.element);
+    List<DartType> resultArguments = typeAESubbed.typeArguments;
     EngineTestCase.assertLength(1, resultArguments);
     JUnitTestCase.assertEquals(argumentType, resultArguments[0]);
   }
@@ -3521,6 +3520,7 @@
   }
 
   void test_substitute_notEqual() {
+    // The [test_substitute_equals] above has a slightly higher level implementation.
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     TypeParameterElementImpl parameterElement = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
@@ -4373,6 +4373,297 @@
   }
 }
 
+class UnionTypeImplTest extends EngineTestCase {
+  ClassElement _classA;
+
+  InterfaceType _typeA;
+
+  ClassElement _classB;
+
+  InterfaceType _typeB;
+
+  DartType _uA;
+
+  DartType _uB;
+
+  DartType _uAB;
+
+  DartType _uBA;
+
+  List<DartType> _us;
+
+  void test_emptyUnionsNotAllowed() {
+    try {
+      UnionTypeImpl.union([]);
+    } on IllegalArgumentException catch (e) {
+      return;
+    }
+    JUnitTestCase.fail("Expected illegal argument exception.");
+  }
+
+  void test_equality_beingASubtypeOfAnElementIsNotSufficient() {
+    // Non-equal if some elements are different
+    JUnitTestCase.assertFalse(_uAB == _uA);
+  }
+
+  void test_equality_insertionOrderDoesntMatter() {
+    // Insertion order doesn't matter, only sets of elements
+    JUnitTestCase.assertTrue(_uAB == _uBA);
+    JUnitTestCase.assertTrue(_uBA == _uAB);
+  }
+
+  void test_equality_reflexivity() {
+    for (DartType u in _us) {
+      JUnitTestCase.assertTrue(u == u);
+    }
+  }
+
+  void test_equality_singletonsCollapse() {
+    JUnitTestCase.assertTrue(_typeA == _uA);
+    JUnitTestCase.assertTrue(_uA == _typeA);
+  }
+
+  void test_isMoreSpecificThan_allElementsOnLHSAreSubtypesOfSomeElementOnRHS() {
+    // Unions are subtypes when all elements are subtypes
+    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_uA));
+    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_typeA));
+  }
+
+  void test_isMoreSpecificThan_element() {
+    // Elements of union are sub types
+    JUnitTestCase.assertTrue(_typeA.isMoreSpecificThan(_uAB));
+    JUnitTestCase.assertTrue(_typeB.isMoreSpecificThan(_uAB));
+  }
+
+  void test_isMoreSpecificThan_notSubtypeOfAnyElement() {
+    // Types that are not subtypes of elements are not subtypes
+    JUnitTestCase.assertFalse(_typeA.isMoreSpecificThan(_uB));
+  }
+
+  void test_isMoreSpecificThan_reflexivity() {
+    for (DartType u in _us) {
+      JUnitTestCase.assertTrue(u.isMoreSpecificThan(u));
+    }
+  }
+
+  void test_isMoreSpecificThan_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
+    // Unions are not subtypes when some element is not a subtype
+    JUnitTestCase.assertFalse(_uAB.isMoreSpecificThan(_uB));
+    JUnitTestCase.assertFalse(_uAB.isMoreSpecificThan(_typeB));
+  }
+
+  void test_isMoreSpecificThan_subtypeOfSomeElement() {
+    // Subtypes of elements are sub types
+    JUnitTestCase.assertTrue(_typeB.isMoreSpecificThan(_uA));
+  }
+
+  void test_isSubtypeOf_allElementsOnLHSAreSubtypesOfSomeElementOnRHS() {
+    // Unions are subtypes when all elements are subtypes
+    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_uA));
+    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_typeA));
+  }
+
+  void test_isSubtypeOf_element() {
+    // Elements of union are sub types
+    JUnitTestCase.assertTrue(_typeA.isSubtypeOf(_uAB));
+    JUnitTestCase.assertTrue(_typeB.isSubtypeOf(_uAB));
+  }
+
+  void test_isSubtypeOf_notSubtypeOfAnyElement() {
+    // Types that are not subtypes of elements are not subtypes
+    JUnitTestCase.assertFalse(_typeA.isSubtypeOf(_uB));
+  }
+
+  void test_isSubtypeOf_reflexivity() {
+    for (DartType u in _us) {
+      JUnitTestCase.assertTrue(u.isSubtypeOf(u));
+    }
+  }
+
+  void test_isSubtypeOf_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
+    // Unions are not subtypes when some element is not a subtype
+    JUnitTestCase.assertFalse(_uAB.isSubtypeOf(_uB));
+    JUnitTestCase.assertFalse(_uAB.isSubtypeOf(_typeB));
+  }
+
+  void test_isSubtypeOf_subtypeOfSomeElement() {
+    // Subtypes of elements are sub types
+    JUnitTestCase.assertTrue(_typeB.isSubtypeOf(_uA));
+  }
+
+  void test_nestedUnionsCollapse() {
+    UnionType u = UnionTypeImpl.union([_uAB, _typeA]) as UnionType;
+    for (DartType t in u.elements) {
+      if (t is UnionType) {
+        JUnitTestCase.fail("Expected only non-union types but found ${t}!");
+      }
+    }
+  }
+
+  void test_noLossage() {
+    UnionType u = UnionTypeImpl.union([_typeA, _typeB, _typeB, _typeA, _typeB, _typeB]) as UnionType;
+    Set<DartType> elements = u.elements;
+    JUnitTestCase.assertTrue(elements.contains(_typeA));
+    JUnitTestCase.assertTrue(elements.contains(_typeB));
+    JUnitTestCase.assertTrue(elements.length == 2);
+  }
+
+  void test_substitute() {
+    // Based on [InterfaceTypeImplTest.test_substitute_equal].
+    ClassElement classAE = ElementFactory.classElement2("A", ["E"]);
+    InterfaceType typeAE = classAE.type;
+    List<DartType> args = [_typeB];
+    List<DartType> params = [classAE.typeParameters[0].type];
+    DartType typeAESubbed = typeAE.substitute2(args, params);
+    JUnitTestCase.assertFalse(typeAE == typeAESubbed);
+    JUnitTestCase.assertEquals(UnionTypeImpl.union([_typeA, typeAE]).substitute2(args, params), UnionTypeImpl.union([_typeA, typeAESubbed]));
+  }
+
+  void test_toString_pair() {
+    String s = _uAB.toString();
+    JUnitTestCase.assertTrue(s == "{A,B}" || s == "{B,A}");
+    JUnitTestCase.assertEquals(s, _uAB.displayName);
+  }
+
+  void test_toString_singleton() {
+    // Singleton unions collapse to the the single type.
+    JUnitTestCase.assertEquals("A", _uA.toString());
+  }
+
+  void test_unionTypeIsLessSpecificThan_function() {
+    // Based on [FunctionTypeImplTest.test_isAssignableTo_normalAndPositionalArgs].
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    DartType uAT = UnionTypeImpl.union([_uA, t]);
+    JUnitTestCase.assertTrue(t.isMoreSpecificThan(uAT));
+    JUnitTestCase.assertFalse(t.isMoreSpecificThan(_uAB));
+  }
+
+  void test_unionTypeIsSuperTypeOf_function() {
+    // Based on [FunctionTypeImplTest.test_isAssignableTo_normalAndPositionalArgs].
+    ClassElement a = ElementFactory.classElement2("A", []);
+    FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
+    DartType uAT = UnionTypeImpl.union([_uA, t]);
+    JUnitTestCase.assertTrue(t.isSubtypeOf(uAT));
+    JUnitTestCase.assertFalse(t.isSubtypeOf(_uAB));
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    _classA = ElementFactory.classElement2("A", []);
+    _typeA = _classA.type;
+    _classB = ElementFactory.classElement("B", _typeA, []);
+    _typeB = _classB.type;
+    _uA = UnionTypeImpl.union([_typeA]);
+    _uB = UnionTypeImpl.union([_typeB]);
+    _uAB = UnionTypeImpl.union([_typeA, _typeB]);
+    _uBA = UnionTypeImpl.union([_typeB, _typeA]);
+    _us = <DartType> [_uA, _uB, _uAB, _uBA];
+  }
+
+  static dartSuite() {
+    _ut.group('UnionTypeImplTest', () {
+      _ut.test('test_emptyUnionsNotAllowed', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_emptyUnionsNotAllowed);
+      });
+      _ut.test('test_equality_beingASubtypeOfAnElementIsNotSufficient', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_equality_beingASubtypeOfAnElementIsNotSufficient);
+      });
+      _ut.test('test_equality_insertionOrderDoesntMatter', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_equality_insertionOrderDoesntMatter);
+      });
+      _ut.test('test_equality_reflexivity', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_equality_reflexivity);
+      });
+      _ut.test('test_equality_singletonsCollapse', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_equality_singletonsCollapse);
+      });
+      _ut.test('test_isMoreSpecificThan_allElementsOnLHSAreSubtypesOfSomeElementOnRHS', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_allElementsOnLHSAreSubtypesOfSomeElementOnRHS);
+      });
+      _ut.test('test_isMoreSpecificThan_element', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_element);
+      });
+      _ut.test('test_isMoreSpecificThan_notSubtypeOfAnyElement', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_notSubtypeOfAnyElement);
+      });
+      _ut.test('test_isMoreSpecificThan_reflexivity', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_reflexivity);
+      });
+      _ut.test('test_isMoreSpecificThan_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS);
+      });
+      _ut.test('test_isMoreSpecificThan_subtypeOfSomeElement', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_subtypeOfSomeElement);
+      });
+      _ut.test('test_isSubtypeOf_allElementsOnLHSAreSubtypesOfSomeElementOnRHS', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_allElementsOnLHSAreSubtypesOfSomeElementOnRHS);
+      });
+      _ut.test('test_isSubtypeOf_element', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_element);
+      });
+      _ut.test('test_isSubtypeOf_notSubtypeOfAnyElement', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_notSubtypeOfAnyElement);
+      });
+      _ut.test('test_isSubtypeOf_reflexivity', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_reflexivity);
+      });
+      _ut.test('test_isSubtypeOf_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS);
+      });
+      _ut.test('test_isSubtypeOf_subtypeOfSomeElement', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_subtypeOfSomeElement);
+      });
+      _ut.test('test_nestedUnionsCollapse', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_nestedUnionsCollapse);
+      });
+      _ut.test('test_noLossage', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_noLossage);
+      });
+      _ut.test('test_substitute', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_substitute);
+      });
+      _ut.test('test_toString_pair', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_toString_pair);
+      });
+      _ut.test('test_toString_singleton', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_toString_singleton);
+      });
+      _ut.test('test_unionTypeIsLessSpecificThan_function', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_unionTypeIsLessSpecificThan_function);
+      });
+      _ut.test('test_unionTypeIsSuperTypeOf_function', () {
+        final __test = new UnionTypeImplTest();
+        runJUnitTest(__test, __test.test_unionTypeIsSuperTypeOf_function);
+      });
+    });
+  }
+}
+
 class VoidTypeImplTest extends EngineTestCase {
   /**
    * Reference {code VoidTypeImpl.getInstance()}.
@@ -4449,6 +4740,7 @@
   FunctionTypeImplTest.dartSuite();
   InterfaceTypeImplTest.dartSuite();
   TypeParameterTypeImplTest.dartSuite();
+  UnionTypeImplTest.dartSuite();
   VoidTypeImplTest.dartSuite();
   ClassElementImplTest.dartSuite();
   CompilationUnitElementImplTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index a63378b..3fc3472 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -2027,156 +2027,6 @@
 //     throw new AnalysisException("Forced exception");
 //   }
 // }
-// class BuildDartElementModelTaskTest extends EngineTestCase {
-//   void test_accept() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, new List<ResolvableLibrary>());
-//     JUnitTestCase.assertTrue(task.accept(new TestTaskVisitor_BuildDartElementModelTaskTest_test_accept()));
-//   }
-//   void test_getErrors() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, new List<ResolvableLibrary>());
-//     EngineTestCase.assertLength(0, task.errorListener.errors);
-//   }
-//   void test_getLibrariesInCycle() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     List<ResolvableLibrary> librariesInCycle = new List<ResolvableLibrary>();
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, librariesInCycle);
-//     JUnitTestCase.assertSame(librariesInCycle, task.librariesInCycle);
-//   }
-//   void test_perform_multiple() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     ResolvableLibrary lib3 = _createLibrary(<ResolvableCompilationUnit> [_createUnit(context, "/lib3.dart", EngineTestCase.createSource([
-//         "library lib3;",
-//         "import 'lib1.dart';",
-//         "class C { A a; }"]))], null);
-//     ResolvableLibrary lib2 = _createLibrary(<ResolvableCompilationUnit> [_createUnit(context, "/lib2.dart", EngineTestCase.createSource([
-//         "library lib2;",
-//         "import 'lib3.dart';",
-//         "class B { C c; }"]))], <ResolvableLibrary> [_createCoreLibrary(context), lib3]);
-//     ResolvableLibrary lib1 = _createLibrary(<ResolvableCompilationUnit> [_createUnit(context, "/lib1.dart", EngineTestCase.createSource([
-//         "library lib1;",
-//         "import 'lib2.dart';",
-//         "class A { B b; }"]))], <ResolvableLibrary> [_createCoreLibrary(context), lib2]);
-//     lib3.importedLibraries = <ResolvableLibrary> [_createCoreLibrary(context), lib1];
-//     List<ResolvableLibrary> librariesInCycle = new List<ResolvableLibrary>();
-//     librariesInCycle.add(lib1);
-//     librariesInCycle.add(lib2);
-//     librariesInCycle.add(lib3);
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, librariesInCycle);
-//     task.perform(new TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_multiple());
-//   }
-//   void test_perform_single_noParts() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     ResolvableLibrary lib1 = _createLibrary(<ResolvableCompilationUnit> [_createUnit(context, "/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B extends A {}"]))], <ResolvableLibrary> [_createCoreLibrary(context)]);
-//     List<ResolvableLibrary> librariesInCycle = new List<ResolvableLibrary>();
-//     librariesInCycle.add(lib1);
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, librariesInCycle);
-//     task.perform(new TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_single_noParts());
-//   }
-//   void test_perform_single_parts() {
-//     AnalysisContextImpl context = AnalysisContextFactory.contextWithCore();
-//     ResolvableLibrary lib1 = _createLibrary(<ResolvableCompilationUnit> [
-//         _createUnit(context, "/lib1.dart", EngineTestCase.createSource([
-//         "library lib1;",
-//         "part 'part1-1.dart';",
-//         "part 'part1-2.dart';",
-//         "class A {}",
-//         "class B extends A {}"])),
-//         _createUnit(context, "/part1-1.dart", EngineTestCase.createSource(["part of lib1;", "class C extends B {}"])),
-//         _createUnit(context, "/part1-2.dart", EngineTestCase.createSource(["part of lib1;", "class D implements A {}"]))], <ResolvableLibrary> [_createCoreLibrary(context)]);
-//     List<ResolvableLibrary> librariesInCycle = new List<ResolvableLibrary>();
-//     librariesInCycle.add(lib1);
-//     BuildDartElementModelTask task = new BuildDartElementModelTask(context, null, librariesInCycle);
-//     task.perform(new TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_single_parts());
-//   }
-//   /**
-//    * Create a resolvable library representing the core library.
-//    *
-//    * @param context the context used to build the library
-//    * @return the resolvable library representing the core library
-//    * @throws AnalysisException if the core library has not been resolved
-//    */
-//   ResolvableLibrary _createCoreLibrary(AnalysisContextImpl context) {
-//     Source coreSource = context.sourceFactory.forUri(DartSdk.DART_CORE);
-//     ResolvableLibrary coreLibrary = new ResolvableLibrary(coreSource);
-//     coreLibrary.libraryElement = context.computeLibraryElement(coreSource) as LibraryElementImpl;
-//     return coreLibrary;
-//   }
-//   /**
-//    * Create a resolvable library with the given compilation units and imports.
-//    *
-//    * @param units the compilation units in the library, with the defining compilation unit first
-//    * @param imports the libraries imported by the library (including the core library)
-//    * @return the resolvable library that was created
-//    */
-//   ResolvableLibrary _createLibrary(List<ResolvableCompilationUnit> units, List<ResolvableLibrary> imports) {
-//     ResolvableLibrary library = new ResolvableLibrary(units[0].source);
-//     library.importedLibraries = imports;
-//     library.resolvableCompilationUnits = units;
-//     return library;
-//   }
-//   /**
-//    * Return a resolvable compilation unit representing the file with the given name and contents.
-//    *
-//    * @param fileName the name of the file being represented
-//    * @param contents the contents of the file being represented
-//    * @return a resolvable compilation unit representing the file
-//    */
-//   ResolvableCompilationUnit _createUnit(AnalysisContextImpl context, String fileName, String contents) {
-//     Source source = new FileBasedSource.con1(FileUtilities2.createFile(fileName));
-//     context.setContents(source, contents);
-//     return new ResolvableCompilationUnit.con2(source.modificationStamp, _parse(context, source, contents), source);
-//   }
-//   /**
-//    * Return the result of parsing the given source.
-//    *
-//    * @param source the source being parsed
-//    * @param contents the contents of the source
-//    * @return the result of parsing the given source
-//    */
-//   CompilationUnit _parse(AnalysisContextImpl context, Source source, String contents) {
-//     GatheringErrorListener errorListener = new GatheringErrorListener();
-//     Scanner scanner = new Scanner(source, new CharSequenceReader(contents), errorListener);
-//     Parser parser = new Parser(source, errorListener);
-//     CompilationUnit unit = parser.parseCompilationUnit(scanner.tokenize());
-//     for (Directive directive in unit.directives) {
-//       if (directive is UriBasedDirective) {
-//         UriBasedDirective uriDirective = directive as UriBasedDirective;
-//         ParseDartTask.resolveDirective(context, source, uriDirective, errorListener);
-//       }
-//     }
-//     return unit;
-//   }
-//   static dartSuite() {
-//     _ut.group('BuildDartElementModelTaskTest', () {
-//       _ut.test('test_accept', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_accept);
-//       });
-//       _ut.test('test_getErrors', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_getErrors);
-//       });
-//       _ut.test('test_getLibrariesInCycle', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_getLibrariesInCycle);
-//       });
-//       _ut.test('test_perform_multiple', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_perform_multiple);
-//       });
-//       _ut.test('test_perform_single_noParts', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_perform_single_noParts);
-//       });
-//       _ut.test('test_perform_single_parts', () {
-//         final __test = new BuildDartElementModelTaskTest();
-//         runJUnitTest(__test, __test.test_perform_single_parts);
-//       });
-//     });
-//   }
-// }
 // class CacheRetentionPolicy_AnalysisCacheTest_test_setMaxCacheSize implements CacheRetentionPolicy {
 //   @override
 //   RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) => RetentionPriority.LOW;
@@ -2203,8 +2053,6 @@
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SCAN_ERRORS));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SOURCE_KIND));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.TOKEN_STREAM));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, librarySource));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILT_UNIT, librarySource));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.HINTS, librarySource));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
@@ -2216,11 +2064,10 @@
 //     EngineTestCase.assertLength(0, entry.allErrors);
 //     entry.setValue(DartEntry.SCAN_ERRORS, <AnalysisError> [new AnalysisError.con1(source, ScannerErrorCode.UNTERMINATED_STRING_LITERAL, [])]);
 //     entry.setValue(DartEntry.PARSE_ERRORS, <AnalysisError> [new AnalysisError.con1(source, ParserErrorCode.ABSTRACT_CLASS_MEMBER, [])]);
-//     entry.setValueInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source, <AnalysisError> [new AnalysisError.con1(source, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, [])]);
 //     entry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, source, <AnalysisError> [new AnalysisError.con1(source, CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, [])]);
 //     entry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, source, <AnalysisError> [new AnalysisError.con1(source, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, [])]);
 //     entry.setValueInLibrary(DartEntry.HINTS, source, <AnalysisError> [new AnalysisError.con1(source, HintCode.DEAD_CODE, [])]);
-//     EngineTestCase.assertLength(6, entry.allErrors);
+//     EngineTestCase.assertLength(5, entry.allErrors);
 //   }
 //   void test_getResolvableCompilationUnit_none() {
 //     DartEntryImpl entry = new DartEntryImpl();
@@ -2297,14 +2144,6 @@
 //     JUnitTestCase.assertEquals(partUri, resultPartDirective.uriContent);
 //     JUnitTestCase.assertSame(partSource, resultPartDirective.source);
 //   }
-//   void test_getState_invalid_buildElementErrors() {
-//     DartEntryImpl entry = new DartEntryImpl();
-//     try {
-//       entry.getState(DartEntry.BUILD_ELEMENT_ERRORS);
-//       JUnitTestCase.fail("Expected IllegalArgumentException for BUILD_ELEMENT_ERRORS");
-//     } on IllegalArgumentException catch (exception) {
-//     }
-//   }
 //   void test_getState_invalid_resolutionErrors() {
 //     DartEntryImpl entry = new DartEntryImpl();
 //     try {
@@ -2342,14 +2181,6 @@
 //     value = entry.getValue(DartEntry.CONTAINING_LIBRARIES);
 //     EngineTestCase.assertLength(0, value);
 //   }
-//   void test_getValue_invalid_buildElementErrors() {
-//     DartEntryImpl entry = new DartEntryImpl();
-//     try {
-//       entry.getValue(DartEntry.BUILD_ELEMENT_ERRORS);
-//       JUnitTestCase.fail("Expected IllegalArgumentException for BUILD_ELEMENT_ERRORS");
-//     } on IllegalArgumentException catch (exception) {
-//     }
-//   }
 //   void test_getValue_invalid_resolutionErrors() {
 //     DartEntryImpl entry = new DartEntryImpl();
 //     try {
@@ -2409,7 +2240,6 @@
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.PARSED_UNIT));
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE));
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.SOURCE_KIND));
-//     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.BUILD_ELEMENT_ERRORS));
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS));
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.RESOLVED_UNIT));
 //     JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS));
@@ -2428,7 +2258,6 @@
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.PARSED_UNIT));
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE));
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.SOURCE_KIND));
-//     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.BUILD_ELEMENT_ERRORS));
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS));
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.RESOLVED_UNIT));
 //     JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS));
@@ -2525,8 +2354,6 @@
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SCAN_ERRORS));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SOURCE_KIND));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.TOKEN_STREAM));
-//     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
@@ -2571,8 +2398,6 @@
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SCAN_ERRORS));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SOURCE_KIND));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.TOKEN_STREAM));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
@@ -2643,10 +2468,6 @@
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SCAN_ERRORS));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SOURCE_KIND));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.TOKEN_STREAM));
-//     // The following lines are commented out because we don't currently have any way of setting the
-//     // state for data associated with a library we don't know anything about.
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
@@ -2698,8 +2519,6 @@
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SCAN_ERRORS));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.SOURCE_KIND));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getState(DartEntry.TOKEN_STREAM));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILD_ELEMENT_ERRORS, source));
-//     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
 //     JUnitTestCase.assertSame(CacheState.ERROR, entry.getStateInLibrary(DartEntry.HINTS, source));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
 //     JUnitTestCase.assertSame(CacheState.INVALID, entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
@@ -2760,9 +2579,6 @@
 //     entry2.removeResolution(libSrc2);
 //     EngineTestCase.assertExactElementsInArray(entry2.allErrors, []);
 //   }
-//   void test_setState_buildElementErrors() {
-//     state3 = DartEntry.BUILD_ELEMENT_ERRORS;
-//   }
 //   void test_setState_element() {
 //     state2 = DartEntry.ELEMENT;
 //   }
@@ -2778,14 +2594,6 @@
 //   void test_setState_includedParts() {
 //     state2 = DartEntry.INCLUDED_PARTS;
 //   }
-//   void test_setState_invalid_buildElementErrors() {
-//     DartEntryImpl entry = new DartEntryImpl();
-//     try {
-//       entry.setState(DartEntry.BUILD_ELEMENT_ERRORS, CacheState.FLUSHED);
-//       JUnitTestCase.fail("Expected IllegalArgumentException for BUILD_ELEMENT_ERRORS");
-//     } on IllegalArgumentException catch (exception) {
-//     }
-//   }
 //   void test_setState_invalid_element() {
 //     DartEntryImpl entry = new DartEntryImpl();
 //     try {
@@ -2854,9 +2662,6 @@
 //   void test_setState_verificationErrors() {
 //     state3 = DartEntry.VERIFICATION_ERRORS;
 //   }
-//   void test_setValue_buildElementErrors() {
-//     _setValue3(DartEntry.BUILD_ELEMENT_ERRORS, <AnalysisError> [new AnalysisError.con1(null, CompileTimeErrorCode.MIXIN_OF_NON_CLASS, [])]);
-//   }
 //   void test_setValue_element() {
 //     _setValue2(DartEntry.ELEMENT, new LibraryElementImpl.forNode(null, AstFactory.libraryIdentifier2(["lib"])));
 //   }
@@ -2992,10 +2797,6 @@
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_getStateInLibrary_invalid_element);
 //       });
-//       _ut.test('test_getState_invalid_buildElementErrors', () {
-//         final __test = new DartEntryImplTest();
-//         runJUnitTest(__test, __test.test_getState_invalid_buildElementErrors);
-//       });
 //       _ut.test('test_getState_invalid_resolutionErrors', () {
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_getState_invalid_resolutionErrors);
@@ -3016,10 +2817,6 @@
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_getValue_containingLibraries);
 //       });
-//       _ut.test('test_getValue_invalid_buildElementErrors', () {
-//         final __test = new DartEntryImplTest();
-//         runJUnitTest(__test, __test.test_getValue_invalid_buildElementErrors);
-//       });
 //       _ut.test('test_getValue_invalid_resolutionErrors', () {
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_getValue_invalid_resolutionErrors);
@@ -3120,10 +2917,6 @@
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_resolutionState);
 //       });
-//       _ut.test('test_setState_buildElementErrors', () {
-//         final __test = new DartEntryImplTest();
-//         runJUnitTest(__test, __test.test_setState_buildElementErrors);
-//       });
 //       _ut.test('test_setState_element', () {
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_setState_element);
@@ -3144,10 +2937,6 @@
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_setState_includedParts);
 //       });
-//       _ut.test('test_setState_invalid_buildElementErrors', () {
-//         final __test = new DartEntryImplTest();
-//         runJUnitTest(__test, __test.test_setState_invalid_buildElementErrors);
-//       });
 //       _ut.test('test_setState_invalid_element', () {
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_setState_invalid_element);
@@ -3212,10 +3001,6 @@
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_setState_verificationErrors);
 //       });
-//       _ut.test('test_setValue_buildElementErrors', () {
-//         final __test = new DartEntryImplTest();
-//         runJUnitTest(__test, __test.test_setValue_buildElementErrors);
-//       });
 //       _ut.test('test_setValue_element', () {
 //         final __test = new DartEntryImplTest();
 //         runJUnitTest(__test, __test.test_setValue_element);
@@ -5356,9 +5141,9 @@
 //     Source source = new TestSource.con1(FileUtilities2.createFile("/test.html"), content);
 //     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
 //     ParseHtmlTask parseTask = new ParseHtmlTask(context, source, modificationStamp, content);
-//     parseTask.perform(new TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid());
+//     parseTask.perform(new TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid_2());
 //     ResolveHtmlTask task = new ResolveHtmlTask(context, source, parseTask.modificationTime, parseTask.htmlUnit);
-//     task.perform(new TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid_2(modificationStamp, source));
+//     task.perform(new TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid(modificationStamp, source));
 //   }
 //   static dartSuite() {
 //     _ut.group('ResolveHtmlTaskTest', () {
@@ -5508,6 +5293,10 @@
 //  */
 // class TestAnalysisContext implements InternalAnalysisContext {
 //   @override
+//   void addListener(AnalysisListener listener) {
+//     JUnitTestCase.fail("Unexpected invocation of addListener");
+//   }
+//   @override
 //   void addSourceInfo(Source source, SourceEntry info) {
 //     JUnitTestCase.fail("Unexpected invocation of addSourceInfo");
 //   }
@@ -5771,6 +5560,10 @@
 //     JUnitTestCase.fail("Unexpected invocation of recordLibraryElements");
 //   }
 //   @override
+//   void removeListener(AnalysisListener listener) {
+//     JUnitTestCase.fail("Unexpected invocation of removeListener");
+//   }
+//   @override
 //   CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) {
 //     JUnitTestCase.fail("Unexpected invocation of resolveCompilationUnit");
 //     return null;
@@ -6369,11 +6162,6 @@
 //  */
 // class TestTaskVisitor<E> implements AnalysisTaskVisitor<E> {
 //   @override
-//   E visitBuildDartElementModelTask(BuildDartElementModelTask task) {
-//     JUnitTestCase.fail("Unexpectedly invoked visitBuildDartElementModelTask");
-//     return null;
-//   }
-//   @override
 //   E visitGenerateDartErrorsTask(GenerateDartErrorsTask task) {
 //     JUnitTestCase.fail("Unexpectedly invoked visitGenerateDartErrorsTask");
 //     return null;
@@ -6449,88 +6237,6 @@
 //     return null;
 //   }
 // }
-// class TestTaskVisitor_BuildDartElementModelTaskTest_test_accept extends TestTaskVisitor<Boolean> {
-//   @override
-//   bool visitBuildDartElementModelTask(BuildDartElementModelTask task) => true;
-// }
-// class TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_multiple extends TestTaskVisitor<Object> {
-//   @override
-//   Object visitBuildDartElementModelTask(BuildDartElementModelTask task) {
-//     CaughtException exception = task.exception;
-//     if (exception != null) {
-//       throw exception;
-//     }
-//     EngineTestCase.assertLength(0, task.errorListener.errors);
-//     List<ResolvableLibrary> librariesInCycle = task.librariesInCycle;
-//     EngineTestCase.assertSizeOfList(3, librariesInCycle);
-//     for (int i = 0; i < 3; i++) {
-//       ResolvableLibrary library = librariesInCycle[i];
-//       LibraryElementImpl libraryElement = library.libraryElement;
-//       JUnitTestCase.assertNotNull(libraryElement);
-//       CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-//       JUnitTestCase.assertNotNull(unitElement);
-//       List<ClassElement> types = unitElement.types;
-//       EngineTestCase.assertLength(1, types);
-//     }
-//     return null;
-//   }
-// }
-// class TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_single_noParts extends TestTaskVisitor<Object> {
-//   @override
-//   Object visitBuildDartElementModelTask(BuildDartElementModelTask task) {
-//     CaughtException exception = task.exception;
-//     if (exception != null) {
-//       throw exception;
-//     }
-//     EngineTestCase.assertLength(0, task.errorListener.errors);
-//     List<ResolvableLibrary> librariesInCycle = task.librariesInCycle;
-//     EngineTestCase.assertSizeOfList(1, librariesInCycle);
-//     ResolvableLibrary library = librariesInCycle[0];
-//     LibraryElementImpl libraryElement = library.libraryElement;
-//     JUnitTestCase.assertNotNull(libraryElement);
-//     CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
-//     JUnitTestCase.assertNotNull(unitElement);
-//     List<ClassElement> types = unitElement.types;
-//     EngineTestCase.assertLength(2, types);
-//     InterfaceType supertype = types[1].supertype;
-//     JUnitTestCase.assertNotNull(supertype);
-//     JUnitTestCase.assertSame(types[0], supertype.element);
-//     return null;
-//   }
-// }
-// class TestTaskVisitor_BuildDartElementModelTaskTest_test_perform_single_parts extends TestTaskVisitor<Object> {
-//   @override
-//   Object visitBuildDartElementModelTask(BuildDartElementModelTask task) {
-//     CaughtException exception = task.exception;
-//     if (exception != null) {
-//       throw exception;
-//     }
-//     EngineTestCase.assertLength(0, task.errorListener.errors);
-//     List<ResolvableLibrary> librariesInCycle = task.librariesInCycle;
-//     EngineTestCase.assertSizeOfList(1, librariesInCycle);
-//     ResolvableLibrary library = librariesInCycle[0];
-//     LibraryElementImpl libraryElement = library.libraryElement;
-//     JUnitTestCase.assertNotNull(libraryElement);
-//     CompilationUnitElement definingUnit = libraryElement.definingCompilationUnit;
-//     JUnitTestCase.assertNotNull(definingUnit);
-//     List<ClassElement> definingTypes = definingUnit.types;
-//     EngineTestCase.assertLength(2, definingTypes);
-//     List<CompilationUnitElement> parts = libraryElement.parts;
-//     JUnitTestCase.assertNotNull(parts);
-//     EngineTestCase.assertLength(2, parts);
-//     List<ClassElement> types = parts[0].types;
-//     EngineTestCase.assertLength(1, types);
-//     InterfaceType supertype = types[0].supertype;
-//     JUnitTestCase.assertNotNull(supertype);
-//     JUnitTestCase.assertSame(definingTypes[1], supertype.element);
-//     types = parts[1].types;
-//     EngineTestCase.assertLength(1, types);
-//     InterfaceType implementedType = types[0].interfaces[0];
-//     JUnitTestCase.assertNotNull(implementedType);
-//     JUnitTestCase.assertSame(definingTypes[0], implementedType.element);
-//     return null;
-//   }
-// }
 // class TestTaskVisitor_GenerateDartErrorsTaskTest_test_accept extends TestTaskVisitor<Boolean> {
 //   @override
 //   bool visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => true;
@@ -6791,13 +6497,9 @@
 //   }
 // }
 // class TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid extends TestTaskVisitor<Object> {
-//   @override
-//   Object visitParseHtmlTask(ParseHtmlTask task) => null;
-// }
-// class TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid_2 extends TestTaskVisitor<Object> {
 //   long modificationStamp;
 //   Source source;
-//   TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid_2(this.modificationStamp, this.source) : super();
+//   TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid(this.modificationStamp, this.source) : super();
 //   @override
 //   Object visitResolveHtmlTask(ResolveHtmlTask task) {
 //     CaughtException exception = task.exception;
@@ -6811,6 +6513,10 @@
 //     return null;
 //   }
 // }
+// class TestTaskVisitor_ResolveHtmlTaskTest_test_perform_valid_2 extends TestTaskVisitor<Object> {
+//   @override
+//   Object visitParseHtmlTask(ParseHtmlTask task) => null;
+// }
 // class TestTaskVisitor_ScanDartTaskTest_test_accept extends TestTaskVisitor<Boolean> {
 //   @override
 //   bool visitScanDartTask(ScanDartTask task) => true;
@@ -7046,7 +6752,6 @@
 //   InstrumentedAnalysisContextImplTest.dartSuite();
 //   WorkManagerTest.dartSuite();
 //   AnalysisTaskTest.dartSuite();
-//   BuildDartElementModelTaskTest.dartSuite();
 //   GenerateDartErrorsTaskTest.dartSuite();
 //   GenerateDartHintsTaskTest.dartSuite();
 //   GetContentTaskTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/java_io_test.dart b/pkg/analyzer/test/generated/java_io_test.dart
new file mode 100644
index 0000000..c8b881f
--- /dev/null
+++ b/pkg/analyzer/test/generated/java_io_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.java_io_test;
+
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart';
+import 'dart:io';
+
+main() {
+  group('JavaFile', () {
+    group('toURI', () {
+      test('forAbsolute', () {
+        var tempDir = Directory.systemTemp.createTempSync('java_io_test');
+        try {
+          String tempPath = normalize(absolute(tempDir.path));
+          String path = join(tempPath, 'foo.dart');
+          // we use an absolute path
+          expect(isAbsolute(path), isTrue);
+          // test that toURI() returns an absolute URI
+          Uri uri = new JavaFile(path).toURI();
+          expect(uri.isAbsolute, isTrue);
+          expect(uri.scheme, 'file');
+        } finally {
+          tempDir.deleteSync(recursive: true);
+        }
+      });
+      test('forRelative', () {
+        var tempDir = Directory.systemTemp.createTempSync('java_io_test');
+        try {
+          String tempPath = normalize(absolute(tempDir.path));
+          String path = join(tempPath, 'foo.dart');
+          expect(isAbsolute(path), isTrue);
+          // prepare a relative path
+          // We should not check that "relPath" is actually relative -
+          // it may be not on Windows, if "temp" is on other disk.
+          String relPath = relative(path);
+          // test that toURI() returns an absolute URI
+          Uri uri = new JavaFile(relPath).toURI();
+          expect(uri.isAbsolute, isTrue);
+          expect(uri.scheme, 'file');
+        } finally {
+          tempDir.deleteSync(recursive: true);
+        }
+      });
+    });
+  });
+}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 770b719..953dc32 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -3207,6 +3207,20 @@
   static bool parseFunctionBodies = true;
 
   /**
+   * Create a parser.
+   *
+   * @param listener the listener to be passed to the parser
+   * @return the parser that was created
+   */
+  static Parser createParser(GatheringErrorListener listener) {
+    Parser parser = new Parser(null, listener);
+    parser.parseAsync = true;
+    parser.parseDeferredLibraries = true;
+    parser.parseEnum = true;
+    return parser;
+  }
+
+  /**
    * Invoke a parse method in [Parser]. The method is assumed to have the given number and
    * type of parameters and will be invoked with the given arguments.
    *
@@ -3298,10 +3312,7 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
-    parser.parseAsync = true;
-    parser.parseDeferredLibraries = true;
-    parser.parseEnum = true;
+    Parser parser = createParser(listener);
     CompilationUnit unit = parser.parseCompilationUnit(token);
     JUnitTestCase.assertNotNull(unit);
     listener.assertErrorsWithCodes(errorCodes);
@@ -3322,7 +3333,7 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
+    Parser parser = createParser(listener);
     Expression expression = parser.parseExpression(token);
     JUnitTestCase.assertNotNull(expression);
     listener.assertErrorsWithCodes(errorCodes);
@@ -3343,7 +3354,7 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
+    Parser parser = createParser(listener);
     Statement statement = parser.parseStatement(token);
     JUnitTestCase.assertNotNull(statement);
     listener.assertErrorsWithCodes(errorCodes);
@@ -3366,7 +3377,7 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader(source), listener);
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
-    Parser parser = new Parser(null, listener);
+    Parser parser = createParser(listener);
     List<Statement> statements = parser.parseStatements(token);
     EngineTestCase.assertSizeOfList(expectedCount, statements);
     listener.assertErrorsWithCodes(errorCodes);
@@ -3399,7 +3410,7 @@
     //
     // Parse the source.
     //
-    Parser parser = new Parser(null, listener);
+    Parser parser = createParser(listener);
     parser.parseFunctionBodies = parseFunctionBodies;
     parser.parseDeferredLibraries = true;
     parser.parseAsync = true;
@@ -3835,6 +3846,108 @@
     JUnitTestCase.assertTrue(name.isSynthetic);
   }
 
+  void test_incomplete_topLevelVariable_const() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("const ", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
+    EngineTestCase.assertSizeOfList(1, variables);
+    SimpleIdentifier name = variables[0].name;
+    JUnitTestCase.assertTrue(name.isSynthetic);
+  }
+
+  void test_incomplete_topLevelVariable_final() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("final ", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
+    EngineTestCase.assertSizeOfList(1, variables);
+    SimpleIdentifier name = variables[0].name;
+    JUnitTestCase.assertTrue(name.isSynthetic);
+  }
+
+  void test_incomplete_topLevelVariable_var() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit("var ", [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember member = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
+    NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
+    EngineTestCase.assertSizeOfList(1, variables);
+    SimpleIdentifier name = variables[0].name;
+    JUnitTestCase.assertTrue(name.isSynthetic);
+  }
+
+  void test_incompleteField_const() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  const", "}"]), [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    EngineTestCase.assertSizeOfList(1, members);
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
+    JUnitTestCase.assertEquals(Keyword.CONST, (fieldList.keyword as KeywordToken).keyword);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    EngineTestCase.assertSizeOfList(1, fields);
+    VariableDeclaration field = fields[0];
+    JUnitTestCase.assertTrue(field.name.isSynthetic);
+  }
+
+  void test_incompleteField_final() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  final", "}"]), [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    EngineTestCase.assertSizeOfList(1, members);
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
+    JUnitTestCase.assertEquals(Keyword.FINAL, (fieldList.keyword as KeywordToken).keyword);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    EngineTestCase.assertSizeOfList(1, fields);
+    VariableDeclaration field = fields[0];
+    JUnitTestCase.assertTrue(field.name.isSynthetic);
+  }
+
+  void test_incompleteField_var() {
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  var", "}"]), [
+        ParserErrorCode.MISSING_IDENTIFIER,
+        ParserErrorCode.EXPECTED_TOKEN]);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(1, declarations);
+    CompilationUnitMember unitMember = declarations[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
+    EngineTestCase.assertSizeOfList(1, members);
+    ClassMember classMember = members[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
+    JUnitTestCase.assertEquals(Keyword.VAR, (fieldList.keyword as KeywordToken).keyword);
+    NodeList<VariableDeclaration> fields = fieldList.variables;
+    EngineTestCase.assertSizeOfList(1, fields);
+    VariableDeclaration field = fields[0];
+    JUnitTestCase.assertTrue(field.name.isSynthetic);
+  }
+
   void test_isExpression_noType() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Bar<T extends Foo> {m(x){if (x is ) return;if (x is !)}}", [
         ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -4289,10 +4402,34 @@
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_functionExpression_in_ConstructorFieldInitializer);
       });
+      _ut.test('test_incompleteField_const', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incompleteField_const);
+      });
+      _ut.test('test_incompleteField_final', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incompleteField_final);
+      });
+      _ut.test('test_incompleteField_var', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incompleteField_var);
+      });
       _ut.test('test_incomplete_topLevelVariable', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_incomplete_topLevelVariable);
       });
+      _ut.test('test_incomplete_topLevelVariable_const', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incomplete_topLevelVariable_const);
+      });
+      _ut.test('test_incomplete_topLevelVariable_final', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incomplete_topLevelVariable_final);
+      });
+      _ut.test('test_incomplete_topLevelVariable_var', () {
+        final __test = new RecoveryParserTest();
+        runJUnitTest(__test, __test.test_incomplete_topLevelVariable_var);
+      });
       _ut.test('test_isExpression_noType', () {
         final __test = new RecoveryParserTest();
         runJUnitTest(__test, __test.test_isExpression_noType);
@@ -5666,7 +5803,26 @@
     AwaitExpression expression = ParserTestCase.parse4("parseAwaitExpression", "await x;", []);
     JUnitTestCase.assertNotNull(expression.awaitKeyword);
     JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.semicolon);
+  }
+
+  void test_parseAwaitExpression_asStatement_inAsync() {
+    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], EngineTestCase.createSource(["m() async { await x; }"]));
+    FunctionBody body = method.body;
+    EngineTestCase.assertInstanceOf((obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    Statement statement = (body as BlockFunctionBody).block.statements[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is ExpressionStatement, ExpressionStatement, statement);
+    Expression expression = (statement as ExpressionStatement).expression;
+    EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression, AwaitExpression, expression);
+    JUnitTestCase.assertNotNull((expression as AwaitExpression).awaitKeyword);
+    JUnitTestCase.assertNotNull((expression as AwaitExpression).expression);
+  }
+
+  void test_parseAwaitExpression_asStatement_inSync() {
+    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], EngineTestCase.createSource(["m() { await x; }"]));
+    FunctionBody body = method.body;
+    EngineTestCase.assertInstanceOf((obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    Statement statement = (body as BlockFunctionBody).block.statements[0];
+    EngineTestCase.assertInstanceOf((obj) => obj is VariableDeclarationStatement, VariableDeclarationStatement, statement);
   }
 
   void test_parseBitwiseAndExpression_normal() {
@@ -10352,6 +10508,14 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseAwaitExpression);
       });
+      _ut.test('test_parseAwaitExpression_asStatement_inAsync', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseAwaitExpression_asStatement_inAsync);
+      });
+      _ut.test('test_parseAwaitExpression_asStatement_inSync', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseAwaitExpression_asStatement_inSync);
+      });
       _ut.test('test_parseBitwiseAndExpression_normal', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseBitwiseAndExpression_normal);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index d2c4991..abb8ce5 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -312,17 +312,6 @@
 }
 
 class CompileTimeErrorCodeTest extends ResolverTestCase {
-  void fail_accessPrivateEnumField() {
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "String name(E e) {",
-        "  return e._name;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD]);
-    verify([source]);
-  }
-
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -341,59 +330,6 @@
     verify([source]);
   }
 
-  void fail_extendsEnum() {
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends E {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_ENUM]);
-    verify([source]);
-  }
-
-  void fail_implementsEnum() {
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A implements E {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_ENUM]);
-    verify([source]);
-  }
-
-  void fail_instantiateEnum_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "E e(String name) {",
-        "  const E(0, name);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
-    verify([source]);
-  }
-
-  void fail_instantiateEnum_new() {
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "E e(String name) {",
-        "  new E(0, name);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
-    verify([source]);
-  }
-
-  void fail_missingEnumConstantInSwitch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE, TWO, THREE, FOUR }",
-        "bool odd(E e) {",
-        "  switch (e) {",
-        "    case ONE:",
-        "    case THREE: return true;",
-        "  }",
-        "  return false;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
-        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH]);
-    verify([source]);
-  }
-
   void fail_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -405,13 +341,6 @@
     verify([source]);
   }
 
-  void fail_mixinOfEnum() {
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A with E {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_ENUM]);
-    verify([source]);
-  }
-
   void fail_mixinOfNonClass() {
     // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
     Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
@@ -452,6 +381,19 @@
     verify([source]);
   }
 
+  void test_accessPrivateEnumField() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "String name(E e) {",
+        "  return e._name;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD]);
+  }
+
   void test_ambiguousExport() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -1533,6 +1475,16 @@
     verify([source]);
   }
 
+  void test_extendsEnum() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_ENUM]);
+    verify([source]);
+  }
+
   void test_extendsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
     resolve(source);
@@ -1917,6 +1869,16 @@
     verify([source]);
   }
 
+  void test_implementsEnum() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A implements E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_ENUM]);
+    verify([source]);
+  }
+
   void test_implementsNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
     resolve(source);
@@ -2250,6 +2212,34 @@
     verify([source]);
   }
 
+  void test_instantiateEnum_const() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "E e(String name) {",
+        "  return const E();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
+  void test_instantiateEnum_new() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "E e(String name) {",
+        "  return new E();",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
   void test_invalidAnnotation_getter() {
     Source source = addSource(EngineTestCase.createSource(["get V => 0;", "@V", "main() {", "}"]));
     resolve(source);
@@ -2587,6 +2577,26 @@
     verify([source]);
   }
 
+  void test_missingEnumConstantInSwitch() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE, TWO, THREE, FOUR }",
+        "bool odd(E e) {",
+        "  switch (e) {",
+        "    case E.ONE:",
+        "    case E.THREE: return true;",
+        "  }",
+        "  return false;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
+        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH]);
+    verify([source]);
+  }
+
   void test_mixinDeclaresConstructor_classDeclaration() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -2757,6 +2767,16 @@
     verify([source]);
   }
 
+  void test_mixinOfEnum() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends Object with E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_ENUM]);
+    verify([source]);
+  }
+
   void test_mixinOfNonClass_class() {
     Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
     resolve(source);
@@ -4207,6 +4227,10 @@
 
   static dartSuite() {
     _ut.group('CompileTimeErrorCodeTest', () {
+      _ut.test('test_accessPrivateEnumField', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_accessPrivateEnumField);
+      });
       _ut.test('test_ambiguousExport', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_ambiguousExport);
@@ -4639,6 +4663,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extendsDisallowedClass_class_num);
       });
+      _ut.test('test_extendsEnum', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_extendsEnum);
+      });
       _ut.test('test_extendsNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_extendsNonClass_class);
@@ -4803,6 +4831,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implementsDynamic);
       });
+      _ut.test('test_implementsEnum', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_implementsEnum);
+      });
       _ut.test('test_implementsNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_implementsNonClass_class);
@@ -4923,6 +4955,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_method);
       });
+      _ut.test('test_instantiateEnum_const', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instantiateEnum_const);
+      });
+      _ut.test('test_instantiateEnum_new', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instantiateEnum_new);
+      });
       _ut.test('test_invalidAnnotationFromDeferredLibrary', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary);
@@ -5091,6 +5131,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_methodAndGetterWithSameName);
       });
+      _ut.test('test_missingEnumConstantInSwitch', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_missingEnumConstantInSwitch);
+      });
       _ut.test('test_mixinDeclaresConstructor_classDeclaration', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinDeclaresConstructor_classDeclaration);
@@ -5175,6 +5219,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinOfDisallowedClass_class_num);
       });
+      _ut.test('test_mixinOfEnum', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_mixinOfEnum);
+      });
       _ut.test('test_mixinOfNonClass_class', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_mixinOfNonClass_class);
@@ -12548,6 +12596,43 @@
     verify([source]);
   }
 
+  void test_missingEnumConstantInSwitch_all() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { A, B, C }",
+        "",
+        "f(E e) {",
+        "  switch (e) {",
+        "    case E.A: break;",
+        "    case E.B: break;",
+        "    case E.C: break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  void test_missingEnumConstantInSwitch_default() {
+    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
+    analysisOptions.enableEnum = true;
+    resetWithOptions(analysisOptions);
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { A, B, C }",
+        "",
+        "f(E e) {",
+        "  switch (e) {",
+        "    case E.B: break;",
+        "    default: break;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_mixedReturnTypes_differentScopes() {
     Source source = addSource(EngineTestCase.createSource([
         "class C {",
@@ -13606,6 +13691,22 @@
     verify([source]);
   }
 
+  void test_returnOfInvalidType_async() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(analysisContext2.analysisOptions);
+    options.enableAsync = true;
+    resetWithOptions(options);
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:async';",
+        "class A {",
+        "  Future<int> m() async {",
+        "    return 0;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_returnOfInvalidType_dynamic() {
     Source source = addSource(EngineTestCase.createSource([
         "class TypeError {}",
@@ -15188,6 +15289,14 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter);
       });
+      _ut.test('test_missingEnumConstantInSwitch_all', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_missingEnumConstantInSwitch_all);
+      });
+      _ut.test('test_missingEnumConstantInSwitch_default', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_missingEnumConstantInSwitch_default);
+      });
       _ut.test('test_mixedReturnTypes_differentScopes', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_mixedReturnTypes_differentScopes);
@@ -15536,6 +15645,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnInGenerativeConstructor);
       });
+      _ut.test('test_returnOfInvalidType_async', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_returnOfInvalidType_async);
+      });
       _ut.test('test_returnOfInvalidType_dynamic', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_returnOfInvalidType_dynamic);
diff --git a/pkg/analyzer/test/options_test.dart b/pkg/analyzer/test/options_test.dart
index 96270a9..bb2ba2a 100644
--- a/pkg/analyzer/test/options_test.dart
+++ b/pkg/analyzer/test/options_test.dart
@@ -15,18 +15,22 @@
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', 'foo.dart']);
       expect(options, isNotNull);
-      expect(options.shouldBatch, isFalse);
-      expect(options.machineFormat, isFalse);
-      expect(options.displayVersion, isFalse);
+      expect(options.dartSdkPath, isNotNull);
       expect(options.disableHints, isFalse);
+      expect(options.displayVersion, isFalse);
+      expect(options.enableAsync, isFalse);
+      expect(options.enableEnum, isFalse);
       expect(options.ignoreUnrecognizedFlags, isFalse);
+      expect(options.log, isFalse);
+      expect(options.machineFormat, isFalse);
+      expect(options.packageRootPath, isNull);
       expect(options.perf, isFalse);
+      expect(options.shouldBatch, isFalse);
       expect(options.showPackageWarnings, isFalse);
       expect(options.showSdkWarnings, isFalse);
-      expect(options.warningsAreFatal, isFalse);
-      expect(options.dartSdkPath, isNotNull);
-      expect(options.log, isFalse);
       expect(options.sourceFiles, equals(['foo.dart']));
+      expect(options.warmPerf, isFalse);
+      expect(options.warningsAreFatal, isFalse);
     });
 
     test('batch', () {
@@ -42,6 +46,18 @@
       expect(options.definedVariables['bar'], isNull);
     });
 
+    test('enable async', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--enable-async', 'foo.dart']);
+      expect(options.enableAsync, isTrue);
+    });
+
+    test('enable enum', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--enable-enum', 'foo.dart']);
+      expect(options.enableEnum, isTrue);
+    });
+
     test('log', () {
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', '--log', 'foo.dart']);
diff --git a/pkg/analyzer/test/services/data/style_guide_tests.data b/pkg/analyzer/test/services/data/style_guide_tests.data
index d059c38..7c29e6c 100644
--- a/pkg/analyzer/test/services/data/style_guide_tests.data
+++ b/pkg/analyzer/test/services/data/style_guide_tests.data
@@ -182,6 +182,18 @@
         secondField = "another",
         thirdField = "last";
 }
+>>> DO format constructor initialization lists with each field on its own line.
+class MyClass {
+  MyClass(looooooooooooooonA, looooooooooooooonB) : super(looooooooooooooonA, looooooooooooooonB);
+  MyClass(looooooooooooooonA, looooooooooooooonB) : this(looooooooooooooonA, looooooooooooooonB);
+}
+<<<
+class MyClass {
+  MyClass(looooooooooooooonA, looooooooooooooonB)
+      : super(looooooooooooooonA, looooooooooooooonB);
+  MyClass(looooooooooooooonA, looooooooooooooonB)
+      : this(looooooooooooooonA, looooooooooooooonB);
+}
 >>> DO use a space after : in named parameters and named arguments.
 class ListBox {
   bool showScrollbars;
diff --git a/pkg/analyzer/test/services/data/wrap_tests.data b/pkg/analyzer/test/services/data/wrap_tests.data
index 9d21517..87bcfab 100644
--- a/pkg/analyzer/test/services/data/wrap_tests.data
+++ b/pkg/analyzer/test/services/data/wrap_tests.data
@@ -10,15 +10,75 @@
       c0123456789012345,
       d0123456789012345];
 }
->>> operators
+>>> assignment - initializer doesn't fit one line, wrap inside, keep name
 main() {
-  int result = a0123456789012345 * b0123456789012345 + c0123456789012345 * d0123456789012345;
+  result = myFunction(a0123456789012345 * b0123456789012345, c0123456789012345 * d0123456789012345);
+}
+<<<
+main() {
+  result = myFunction(
+      a0123456789012345 * b0123456789012345,
+      c0123456789012345 * d0123456789012345);
+}
+>>> assignment - initializer fits one line
+main() {
+  variableLoooooooooooooooong = functionLoooooooooooooooooooooooooooooooooooooong(1, 2, 3, 4);
+}
+<<<
+main() {
+  variableLoooooooooooooooong =
+      functionLoooooooooooooooooooooooooooooooooooooong(1, 2, 3, 4);
+}
+>>> assignment - initializer doesn't fit one line, name too long
+main() {
+  variableLooooooooooooooooooong = functionLoooooooooooooooooooooooooooooooooooong(a0123456789012345 * b0123456789012345, c0123456789012345 * d0123456789012345);
+}
+<<<
+main() {
+  variableLooooooooooooooooooong =
+      functionLoooooooooooooooooooooooooooooooooooong(
+          a0123456789012345 * b0123456789012345,
+          c0123456789012345 * d0123456789012345);
+}
+>>> variable declaration - initializer doesn't fit one line, wrap inside, keep name
+main() {
+  var result = myFunction(a0123456789012345 * b0123456789012345, c0123456789012345 * d0123456789012345);
+}
+<<<
+main() {
+  var result = myFunction(
+      a0123456789012345 * b0123456789012345,
+      c0123456789012345 * d0123456789012345);
+}
+>>> variable declaration - initializer fits one line
+main() {
+  var variableLoooooooooooooooong = functionLoooooooooooooooooooooooooooooooooooong(1, 2, 3, 4);
+}
+<<<
+main() {
+  var variableLoooooooooooooooong =
+      functionLoooooooooooooooooooooooooooooooooooong(1, 2, 3, 4);
+}
+>>> variable declaration - initializer doesn't fit one line, name too long
+main() {
+  var variableLoooooooooooooooong = functionLoooooooooooooooooooooooooooooooooooong(a0123456789012345 * b0123456789012345, c0123456789012345 * d0123456789012345);
+}
+<<<
+main() {
+  var variableLoooooooooooooooong =
+      functionLoooooooooooooooooooooooooooooooooooong(
+          a0123456789012345 * b0123456789012345,
+          c0123456789012345 * d0123456789012345);
+}
+>>> variable declaration - with binary expression
+main() {
+  int result = a01234567890123456789 * b01234567890123456789 + c01234567890123456789 * d01234567890123456789;
 }
 <<<
 main() {
   int result =
-      a0123456789012345 * b0123456789012345 +
-      c0123456789012345 * d0123456789012345;
+      a01234567890123456789 * b01234567890123456789 +
+      c01234567890123456789 * d01234567890123456789;
 }
 >>> arguments
 main() {
diff --git a/pkg/analyzer/test/services/formatter_test.dart b/pkg/analyzer/test/services/formatter_test.dart
index c4907ac..5416b24 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -1362,6 +1362,7 @@
     final SP_1 = new SpaceToken(1, breakWeight: DEFAULT_SPACE_WEIGHT);
     final SP_w1 = new SpaceToken(1, breakWeight: 1);
     final SP_w2 = new SpaceToken(1, breakWeight: 2);
+    final SP_i = new SpaceToken(1, breakWeight: SINGLE_SPACE_WEIGHT);
 
     // 'foo|1|bar|1|baz|1|foo|1|bar|1|baz'
     final LINE_1 = line(['foo', SP_1, 'bar', SP_1, 'baz', SP_1,
@@ -1437,6 +1438,31 @@
       expect(result, '111111 222222\n    333333 444444\n    555555 666666');
     });
 
+    test('printLine - use weight - initializer - success', () {
+      var source = line(
+                     ['111111', SP_i, '2222', SP_w1,
+                      '3333', SP_w1, '4444']);
+      var result = printLine(source, 20);
+      expect(result, '111111\n    2222 3333 4444');
+    });
+
+    test('printLine - use weight - initializer - rest too long', () {
+      var source = line(
+                     ['111', SP_i, '222', SP_w1,
+                      '333', SP_w1, '444', SP_w1, '555', SP_w1, '666']);
+      var result = printLine(source, 15);
+      expect(result, '111 222\n    333\n    444\n    555\n    666');
+    });
+
+    test('printLine - use weight - initializer - decl/rest too long', () {
+      var source = line(
+                     ['111', SP_i, '2222222222222', SP_w1,
+                      '333', SP_w1, '444', SP_w1, '555', SP_w1, '666']);
+      var result = printLine(source, 15);
+      expect(result, '111\n    2222222222222\n'
+          '        333\n        444\n        555\n        666');
+    });
+
     test('isWhitespace', () {
       expect(isWhitespace('foo'), false);
       expect(isWhitespace('  foo'), false);
@@ -1579,8 +1605,7 @@
       new FormatterOptions(codeTransforms: transforms)), equals(expected));
 
 
-runTests(testFileName, expectClause(input, output)) {
-
+runTests(testFileName, expectClause(String input, String output)) {
   var testIndex = 1;
   var testFile = new File(join(TEST_DATA_DIR, testFileName));
   var lines = testFile.readAsLinesSync();
diff --git a/pkg/analyzer2dart/bin/analyzer2dart.dart b/pkg/analyzer2dart/bin/analyzer2dart.dart
new file mode 100644
index 0000000..3f618f8
--- /dev/null
+++ b/pkg/analyzer2dart/bin/analyzer2dart.dart
@@ -0,0 +1,44 @@
+// 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.
+
+/** The entry point for the command-line version analyzer2dart. */
+library analyzer2dart.cmdline;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+import '../lib/src/closed_world.dart';
+import '../lib/src/driver.dart';
+
+void main(List<String> args) {
+  // TODO(paulberry): hacky
+  String path = args[0];
+
+  Driver analyzer2Dart = new Driver();
+
+  // Tell the analysis server about the root
+  Source source = analyzer2Dart.setRealRoot(path);
+
+  // Get the library element associated with the source.
+  FunctionElement entryPointElement = analyzer2Dart.resolveEntryPoint(source);
+
+  // TODO(brianwilkerson,paulberry,johnniwinther): Perform tree-growing by
+  // visiting the ast and feeding the dependencies into a work queue (enqueuer).
+  ClosedWorld world = analyzer2Dart.computeWorld(entryPointElement);
+
+  // TODO(brianwilkerson,paulberry,johnniwinther): Convert the ast into cps by
+  // visiting the ast and invoking the ir builder.
+  new CpsGeneratingVisitor();
+
+  // TODO(johnniwinther): Convert the analyzer element model into the dart2js
+  // element model to fit the needs of the cps encoding above.
+
+  // TODO(johnniwinther): Feed the cps ir into the new dart2dart backend to
+  // generate dart file(s).
+}
+
+class CpsGeneratingVisitor extends RecursiveAstVisitor {
+  // TODO(johnniwinther)
+}
diff --git a/pkg/analyzer2dart/lib/src/closed_world.dart b/pkg/analyzer2dart/lib/src/closed_world.dart
new file mode 100644
index 0000000..0694f5a
--- /dev/null
+++ b/pkg/analyzer2dart/lib/src/closed_world.dart
@@ -0,0 +1,19 @@
+// 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 analyzer2dart.closedWorld;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * Container for the elements and AST nodes which have been determined by
+ * tree shaking to be reachable by the program being compiled.
+ */
+class ClosedWorld {
+  // TODO(paulberry): is it a problem to hold on to all the AST's for the
+  // duration of tree shaking & CPS generation?
+  Map<Element, AstNode> elements = <Element, AstNode>{};
+  ClosedWorld();
+}
diff --git a/pkg/analyzer2dart/lib/src/driver.dart b/pkg/analyzer2dart/lib/src/driver.dart
new file mode 100644
index 0000000..a148680
--- /dev/null
+++ b/pkg/analyzer2dart/lib/src/driver.dart
@@ -0,0 +1,86 @@
+// 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 analyzer2dart.driver;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+import 'closed_world.dart';
+import 'tree_shaker.dart';
+
+/**
+ * Top level driver for Analyzer2Dart.
+ */
+class Driver {
+  AnalysisContext context;
+
+  Driver() : context = AnalysisEngine.instance.createAnalysisContext() {
+    // Set up the source factory.
+    // TODO(paulberry): do we want to use ExplicitPackageUriResolver?
+    List<UriResolver> uriResolvers = [
+        new FileUriResolver(),
+        new DartUriResolver(DirectoryBasedDartSdk.defaultSdk) /* ,
+        new PackageUriResolver(packagesDirectories) */
+    ];
+    context.sourceFactory = new SourceFactory(uriResolvers);
+  }
+
+  /**
+   * Compute the closed world that is reachable from an entry point.
+   */
+  ClosedWorld computeWorld(FunctionElement entryPointElement) {
+    TreeShaker treeShaker = new TreeShaker();
+    treeShaker.add(entryPointElement);
+    return treeShaker.shake(entryPointElement.context);
+  }
+
+  /**
+   * Given a source, resolve it and return its entry point.
+   */
+  FunctionElement resolveEntryPoint(Source source) {
+    // Get the library element associated with the source.
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+
+    // Get the resolved AST for main
+    FunctionElement entryPointElement = libraryElement.entryPoint;
+    if (entryPointElement == null) {
+      throw new Exception('No main()!');
+    }
+    return entryPointElement;
+  }
+
+  /**
+   * Add the given file as the root of analysis, and return the corresponding
+   * source.
+   */
+  Source setRealRoot(String path) {
+    // Tell the analysis server about the root
+    ChangeSet changeSet = new ChangeSet();
+    JavaFile javaFile = new JavaFile(path);
+    Source source = new FileBasedSource.con1(javaFile);
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Add the given file contents as the root of analysis.  For unit testing.
+   */
+  Source setFakeRoot(String contents) {
+    String path = 'root.dart';
+    // Tell the analysis server about the root
+    ChangeSet changeSet = new ChangeSet();
+    JavaFile javaFile = new JavaFile(path);
+    Source source = new FileBasedSource.con1(javaFile);
+    changeSet.addedSource(source);
+    changeSet.changedContent(source, contents);
+    context.applyChanges(changeSet);
+    return source;
+  }
+}
+
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
new file mode 100644
index 0000000..a36bbb5
--- /dev/null
+++ b/pkg/analyzer2dart/lib/src/tree_shaker.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 analyzer2dart.treeShaker;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+import 'closed_world.dart';
+
+class TreeShaker {
+  List<Element> _queue = <Element>[];
+  Set<Element> _alreadyEnqueued = new Set<Element>();
+  ClosedWorld _world = new ClosedWorld();
+
+  void add(Element e) {
+    if (!_alreadyEnqueued.contains(e)) {
+      _queue.add(e);
+      _alreadyEnqueued.add(e);
+    }
+  }
+
+  ClosedWorld shake(AnalysisContext context) {
+    while (_queue.isNotEmpty) {
+      Element e = _queue.removeAt(0);
+      print('Tree shaker handling $e');
+      CompilationUnit compilationUnit =
+          context.getResolvedCompilationUnit(e.source, e.library);
+      AstNode identifier =
+          new NodeLocator.con1(e.nameOffset).searchWithin(compilationUnit);
+      FunctionDeclaration declaration =
+          identifier.getAncestor((node) => node is FunctionDeclaration);
+      _world.elements[e] = declaration;
+      declaration.accept(new TreeShakingVisitor(this));
+    }
+    print('Tree shaking done');
+    return _world;
+  }
+}
+
+class TreeShakingVisitor extends RecursiveAstVisitor {
+  final TreeShaker treeShaker;
+
+  TreeShakingVisitor(this.treeShaker);
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    print('Visiting function ${node.name.name}');
+    super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    print('Visiting invocation of ${node.methodName.name}');
+    Element staticElement = node.methodName.staticElement;
+    if (staticElement != null) {
+      // TODO(paulberry): deal with the case where staticElement is
+      // not necessarily the exact target.  (Dart2js calls this a
+      // "dynamic invocation").  We need a notion of "selector".  Maybe
+      // we can use Dart2js selectors.
+      treeShaker.add(staticElement);
+    } else {
+      // TODO(paulberry): deal with this case.
+    }
+    super.visitMethodInvocation(node);
+  }
+
+}
+
diff --git a/pkg/analyzer2dart/test/driver_test.dart b/pkg/analyzer2dart/test/driver_test.dart
new file mode 100644
index 0000000..3942907
--- /dev/null
+++ b/pkg/analyzer2dart/test/driver_test.dart
@@ -0,0 +1,62 @@
+// 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:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+import 'package:analyzer/src/generated/ast.dart';
+
+import '../lib/src/closed_world.dart';
+import '../lib/src/driver.dart';
+
+main() {
+  test('setFakeRoot', () {
+    Driver driver = new Driver();
+    var contents = 'main() {}';
+    Source source = driver.setFakeRoot(contents);
+    expect(driver.context.getContents(source).data, equals(contents));
+  });
+
+  test('resolveEntryPoint', () {
+    Driver driver = new Driver();
+    String contents = 'main() {}';
+    FunctionElement element =
+        driver.resolveEntryPoint(driver.setFakeRoot(contents));
+    expect(element.name, equals('main'));
+  });
+
+  test('computeWorld', () {
+    Driver driver = new Driver();
+    String contents = '''
+main() {
+  foo();
+}
+
+foo() {
+}
+
+bar() {
+}
+''';
+    FunctionElement entryPoint = driver.resolveEntryPoint(driver.setFakeRoot(contents));
+    ClosedWorld world =
+        driver.computeWorld(entryPoint);
+    expect(world.elements, hasLength(2));
+    CompilationUnitElement compilationUnit = entryPoint.getAncestor((e) => e is CompilationUnitElement);
+    Map<String, FunctionElement> functions = {};
+    for (FunctionElement functionElement in compilationUnit.functions) {
+      functions[functionElement.name] = functionElement;
+    }
+    FunctionElement mainElement = functions['main'];
+    expect(world.elements.keys, contains(mainElement));
+    FunctionDeclaration mainAst = world.elements[mainElement];
+    expect(mainAst.element, equals(mainElement));
+    FunctionElement fooElement = functions['foo'];
+    expect(world.elements.keys, contains(fooElement));
+    FunctionDeclaration fooAst = world.elements[fooElement];
+    expect(fooAst.element, equals(fooElement));
+    FunctionElement barElement = functions['bar'];
+    expect(world.elements.keys, isNot(contains(functions[barElement])));
+  });
+}
diff --git a/pkg/args/CHANGELOG.md b/pkg/args/CHANGELOG.md
index ffe2109..ea32d89 100644
--- a/pkg/args/CHANGELOG.md
+++ b/pkg/args/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.12.0+2
+
+* Widen the version constraint on the `collection` package.
+
 ## 0.12.0+1
 
 * Remove the documentation link from the pubspec so this is linked to
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index 0f62010..9542666 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.12.0+1
+version: 0.12.0+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -7,7 +7,7 @@
  a set of options and values using GNU and POSIX style options.
 
 dependencies:
-  collection: ">=0.9.0 <0.10.0"
+  collection: ">=0.9.0 <2.0.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.11.0"
 environment:
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index fb0ab15..ddedbcc 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.15.0+1
+
+* Widen the version constraint on the `collection` package.
+
 ## 0.15.0
 
 * Fully switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index c8b3dc0..368c033 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,12 @@
 #
 # 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.15.0
+#
+# Additional note: a stable version of pub was erroneously released with a
+# constraint on barback that includes 0.15.1 before version 0.15.1 was actually
+# released. As such, next time the patch version is bumped it should skip 0.15.1
+# and go directly to 0.15.2.
+version: 0.15.0+1
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
@@ -26,7 +31,7 @@
   pool: ">=1.0.0 <2.0.0"
   source_span: ">=1.0.0 <2.0.0"
   stack_trace: ">=0.9.1 <2.0.0"
-  collection: ">=0.9.1 <0.10.0"
+  collection: ">=0.9.1 <2.0.0"
 dev_dependencies:
   scheduled_test: ">=0.9.0 <0.11.0"
   unittest: ">=0.9.0 <0.10.0"
diff --git a/pkg/collection/pubspec.yaml b/pkg/collection/pubspec.yaml
index 3d48447..9ec80f4 100644
--- a/pkg/collection/pubspec.yaml
+++ b/pkg/collection/pubspec.yaml
@@ -1,9 +1,9 @@
 name: collection
-version: 0.9.4
+version: 1.0.0
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=1.5.0 <2.0.0'
 dev_dependencies:
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index b7d9fff..7b7a70d 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -39,7 +39,7 @@
       compiler.hasCrashed ||
       compiler.compilerWasCancelled ||
       compiler.enqueuer.resolution.hasEnqueuedReflectiveElements ||
-      compiler.deferredLoadTask.splitProgram) {
+      compiler.deferredLoadTask.isProgramSplit) {
     if (compiler != null && compiler.hasIncrementalSupport) {
       print('***FLUSH***');
       if (compiler.hasCrashed) {
@@ -48,7 +48,7 @@
         print('Unable to reuse compiler due to cancel.');
       } else if (compiler.enqueuer.resolution.hasEnqueuedReflectiveElements) {
         print('Unable to reuse compiler due to dart:mirrors.');
-      } else if (compiler.deferredLoadTask.splitProgram) {
+      } else if (compiler.deferredLoadTask.isProgramSplit) {
         print('Unable to reuse compiler due to deferred loading.');
       } else {
         print('Unable to reuse compiler.');
diff --git a/pkg/http_base/CHANGELOG.md b/pkg/http_base/CHANGELOG.md
deleted file mode 100644
index e39f08d..0000000
--- a/pkg/http_base/CHANGELOG.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# 0.0.2
-
-* Renamed `Response.status` to `Response.statusCode`.
-
-* Renamed `Client` to `RequestHandler`.
-
-* Removed `HttpRequestHandler`.
-
-* Standardized doc comments.
-
-# 0.0.1
-
-* Initial release
diff --git a/pkg/http_base/LICENSE b/pkg/http_base/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/pkg/http_base/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-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/http_base/README.md b/pkg/http_base/README.md
deleted file mode 100644
index ca7b74b..0000000
--- a/pkg/http_base/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Common interfaces for dealing with HTTP, such as [Request] and [Response]
-classes.
diff --git a/pkg/http_base/lib/http_base.dart b/pkg/http_base/lib/http_base.dart
deleted file mode 100644
index 1cf4696..0000000
--- a/pkg/http_base/lib/http_base.dart
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library http_base;
-
-import 'dart:async';
-
-/// These headers should be ignored by [Client]s when making requests and when
-/// receiving headers from a HTTP server.
-const List<String> _TRANSPORT_HEADERS =
-    const ['connection', 'upgrade', 'keep-alive', 'transfer-encoding'];
-
-/// These headers cannot be folded into one header value via ',' joining.
-const List<String> _COOKIE_HEADERS = const ['set-cookie', 'cookie'];
-
-/// Representation of a set of HTTP headers.
-abstract class Headers {
-  /// Returns the names of all header fields.
-  Iterable<String> get names;
-
-  /// Returns `true` if a header field of the specified [name] exist.
-  bool contains(String name);
-
-  /// Returns the value for the header field named [name].
-  ///
-  /// The HTTP standard supports multiple values for each header field name.
-  /// Header fields with multiple values can be represented as a
-  /// comma-separated list. If a header has multiple values the returned string
-  /// is the comma-separated list of all these values.
-  ///
-  /// For header field-names which do not allow combining multiple values with
-  /// comma, this index operator will throw `ArgumentError`.
-  /// This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use
-  /// `getMultiple` method to iterate over the header values for these.
-  String operator [](String name);
-
-  /// Returns the values for the header field named [name].
-  ///
-  /// The order in which the values for the field name appear is the same
-  /// as the order in which they are to be send or was received.
-  ///
-  /// If there are no header values named [name] `null` will be returned.
-  Iterable<String> getMultiple(String name);
-}
-
-
-/// Representation of a HTTP request.
-abstract class Request {
-  /// Request method.
-  String get method;
-
-  /// Request url.
-  Uri get url;
-
-  /// Request headers.
-  Headers get headers;
-
-  /// Request body.
-  Stream<List<int>> read();
-}
-
-
-/// Representation of a HTTP response.
-abstract class Response {
-  /// Response status code.
-  int get statusCode;
-
-  /// Response headers.
-  Headers get headers;
-
-  /// Response body.
-  Stream<List<int>> read();
-}
-
-
-/// Function for performing an HTTP request.
-///
-/// The [RequestHandler] may use any transport mechanism it wants
-/// (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
-///
-/// [RequestHandler]s are composable. E.g. A [RequestHandler] may add an
-/// 'Authorization' header to [request] and forward to another [RequestHandler].
-///
-/// A [RequestHandler] may ignore connection specific headers in [request] and
-/// may not present them in the [Response] object.
-///
-/// Connection specific headers:
-///    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
-typedef Future<Response> RequestHandler(Request request);
-
-
-/// An implementation of [Headers].
-class HeadersImpl implements Headers {
-  static const HeadersImpl Empty = const HeadersImpl.empty();
-
-  final Map<String, List<String>> _m;
-
-  /// Constructs a [HeadersImpl] with no headers.
-  const HeadersImpl.empty() : _m = const {};
-
-  /// Constructs a new [HeaderImpl] initialized with [map].
-  ///
-  /// [map] must contain only String keys and either String or
-  /// Iterable<String> values.
-  HeadersImpl(Map map) : _m = {} {
-    _addDiff(map);
-  }
-
-  /// Makes a copy of this [HeadersImpl] and replaces all headers in present in
-  /// [differenceMap].
-  ///
-  /// [differenceMap] must contain only String keys and either String or
-  /// Iterable<String> values.
-  HeadersImpl replace(Map differenceMap) {
-    var headers = new HeadersImpl({});
-    _m.forEach((String key, List<String> value) {
-      headers._m[key] = value;
-    });
-    headers._addDiff(differenceMap);
-    return headers;
-  }
-
-  void _addDiff(Map diff) {
-    diff.forEach((String key, value) {
-      key = key.toLowerCase();
-
-      if (value == null) {
-        _m.remove(key);
-      } else if (value is String) {
-        var values = new List(1);
-        values[0] = value;
-        _m[key] = values;
-      } else {
-        _m[key] = value.toList();
-      }
-    });
-  }
-
-  Iterable<String> get names => _m.keys;
-
-  bool contains(String name) =>  _m.containsKey(name.toLowerCase());
-
-  String operator [](String name) {
-    name = name.toLowerCase();
-
-    if (_COOKIE_HEADERS.contains(name)) {
-      throw new ArgumentError('Cannot use Headers[] with $name header.');
-    }
-
-    var values = _m[name];
-    if (values == null) return null;
-    if (values.length == 1) return values.first;
-    return values.join(',');
-  }
-
-  Iterable<String> getMultiple(String name) {
-    name = name.toLowerCase();
-    var values = _m[name];
-    if (values == null) return values;
-
-    if (_COOKIE_HEADERS.contains(name)) {
-      return values;
-    } else {
-      return values.expand((e) => e.split(',')).map((e) => e.trim());
-    }
-  }
-}
-
-
-/// Internal helper class to reduce code duplication between [RequestImpl]
-/// and [ResponseImpl].
-class _Message {
-  final Headers headers;
-  final Stream<List<int>> _body;
-  bool _bodyRead = false;
-
-  _Message(Headers headers_, body)
-      : headers = headers_ != null ? headers_ : HeadersImpl.Empty,
-        _body = body != null ? body : (new StreamController()..close()).stream;
-
-  /// Returns the [Stream] of bytes of this message.
-  ///
-  /// The body of a message can only be read once.
-  Stream<List<int>> read() {
-    if (_bodyRead) {
-      throw new StateError('The response stream has already been listened to.');
-    }
-    _bodyRead = true;
-    return _body;
-  }
-}
-
-
-/// An immutable implementation of [Request].
-///
-/// The request can be modified with the copy-on-write `replace` method.
-class RequestImpl extends _Message implements Request {
-  final String method;
-  final Uri url;
-
-  RequestImpl(this.method, this.url, {Headers headers, Stream<List<int>> body})
-      : super(headers, body);
-
-  /// Makes a copy of this [RequestImpl] by overriding `method`, `url`,
-  /// `headers` and `body` if they are not null.
-  ///
-  /// In case no [body] was supplied, the current `body` will be used and is
-  /// therefore no longer available to users. This is a transfer of the owner
-  /// of the body stream to the returned object.
-  RequestImpl replace(
-        {String method, Uri url, Headers headers, Stream<List<int>> body}) {
-    if (method == null) method = this.method;
-    if (url == null) url = this.url;
-    if (headers == null) headers = this.headers;
-    if (body == null) body = read();
-
-    return new RequestImpl(method, url, headers: headers, body: body);
-  }
-}
-
-
-/// An immutable implementation of [Response].
-///
-/// The response can be modified with the copy-on-write `replace` method.
-class ResponseImpl extends _Message implements Response {
-  final int statusCode;
-
-  ResponseImpl(this.statusCode, {Headers headers, Stream<List<int>> body})
-      : super(headers, body);
-
-  /// Returns a copy of this [ResponseImpl] by overriding `statusCode`,
-  /// `headers` and `body` if they are not null.
-  ///
-  /// In case no [body] was supplied, the current `body` will be used and is
-  /// therefore no longer available to users. This is a transfer of the owner
-  /// of the body stream to the returned object.
-  ResponseImpl replace(
-        {int statusCode, Headers headers, Stream<List<int>> body}) {
-    if (statusCode == null) statusCode = this.statusCode;
-    if (headers == null) headers = this.headers;
-    if (body == null) body = read();
-
-    return new ResponseImpl(statusCode, headers: headers, body: body);
-  }
-}
diff --git a/pkg/http_base/lib/http_base_html.dart b/pkg/http_base/lib/http_base_html.dart
deleted file mode 100644
index 14d57e4..0000000
--- a/pkg/http_base/lib/http_base_html.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-library http_base.http_base_html;
-
-import 'dart:html';
-import 'dart:async';
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'http_base.dart';
-export 'http_base.dart';
-
-/// The following headers will be blocked by browsers. See:
-/// http://www.w3.org/TR/XMLHttpRequest/
-const List<String> _BLOCKED_HEADERS = const [
-    'accept-charset', 'accept-encoding', 'access-control-request-headers',
-    'access-control-request-method', 'connection', 'content-length', 'cookie',
-    'cookie2', 'date', 'dnt', 'expect', 'host', 'keep-alive', 'origin',
-    'referer', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'user-agent',
-    'via'];
-
-/// An implementation for [RequestHandler]. It uses dart:html to make http
-/// requests.
-class Client {
-  Future<Response> call(Request request) {
-    return _bufferData(request.read()).then((Uint8List data) {
-      var url = request.url.toString();
-      return _request(url, request.method, request.headers, data).then((xhr) {
-        var headers = HeadersImpl.Empty.replace(xhr.responseHeaders);
-        var body = _readResponse(xhr);
-        return new ResponseImpl(xhr.status, headers: headers, body: body);
-      });
-    });
-  }
-
-  Future<Uint8List> _bufferData(Stream<List<int>> stream) {
-    int size = 0;
-
-    return stream.fold([], (buffer, data) {
-      size += data.length;
-      return buffer..add(data);
-    }).then((List<List<int>> buffer) {
-      if (size > 0) {
-        var data;
-        if (buffer.length == 0 && buffer[0] is Uint8List) {
-          data = buffer[0];
-        } else {
-          data = new Uint8List(size);
-          int offset = 0;
-          for (var bytes in buffer) {
-            var end = offset + bytes.length;
-            data.setRange(offset, end, bytes);
-            offset = end;
-          }
-        }
-        return data;
-      }
-      return null;
-    });
-  }
-
-  Future<HttpRequest> _request(String url,
-                               String method,
-                               Headers headers,
-                               Uint8List sendData) {
-    var completer = new Completer<HttpRequest>();
-
-    var xhr = new HttpRequest();
-    xhr.open(method, url, async: true);
-
-    // Maybe we should use 'arraybuffer' instead?
-    xhr.responseType = 'blob';
-
-    // TODO: Special case Cookie/Set-Cookie here!
-    for (var name in headers.names) {
-      xhr.setRequestHeader(name, headers[name]);
-    }
-
-    xhr.onLoad.first.then((_) => completer.complete(xhr));
-    xhr.onError.first.then(completer.completeError);
-    xhr.send(sendData);
-
-    return completer.future;
-  }
-
-  Stream<List<int>> _readResponse(HttpRequest request) {
-    var controller = new StreamController<List<int>>();
-
-    var data = request.response;
-    assert (data is Blob);
-
-    var reader = new FileReader();
-    reader.onLoad.first.then((_) {
-      controller.add(reader.result);
-      controller.close();
-    });
-    reader.readAsArrayBuffer(data);
-
-    return controller.stream;
-  }
-}
diff --git a/pkg/http_base/lib/http_base_io.dart b/pkg/http_base/lib/http_base_io.dart
deleted file mode 100644
index f33383d..0000000
--- a/pkg/http_base/lib/http_base_io.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-library http_base.http_base_io;
-
-import 'dart:io' as io;
-import 'dart:async';
-
-import 'http_base.dart';
-export 'http_base.dart';
-
-/// An implementation for [RequestHandler]. It uses dart:io to make http
-/// requests.
-class Client {
-  // TODO: Should we provide a mechanism to close (forcefully or not) [_client]?
-  final io.HttpClient _client = new io.HttpClient();
-
-  Future<Response> call(Request request) {
-   return _client.openUrl(request.method, request.url).then((ioRequest) {
-     // TODO: Special case Cookie/Set-Cookie here!
-
-     for (var name in request.headers.names) {
-       ioRequest.headers.set(name, request.headers[name]);
-     }
-
-     var stream = request.read();
-     return ioRequest.addStream(stream).then((_) {
-       return ioRequest.close();
-     });
-   }).then((io.HttpClientResponse ioResponse) {
-     var headerMap = {};
-     ioResponse.headers.forEach((name, values) {
-       headerMap[name] = values;
-     });
-     var headers = new HeadersImpl(headerMap);
-
-     return new ResponseImpl(
-         ioResponse.statusCode, headers: headers, body: ioResponse);
-   });
-  }
-}
diff --git a/pkg/http_base/pubspec.yaml b/pkg/http_base/pubspec.yaml
deleted file mode 100644
index baf60cb..0000000
--- a/pkg/http_base/pubspec.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: http_base
-version: 0.0.2-dev
-author: Dart Team <misc@dartlang.org>
-description: A library with common interfaces for HTTP request objects, HTTP response objects, HTTP clients and HTTP request handlers.
-homepage: http://www.dartlang.org
-environment:
-  sdk: '>=1.0.0 <2.0.0'
-dev_dependencies:
-  unittest: ">=0.11.0 <0.12.0"
diff --git a/pkg/http_base/test/http_base_html_test.dart b/pkg/http_base/test/http_base_html_test.dart
deleted file mode 100644
index a1efb7d..0000000
--- a/pkg/http_base/test/http_base_html_test.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-library http_base.http_base_html_test;
-
-import 'dart:html';
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:http_base/http_base_html.dart';
-import 'package:unittest/unittest.dart';
-
-main() {
-  test('http-client', () {
-    var uri = Uri.parse(window.location.href).resolve('/echo');
-
-    var client = new Client();
-    var body = (new StreamController()
-        ..add(UTF8.encode('my-data'))
-        ..close()).stream;
-    var request = new RequestImpl('POST', uri, body: body);
-    client(request).then(expectAsync((response) {
-      expect(response.statusCode, equals(200));
-      response.read()
-          .transform(UTF8.decoder).join('').then(expectAsync((data) {
-        expect(data, equals('my-data'));
-      }));
-    }));
-  });
-}
diff --git a/pkg/http_base/test/http_base_io_test.dart b/pkg/http_base/test/http_base_io_test.dart
deleted file mode 100644
index 5df2ea0..0000000
--- a/pkg/http_base/test/http_base_io_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-library http_base.http_base_io_test;
-
-import 'dart:async';
-import 'dart:io';
-import 'dart:convert';
-
-import 'package:http_base/http_base_io.dart';
-import 'package:unittest/unittest.dart';
-
-main() {
-  test('io-client', () {
-    HttpServer.bind('127.0.0.1', 0).then(expectAsync((HttpServer server) {
-      server.first.then(expectAsync((request) {
-        expect(request.method, equals('POST'));
-        expect(request.headers.value('foo'), equals('bar'));
-
-        return request.fold([], (buf, data) => buf..addAll(data)).then((data) {
-          request
-              ..response.statusCode = 201
-              ..response.headers.set('foo', ['foo', 'bar'])
-              ..response.add(data)
-              ..response.close();
-        });
-      })).whenComplete(() => server.close());
-
-      var client = new Client();
-      var uri = Uri.parse('http://127.0.0.1:${server.port}/');
-      var headers = new HeadersImpl({'foo' : 'bar'});
-      var body = (new StreamController()
-          ..add(UTF8.encode('my-data'))
-          ..close()).stream;
-
-      var request = new RequestImpl('POST', uri, headers: headers, body: body);
-      client(request).then(expectAsync((response) {
-        expect(response.statusCode, equals(201));
-        // NOTE: dart:io joins multiple values with ", ".
-        expect(response.headers['foo'], equals('foo, bar'));
-        expect(response.headers.getMultiple('foo').toList(),
-               equals(['foo','bar']));
-
-        response.read()
-            .transform(UTF8.decoder).join('').then(expectAsync((data) {
-          expect(data, equals('my-data'));
-        }));
-      }));
-    }));
-  });
-}
diff --git a/pkg/http_base/test/http_base_test.dart b/pkg/http_base/test/http_base_test.dart
deleted file mode 100644
index d6d97e2..0000000
--- a/pkg/http_base/test/http_base_test.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-library http_base.http_base_test;
-
-import 'package:http_base/http_base.dart';
-import 'package:unittest/unittest.dart';
-
-main() {
-  group('headers-impl', () {
-    test('empty', () {
-      for (HeadersImpl emptyHeaders in [HeadersImpl.Empty,
-                                        new HeadersImpl({})]) {
-        expect(emptyHeaders.names, isEmpty);
-        expect(emptyHeaders['foo'], isNull);
-        expect(emptyHeaders.getMultiple('foo'), isNull);
-      }
-    });
-
-    test('multi-value', () {
-      var headers = new HeadersImpl({
-        'Single' : 'single-value',
-        'Mul' : ['mul-1', 'mul-2', 'mul-3,mul-4'],
-        'Mul-Inline' : 'mi-1,mi-2,mi-3',
-      });
-
-      expect(headers.names, hasLength(3));
-      expect(headers.names, contains('single'));
-      expect(headers.names, contains('mul'));
-      expect(headers.names, contains('mul-inline'));
-
-      for (var key in ['Single', 'single']) {
-        expect(headers[key], equals('single-value'));
-        expect(headers.getMultiple(key), equals(['single-value']));
-      }
-
-      for (var key in ['Mul', 'mul']) {
-        expect(headers[key], equals('mul-1,mul-2,mul-3,mul-4'));
-        expect(headers.getMultiple(key),
-               equals(['mul-1','mul-2','mul-3','mul-4']));
-      }
-
-      for (var key in ['Mul-Inline', 'mul-inline']) {
-        expect(headers[key], equals('mi-1,mi-2,mi-3'));
-        expect(headers.getMultiple(key), equals(['mi-1','mi-2','mi-3']));
-      }
-    });
-
-    test('cookie-headers', () {
-      var headers = new HeadersImpl({
-        'Set-Cookie' : [
-            'lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT',
-            'lang=de-DE; Expires=Wed, 09 Jun 2021 10:18:14 GMT',],
-        'Cookie' : ['name1=value1; name2=value2', 'name3=value3'],
-      });
-
-      expect(() => headers['set-cookie'], throwsArgumentError);
-      expect(() => headers['cookie'], throwsArgumentError);
-
-      expect(headers.getMultiple('set-cookie').toList(), equals([
-          'lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT',
-          'lang=de-DE; Expires=Wed, 09 Jun 2021 10:18:14 GMT']));
-
-      expect(headers.getMultiple('cookie').toList(),
-             equals(['name1=value1; name2=value2', 'name3=value3']));
-    });
-
-    test('replace', () {
-      var headers = new HeadersImpl({
-        'Single' : 'single-value',
-        'Mul' : ['mul-1', 'mul-2', 'mul-3,mul-4'],
-        'Mul-Inline' : 'mi-1,mi-2,mi-3',
-      }).replace({
-        'single' : 'foo',
-        'mul' : null,
-        'mul-inline' : 'bar',
-      });
-
-      expect(headers.names, hasLength(2));
-      expect(headers['single'], equals('foo'));
-      expect(headers['mul-inline'], equals('bar'));
-    });
-  });
-}
diff --git a/pkg/http_multi_server/CHANGELOG.md b/pkg/http_multi_server/CHANGELOG.md
index 8cab523..05f2f2c 100644
--- a/pkg/http_multi_server/CHANGELOG.md
+++ b/pkg/http_multi_server/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 1.2.0
+
+* Add support for `HttpServer.defaultResponseHeaders.clear`.
+
+* Fix `HttpServer.defaultResponseHeaders.remove` and `.removeAll`.
+
+## 1.1.0
+
+* Add support for `HttpServer.defaultResponseHeaders`.
+
 ## 1.0.2
 
 * Remove the workaround for [issue 19815][].
diff --git a/pkg/http_multi_server/lib/http_multi_server.dart b/pkg/http_multi_server/lib/http_multi_server.dart
index 76c3eba..7075ab4 100644
--- a/pkg/http_multi_server/lib/http_multi_server.dart
+++ b/pkg/http_multi_server/lib/http_multi_server.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'src/multi_headers.dart';
 import 'src/utils.dart';
 
 /// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers
@@ -20,6 +21,11 @@
   /// The wrapped servers.
   final Set<HttpServer> _servers;
 
+  /// Returns the default value of the `Server` header for all responses
+  /// generated by each server.
+  ///
+  /// If the wrapped servers have different default values, it's not defined
+  /// which value is returned.
   String get serverHeader => _servers.first.serverHeader;
   set serverHeader(String value) {
     for (var server in _servers) {
@@ -27,8 +33,11 @@
     }
   }
 
-  HttpHeaders get defaultResponseHeaders =>
-      throw new UnsupportedError('defaultResponseHeaders not supported');
+  /// Returns the default set of headers added to all response objects.
+  ///
+  /// If the wrapped servers have different default headers, it's not defined
+  /// which header is returned for accessor methods.
+  final HttpHeaders defaultResponseHeaders;
 
   Duration get idleTimeout => _servers.first.idleTimeout;
   set idleTimeout(Duration value) {
@@ -61,6 +70,8 @@
   /// listened to when this is called.
   HttpMultiServer(Iterable<HttpServer> servers)
       : _servers = servers.toSet(),
+        defaultResponseHeaders = new MultiHeaders(
+            servers.map((server) => server.defaultResponseHeaders)),
         super(mergeStreams(servers));
 
   /// Creates an [HttpServer] listening on all available loopback addresses for
diff --git a/pkg/http_multi_server/lib/src/multi_headers.dart b/pkg/http_multi_server/lib/src/multi_headers.dart
new file mode 100644
index 0000000..fcd782c
--- /dev/null
+++ b/pkg/http_multi_server/lib/src/multi_headers.dart
@@ -0,0 +1,123 @@
+// 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_multi_server.multi_headers;
+
+import 'dart:io';
+
+/// A class that delegates header access and setting to many [HttpHeaders]
+/// instances.
+class MultiHeaders implements HttpHeaders {
+  /// The wrapped headers.
+  final Set<HttpHeaders> _headers;
+
+  bool get chunkedTransferEncoding => _headers.first.chunkedTransferEncoding;
+  set chunkedTransferEncoding(bool value) {
+    for (var headers in _headers) {
+      headers.chunkedTransferEncoding = value;
+    }
+  }
+
+  int get contentLength => _headers.first.contentLength;
+  set contentLength(int value) {
+    for (var headers in _headers) {
+      headers.contentLength = value;
+    }
+  }
+
+  ContentType get contentType => _headers.first.contentType;
+  set contentType(ContentType value) {
+    for (var headers in _headers) {
+      headers.contentType = value;
+    }
+  }
+
+  DateTime get date => _headers.first.date;
+  set date(DateTime value) {
+    for (var headers in _headers) {
+      headers.date = value;
+    }
+  }
+
+  DateTime get expires => _headers.first.expires;
+  set expires(DateTime value) {
+    for (var headers in _headers) {
+      headers.expires = value;
+    }
+  }
+
+  String get host => _headers.first.host;
+  set host(String value) {
+    for (var headers in _headers) {
+      headers.host = value;
+    }
+  }
+
+  DateTime get ifModifiedSince => _headers.first.ifModifiedSince;
+  set ifModifiedSince(DateTime value) {
+    for (var headers in _headers) {
+      headers.ifModifiedSince = value;
+    }
+  }
+
+  bool get persistentConnection => _headers.first.persistentConnection;
+  set persistentConnection(bool value) {
+    for (var headers in _headers) {
+      headers.persistentConnection = value;
+    }
+  }
+
+  int get port => _headers.first.port;
+  set port(int value) {
+    for (var headers in _headers) {
+      headers.port = value;
+    }
+  }
+
+  MultiHeaders(Iterable<HttpHeaders> headers)
+      : _headers = headers.toSet();
+
+  void add(String name, Object value) {
+    for (var headers in _headers) {
+      headers.add(name, value);
+    }
+  }
+
+  void forEach(void f(String name, List<String> values)) =>
+      _headers.first.forEach(f);
+
+  void noFolding(String name) {
+    for (var headers in _headers) {
+      headers.noFolding(name);
+    }
+  }
+
+  void remove(String name, Object value) {
+    for (var headers in _headers) {
+      headers.remove(name, value);
+    }
+  }
+
+  void removeAll(String name) {
+    for (var headers in _headers) {
+      headers.removeAll(name);
+    }
+  }
+
+  void set(String name, Object value) {
+    for (var headers in _headers) {
+      headers.set(name, value);
+    }
+  }
+
+  String value(String name) => _headers.first.value(name);
+
+  List<String> operator[](String name) => _headers.first[name];
+
+  void clear() {
+    for (var headers in _headers) {
+      headers.clear();
+    }
+  }
+}
diff --git a/pkg/http_multi_server/pubspec.yaml b/pkg/http_multi_server/pubspec.yaml
index c7361d4..b1b2830 100644
--- a/pkg/http_multi_server/pubspec.yaml
+++ b/pkg/http_multi_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_multi_server
-version: 1.0.2
+version: 1.2.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description:
diff --git a/pkg/http_multi_server/test/http_multi_server_test.dart b/pkg/http_multi_server/test/http_multi_server_test.dart
index a3d9062..0371c89 100644
--- a/pkg/http_multi_server/test/http_multi_server_test.dart
+++ b/pkg/http_multi_server/test/http_multi_server_test.dart
@@ -60,6 +60,28 @@
       }), completes);
     });
 
+    test("headers.set sets the value for all servers", () {
+      multiServer.defaultResponseHeaders.set(
+          "server", "http_multi_server test");
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['server'], equals("http_multi_server test"));
+      }), completes);
+    });
+
     test("connectionsInfo sums the values for all servers", () {
       var pendingRequests = 0;
       var awaitingResponseCompleter = new Completer();
diff --git a/pkg/http_parser/CHANGELOG.md b/pkg/http_parser/CHANGELOG.md
index 72f0218..c1e7926 100644
--- a/pkg/http_parser/CHANGELOG.md
+++ b/pkg/http_parser/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.0.2+5
+
+* Widen the version constraint on the `collection` package.
+
 ## 0.0.2+4
 
 * Widen the `string_scanner` version constraint.
diff --git a/pkg/http_parser/pubspec.yaml b/pkg/http_parser/pubspec.yaml
index fd279ce..340c08d 100644
--- a/pkg/http_parser/pubspec.yaml
+++ b/pkg/http_parser/pubspec.yaml
@@ -1,12 +1,12 @@
 name: http_parser
-version: 0.0.2+4
+version: 0.0.2+5
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
   A platform-independent package for parsing and serializing HTTP formats.
 dependencies:
   crypto: ">=0.9.0 <0.10.0"
-  collection: ">=0.9.1 <0.10.0"
+  collection: ">=0.9.1 <2.0.0"
   string_scanner: ">=0.0.0 <0.2.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index 57765c5..7b889f6 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 0.11.7-dev
+
+  * Improved code layout of the package.
+
+## 0.11.6
+
+  * Catch analyzer errors and do not generate messages for that file. Previously
+    this would stop the message extraction on syntax errors and not give error
+    messages as good as the compiler would produce. Just let the compiler do it.
+
+## 0.11.5
+
+ * Change to work with both petitparser 1.1.x and 1.2.x versions.
+
 ## 0.11.4
 
  * Broaden the pubspec constraints to allow current analyzer versions.
diff --git a/pkg/intl/bin/extract_to_arb.dart b/pkg/intl/bin/extract_to_arb.dart
index 13b8c30..970c0bc 100644
--- a/pkg/intl/bin/extract_to_arb.dart
+++ b/pkg/intl/bin/extract_to_arb.dart
@@ -121,4 +121,3 @@
 String escape(String s) {
   return s.replaceAll("'", "''").replaceAll("{", "'{'").replaceAll("}", "'}'");
 }
-
diff --git a/pkg/intl/bin/generate_from_arb.dart b/pkg/intl/bin/generate_from_arb.dart
index ec4bc0f..1d576bcf 100644
--- a/pkg/intl/bin/generate_from_arb.dart
+++ b/pkg/intl/bin/generate_from_arb.dart
@@ -23,7 +23,6 @@
 import 'package:intl/generate_localized.dart';
 import 'package:path/path.dart' as path;
 import 'package:args/args.dart';
-import 'package:petitparser/petitparser.dart';
 
 /**
  * Keeps track of all the messages we have processed so far, keyed by message
@@ -138,7 +137,5 @@
   List<MainMessage> _findOriginals() => originalMessages = messages[id];
 }
 
-final pluralAndGenderParser = 
-    removeDuplicates(removeSetables(new ICUParser().message));
-final plainParser = 
-    removeDuplicates(removeSetables(new ICUParser().nonIcuMessage));
+final pluralAndGenderParser = new ICUParser().message;
+final plainParser = new ICUParser().nonIcuMessage;
diff --git a/pkg/intl/lib/extract_messages.dart b/pkg/intl/lib/extract_messages.dart
index 972ab4a8..1f3a39e 100644
--- a/pkg/intl/lib/extract_messages.dart
+++ b/pkg/intl/lib/extract_messages.dart
@@ -52,7 +52,13 @@
  * message names to [IntlMessage] instances.
  */
 Map<String, MainMessage> parseFile(File file) {
-  _root = parseDartFile(file.path);
+  try {
+    _root = parseDartFile(file.path);
+  } on AnalyzerErrorGroup catch (e) {
+    print("Error in parsing ${file.path}, no messages extracted.");
+    print("  $e");
+    return {};
+  }
   _origin = file.path;
   var visitor = new MessageFindingVisitor();
   _root.accept(visitor);
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index 0ce6c44..2f8e030 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -23,19 +23,20 @@
 
 import 'dart:collection';
 import 'dart:convert';
-import 'src/intl_helpers.dart';
 import 'dart:math';
-import 'date_symbols.dart';
-import 'src/date_format_internal.dart';
-import "number_symbols.dart";
-import "number_symbols_data.dart";
 
-part 'date_format.dart';
-part 'src/date_format_field.dart';
-part 'src/date_format_helpers.dart';
-part 'bidi_formatter.dart';
-part 'bidi_utils.dart';
-part 'number_format.dart';
+import 'date_symbols.dart';
+import 'number_symbols.dart';
+import 'number_symbols_data.dart';
+import 'src/date_format_internal.dart';
+import 'src/intl_helpers.dart';
+
+part 'src/intl/bidi_formatter.dart';
+part 'src/intl/bidi_utils.dart';
+part 'src/intl/date_format.dart';
+part 'src/intl/date_format_field.dart';
+part 'src/intl/date_format_helpers.dart';
+part 'src/intl/number_format.dart';
 
 /**
  * The Intl class provides a common entry point for internationalization
@@ -65,7 +66,7 @@
  * produce "I see 2 other people in Athens." as output in the default locale.
  * If run in a different locale it would produce appropriately translated
  * output.
- * 
+ *
  * For more detailed information on messages and localizing them see
  * the main [package documentation](https://pub.dartlang.org/packages/intl)
  *
@@ -149,7 +150,7 @@
    * the source code and used as additional data for translators. For more
    * information see the "Messages" section of the main [package documentation]
    * (https://pub.dartlang.org/packages/intl).
-   * 
+   *
    * The [name] and [args] arguments are required, and are used at runtime
    * to look up the localized version and pass the appropriate arguments to it.
    * We may in the future modify the code during compilation to make manually
diff --git a/pkg/intl/lib/bidi_formatter.dart b/pkg/intl/lib/src/intl/bidi_formatter.dart
similarity index 100%
rename from pkg/intl/lib/bidi_formatter.dart
rename to pkg/intl/lib/src/intl/bidi_formatter.dart
diff --git a/pkg/intl/lib/bidi_utils.dart b/pkg/intl/lib/src/intl/bidi_utils.dart
similarity index 100%
rename from pkg/intl/lib/bidi_utils.dart
rename to pkg/intl/lib/src/intl/bidi_utils.dart
diff --git a/pkg/intl/lib/date_format.dart b/pkg/intl/lib/src/intl/date_format.dart
similarity index 100%
rename from pkg/intl/lib/date_format.dart
rename to pkg/intl/lib/src/intl/date_format.dart
diff --git a/pkg/intl/lib/src/date_format_field.dart b/pkg/intl/lib/src/intl/date_format_field.dart
similarity index 100%
rename from pkg/intl/lib/src/date_format_field.dart
rename to pkg/intl/lib/src/intl/date_format_field.dart
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/intl/date_format_helpers.dart
similarity index 100%
rename from pkg/intl/lib/src/date_format_helpers.dart
rename to pkg/intl/lib/src/intl/date_format_helpers.dart
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/src/intl/number_format.dart
similarity index 100%
rename from pkg/intl/lib/number_format.dart
rename to pkg/intl/lib/src/intl/number_format.dart
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 21e2e90..dd85ae4 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,10 +1,11 @@
 name: intl
-version: 0.11.4
+version: 0.11.7-dev
 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
+homepage: https://www.dartlang.org
 environment:
   sdk: '>=1.4.0 <2.0.0'
+documentation: http://www.dartdocs.org/documentation/intl/latest
 dependencies:
   analyzer: '>=0.13.2 <0.23.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
index 2966b03..b760629 100644
--- a/pkg/observe/CHANGELOG.md
+++ b/pkg/observe/CHANGELOG.md
@@ -3,6 +3,13 @@
 This file contains highlights of what changes on each version of the observe
 package.
 
+#### Pub version 0.12.0
+  * Old transform.dart file removed. If you weren't use it it, this change is
+    backwards compatible with version 0.11.0.
+
+#### Pub version 0.11.0+5
+  * Widen the constraint on analyzer.
+
 #### Pub version 0.11.0+4
   * Raise the lower bound on the source_maps constraint to exclude incompatible
     versions.
diff --git a/pkg/observe/lib/transform.dart b/pkg/observe/lib/transform.dart
deleted file mode 100644
index c62b2ef..0000000
--- a/pkg/observe/lib/transform.dart
+++ /dev/null
@@ -1,10 +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.
-
-/// Code transform for @observable. This library will be removed soon, it simply
-/// reexports `observe.transformer`.
-// TODO(sigmund): deprecate and delete.
-library observe.transform;
-
-export 'transformer.dart';
diff --git a/pkg/observe/lib/transformer.dart b/pkg/observe/lib/transformer.dart
index 21b08fe..5bb07d6 100644
--- a/pkg/observe/lib/transformer.dart
+++ b/pkg/observe/lib/transformer.dart
@@ -187,8 +187,6 @@
 
   // Track fields that were transformed.
   var instanceFields = new Set<String>();
-  var getters = new List<String>();
-  var setters = new List<String>();
 
   for (var member in cls.members) {
     if (member is FieldDeclaration) {
@@ -212,20 +210,7 @@
 
         var names = member.fields.variables.map((v) => v.name.name);
 
-        getters.addAll(names);
-        if (!_isReadOnly(member.fields)) {
-          setters.addAll(names);
-          instanceFields.addAll(names);
-        }
-      }
-    }
-    // TODO(jmesserly): this is a temporary workaround until we can remove
-    // getValueWorkaround and setValueWorkaround.
-    if (member is MethodDeclaration) {
-      if (_hasKeyword(member.propertyKeyword, Keyword.GET)) {
-        getters.add(member.name.name);
-      } else if (_hasKeyword(member.propertyKeyword, Keyword.SET)) {
-        setters.add(member.name.name);
+        if (!_isReadOnly(member.fields)) instanceFields.addAll(names);
       }
     }
   }
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 1935623..25cb90e 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.11.0+5
+version: 0.12.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
diff --git a/pkg/path/benchmark/benchmark.dart b/pkg/path/benchmark/benchmark.dart
new file mode 100644
index 0000000..60a2b53
--- /dev/null
+++ b/pkg/path/benchmark/benchmark.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.
+
+import '../lib/path.dart' as path;
+
+void runBenchmark(String name, Function func, List files) {
+  // Warmup.
+  for (int i = 0; i < 10000; i++) {
+    for (var p in files) {
+      func(p);
+    }
+  }
+  var count = 100000;
+  var sw = new Stopwatch()..start();
+  for (int i = 0; i < count; i++) {
+    for (var p in files) {
+      func(p);
+    }
+  }
+  print("$name: ${count / sw.elapsedMicroseconds} iter/us (${sw.elapsed})");
+}
+
+main(args) {
+  for (var style in [path.Style.posix, path.Style.url, path.Style.windows]) {
+    var context = new path.Context(style: style);
+    var files = COMMON_PATHS.toList()..addAll(STYLE_PATHS[style]);
+
+    void benchmark(name, func) {
+      name = style.name + '-' + name;
+      if (args.isEmpty || args.any((arg) => name.contains(arg))) {
+        runBenchmark(name, func, files);
+      }
+    }
+
+    benchmark('basename', context.basename);
+    benchmark('basenameWithoutExtension', context.basenameWithoutExtension);
+    benchmark('dirname', context.dirname);
+    benchmark('extension', context.extension);
+    benchmark('rootPrefix', context.rootPrefix);
+    benchmark('isAbsolute', context.isAbsolute);
+    benchmark('isRelative', context.isRelative);
+    benchmark('isRootRelative', context.isRootRelative);
+    benchmark('normalize', context.normalize);
+    benchmark('relative', context.relative);
+    benchmark('toUri', context.toUri);
+    benchmark('prettyUri', context.prettyUri);
+  }
+}
+
+const COMMON_PATHS = const [
+  '.',
+  '..',
+  'out/ReleaseIA32/packages',
+];
+
+final STYLE_PATHS = {
+  path.Style.posix: [
+    '/home/user/dart/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart',
+  ],
+  path.Style.url: [
+    'https://example.server.org/443643002/path?top=yes#fragment',
+  ],
+  path.Style.windows: [
+    r'C:\User\me\',
+    r'\\server\share\my\folders\some\file.data',
+  ],
+};
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index 77dcd12..5326455 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -69,11 +69,8 @@
                 '"third_party"])',
             '<!@(["python", "../tools/list_pkg_directories.py", '
                 '"../third_party/pkg"])',
-            '<!@(["python", "../tools/list_pkg_directories.py", '
-                '"polymer/e2e_test/"])',
             '../sdk/lib/_internal/compiler',
             '../sdk/lib/_internal/libraries.dart',
-            '../site/try',
             '<(SHARED_INTERMEDIATE_DIR)/remove_html_imports/http/lib/http.dart',
           ],
           'outputs': [
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 326ea28..1a52965 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -24,7 +24,9 @@
 third_party/angular_tests/browser_test/*: Skip # github perf_api.dart issue 5
 third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
 polymer/example/component/news/test/news_index_test: RuntimeError # Issue 18931
-intl/test/date_time_format_http_request_test: Pass, Timeout # Issue 19544
+intl/test/date_time_format_http_request_test: Skip # Times out flakily. Issue 19544
+intl/test/date_time_format_local_even_test: Skip # Times out flakily. Issue 19544
+intl/test/date_time_format_local_odd_test: Skip # Times out flakily. Issue 19544
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 18931
@@ -33,6 +35,7 @@
 polymer/test/computed_properties_test: Pass, RuntimeError # Issue 18931
 polymer/test/custom_event_test: Pass, RuntimeError # Issue 18931
 polymer/test/entered_view_test: Pass, RuntimeError # Issue 18931
+polymer/test/event_binding_release_handler_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_handlers_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_path_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_path_declarative_test: Pass, RuntimeError, Timeout # Issue 18931
@@ -57,7 +60,8 @@
 polymer/test/instance_attrs_test: Skip # Issue 19496
 
 [ $compiler == none && $runtime == dartium && $system == windows ]
-polymer/test/property_observe_test: Pass, Timeout # Issue 19326
+polymer/test/property_observe_test: Skip # Sometimes times out. Issue 19326
+polymer/test/bind_properties_test: Skip # Sometimes times out. Issue 19326
 
 [ $runtime == vm && $mode == debug]
 analysis_server/test/analysis_server_test: Skip  # Times out
@@ -97,7 +101,12 @@
 typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
 analysis_server/test/search/element_references_test: Pass, Slow
-analysis_services/test/index/store/codec_test: Pass, Slow
+analysis_server/test/services/index/store/codec_test: Pass, Slow
+
+# Analysis server integration tests don't make sense to run under
+# dart2js, since the code under test always runs in the Dart vm as a
+# subprocess.
+analysis_server/test/integration: Skip
 
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 http/test/html/client_test: Fail # Issue 19750
@@ -172,6 +181,7 @@
 polymer/test/computed_properties_test: Skip # uses dart:html
 polymer/test/custom_event_test: Skip # uses dart:html
 polymer/test/entered_view_test: Skip # uses dart:html
+polymer/test/event_binding_release_handler_test: Skip #uses dart:html
 polymer/test/event_handlers_test: Skip #uses dart:html
 polymer/test/event_path_declarative_test: Skip #uses dart:html
 polymer/test/event_path_test: Skip #uses dart:html
@@ -228,6 +238,7 @@
 polymer/e2e_test/*: Pass, RuntimeError # Issue 19265
 polymer_expressions/*: Pass, RuntimeError # Issue 19265
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
+template_binding/test/custom_element_bindings_test: Pass, RuntimeError # Issue 20714
 polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
 analyzer/test/generated/java_core_test: Pass, Timeout # Issue 19747
 
@@ -299,7 +310,8 @@
 
 [ $browser ]
 analysis_server/test/*: Skip # Uses dart:io.
-analysis_services/test/*: Skip # Uses dart:io.
+analysis_server/tool/spec/check_all_test: Skip # Uses dart:io.
+analyzer2dart/*: Skip # Uses dart:io.
 analyzer/test/*: Skip # Uses dart:io.
 barback/test/*: Fail, OK # Uses dart:io.
 code_transformers/test/*: Skip # Uses dart:io.
@@ -307,7 +319,6 @@
 http_parser/test/web_socket_test: Fail, OK # Uses dart:io
 http_multi_server/test/http_multi_server_test: Skip # Uses dart:io
 http_server/test/*: Fail, OK # Uses dart:io.
-http_base/test/http_base_io_test: SkipByDesign # Uses dart:io.
 intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_odd_test: Fail, OK # Uses dart:io.
 intl/test/find_default_locale_standalone_test: Fail, OK # Uses dart:io.
@@ -412,7 +423,6 @@
 polymer_expressions/test/bindings_test: Skip
 third_party/html5lib/test/browser/browser_test: Skip
 http/test/html/*: Skip
-http_base/test/http_base_html_test: SkipByDesign # Uses dart:html.
 
 [ $browser ]
 docgen/test/*: Skip  # Uses dart:io
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index ec11b68..f7b0f96 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,6 +4,28 @@
 package. We will also note important changes to the polyfill packages (observe,
 web_components, and template_binding) if they impact polymer.
 
+#### Pub version 0.13.0
+  * Update to match polymer 0.3.5 ([polymer-dev#5d00e4b][5d00e4b]). There was a
+    breaking change in the web_components package where selecting non-rendered 
+    elements doesn't work, but it shouldn't affect most people. See 
+    https://github.com/Polymer/ShadowDOM/issues/495.
+
+#### Pub version 0.12.2+1
+  * Small bug fix for `polymer:new_element`
+
+#### Pub version 0.12.2
+  * Fix for [20539](http://dartbug.com/20539). Log widget will now html escape
+    messages.
+  * Fix for [20538](http://dartbug.com/20538). Log widget will now surface lint
+    logs from imported files.
+  * Backward compatible change to prepare for upcoming change of the user agent
+    in Dartium.
+  * `pub run polymer:new_element` now supports specifying a base class.
+    **Note**: only native DOM types and custom elements written in Dart can be
+    extended. Elements adapted from Javascript (like core- and paper- elements)
+    cannot be extended.
+  * other bug fixes in `polymer:new_entry`.
+
 #### Pub version 0.12.1
   * **New**: When running in pub-serve, any warnings and errors detected by the
     polymer transformers will be displayed in the lower-right corner of your
diff --git a/pkg/polymer/README.md b/pkg/polymer/README.md
index 698aef0..da9014a 100644
--- a/pkg/polymer/README.md
+++ b/pkg/polymer/README.md
@@ -113,7 +113,7 @@
 [cs_mac]: http://gsdview.appspot.com/dartium-archive/continuous/drt-mac.zip
 [cs_win]: http://gsdview.appspot.com/dartium-archive/continuous/drt-win.zip
 [dartium_src]: http://code.google.com/p/dart/wiki/BuildingDartium
-[TodoMVC]: http://addyosmani.github.com/todomvc/
+[TodoMVC]: http://todomvc.com/
 [issues]: http://dartbug.com/new
 [mailinglist]: https://groups.google.com/a/dartlang.org/forum/?fromgroups#!forum/web-ui
 [devlist]: https://groups.google.com/a/dartlang.org/forum/?fromgroups#!forum/web-ui-dev
diff --git a/pkg/polymer/bin/new_element.dart b/pkg/polymer/bin/new_element.dart
index 846b955..2440cdd 100644
--- a/pkg/polymer/bin/new_element.dart
+++ b/pkg/polymer/bin/new_element.dart
@@ -10,16 +10,27 @@
 import 'package:args/args.dart';
 import 'package:path/path.dart' as path show absolute, dirname, join, split;
 
+void printUsage(ArgParser parser) {
+  print('pub run polymer:new_element [-o output_dir] [-e super-element] '
+        'element-name');
+  print(parser.getUsage());
+}
+
 void main(List<String> args) {
   var parser = new ArgParser(allowTrailingOptions: true);
   
   parser.addOption('output-dir', abbr: 'o', help: 'Output directory');
   parser.addOption('extends', abbr: 'e', 
       help: 'Extends polymer-element or DOM element (e.g., div, span)');
+  parser.addFlag('help', abbr: 'h');
   
   var options, element;
   try {
     options = parser.parse(args);
+    if (options['help']) {
+      printUsage(parser);
+      return;
+    }
     if (options.rest == null || options.rest.isEmpty) {
       throw new FormatException('No element specified');
     }
@@ -30,10 +41,7 @@
     }
   } catch(e) {
     print('$e\n');
-    print('Usage:');
-    print('  pub run polymer:new_element [-o output_dir] [-e super-element] '
-        'element-name');
-    print(parser.getUsage());
+    printUsage(parser);
     exitCode = 1;
     return;
   } 
@@ -172,7 +180,9 @@
 <polymer-element name="$element"$extendsElementString>
   <template>
     <style>
-      <!-- Template styling here -->
+      :host {
+        display: block;
+      }
     </style>$shadowString
     <!-- Template content here -->
   </template>
diff --git a/pkg/polymer/bin/new_entry.dart b/pkg/polymer/bin/new_entry.dart
index 9d610e5..9f299e5 100644
--- a/pkg/polymer/bin/new_entry.dart
+++ b/pkg/polymer/bin/new_entry.dart
@@ -8,12 +8,39 @@
 ///     pub run polymer:new_entry <html_file>
 ///
 import 'dart:io';
+import 'package:args/args.dart';
 import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 import 'package:source_span/source_span.dart';
 
+void printUsage() {
+  print('pub run polymer:new_entry entry_point_file.html');
+}
+
 void main(List<String> args) {
-  var entryPoint = args[0];
+  var parser = new ArgParser(allowTrailingOptions: true);
+  parser.addFlag('help', abbr: 'h');
+  var entryPoint;
+
+  try {
+    var options = parser.parse(args);
+    if (options['help']) {
+      printUsage();
+      return;
+    }
+    entryPoint = options.rest[0];
+  } catch(e) {
+    print('$e\n');
+    printUsage();
+    exitCode = 1;
+    return;
+  }
+
+  // If the entrypoint file has no extension, add .html to it.
+  if (path.extension(entryPoint) == '') {
+    entryPoint = '${entryPoint}.html';
+  }
+
   var outputDir = path.dirname(entryPoint);
   var outputDirLocation = new Directory(outputDir);
 
@@ -110,8 +137,8 @@
             'for polymer transformer');
       } else {
         var existing = e['polymer']['entry_points'];
-        entryPoints = existing == null ? [] :
-            (existing is String ? [existing] : existing.toList());
+        entryPoints = (existing == null ? [] :
+            (existing is String ? [existing] : existing.toList()));
 
         if (entryPoints.contains(entryPoint)) return false;
         entryPoints.add(entryPoint);
@@ -133,6 +160,7 @@
     // There were no transformers at all.
     insertionPoint = pubspecText.length;
     textToInsert = 'transformers:\n- ';
+    entryPoints = [entryPoint];
   }
 
   // TODO(dgrove): Once dartbug.com/20409 is addressed, use that here.
diff --git a/pkg/polymer/lib/boot.js b/pkg/polymer/lib/boot.js
index 62d72a7..419ebb1 100644
--- a/pkg/polymer/lib/boot.js
+++ b/pkg/polymer/lib/boot.js
@@ -33,7 +33,12 @@
 /// discovered in the HTML document.
 (function() {
   // Only run in Dartium.
-  if (navigator.userAgent.indexOf('(Dart)') === -1) return;
+  if (!navigator.dartEnabled &&
+      // TODO(sigmund): remove userAgent check once 1.6 rolls as stable.
+      // See: dartbug.com/18463
+      (navigator.userAgent.indexOf('(Dart)') === -1)) {
+    return;
+  }
 
   // Extract a Dart import URL from a script tag, which is the 'src' attribute
   // of the script tag, or a data-url with the script contents for inlined code.
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 1456b93..e755e6b 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -170,6 +170,11 @@
         var imported = new DocumentFragment();
         imported.nodes..addAll(doc.head.nodes)..addAll(doc.body.nodes);
         link.replaceWith(imported);
+
+        // Make sure to grab any logs from the inlined import.
+        if (logger is WrappedLogger) {
+          return (logger as WrappedLogger).addLogFilesFromAsset(id);
+        }
       });
     });
   }
@@ -183,7 +188,7 @@
           "Failed to inline stylesheet: $error", asset: id,
           span: link.sourceSpan);
     }).then((css) {
-      if (css == null) return;
+      if (css == null) return null;
       css = new _UrlNormalizer(transform, id, logger).visitCss(css);
       var styleElement = new Element.tag('style')..text = css;
       // Copy over the extra attributes from the link tag to the style tag.
@@ -217,6 +222,7 @@
           scriptIds.add(srcId);
           return true;
         }
+
         return transform.hasInput(srcId).then((exists) {
           if (!exists) {
             logger.warning('Script file at "$src" not found.',
diff --git a/pkg/polymer/lib/src/build/log_injector.css b/pkg/polymer/lib/src/build/log_injector.css
index 9f649fd..c4a9705 100644
--- a/pkg/polymer/lib/src/build/log_injector.css
+++ b/pkg/polymer/lib/src/build/log_injector.css
@@ -5,8 +5,9 @@
   position: fixed;
   bottom: 0;
   right: 0;
-  max-width: 50%;
+  max-width: 50vw;
   z-index: 10000;
+  font-family: sans-serif !important;
 }
 .build-logs .log {
   padding: 0.6em;
@@ -58,7 +59,7 @@
   color: white;
 }
 .build-logs .content {
-  max-height: 500px;
+  max-height: 75vh;
   font-size: 1em;
   overflow-y: auto;
 }
@@ -73,5 +74,5 @@
   padding: 0.4em 0.2em 0.2em 2em;
   white-space: pre;
   display: block;
-  font-family: monospace;
+  font-family: monospace !important;
 }
diff --git a/pkg/polymer/lib/src/build/runner.dart b/pkg/polymer/lib/src/build/runner.dart
index 2a9e18a..dff520b 100644
--- a/pkg/polymer/lib/src/build/runner.dart
+++ b/pkg/polymer/lib/src/build/runner.dart
@@ -346,7 +346,7 @@
       ? [{'method': kind, 'params': {'message': entry.message}}]
       : [{'method': kind,
           'params': {
-            'file': span.sourceUrl,
+            'file': span.sourceUrl.toString(),
             'message': entry.message,
             'line': span.start.line + 1,
             'charStart': span.start.offset,
diff --git a/pkg/polymer/lib/src/build/wrapped_logger.dart b/pkg/polymer/lib/src/build/wrapped_logger.dart
index c732b75..da54f43 100644
--- a/pkg/polymer/lib/src/build/wrapped_logger.dart
+++ b/pkg/polymer/lib/src/build/wrapped_logger.dart
@@ -64,30 +64,40 @@
     });
   }
 
+  // Reads all log files for an Asset into [logs].
+  static Future _readLogFilesForAsset(
+      AssetId id, Transform transform, List<Map> logs, [nextNumber = 1]) {
+    var nextAssetPath = id.addExtension('${common.LOG_EXTENSION}.$nextNumber');
+    return transform.hasInput(nextAssetPath).then((exists) {
+      if (!exists) return null;
+      return transform.readInputAsString(nextAssetPath).then((data) {
+        logs.addAll(JSON.decode(data));
+        return _readLogFilesForAsset(id, transform, logs, ++nextNumber);
+      });
+    });
+  }
+
   // Combines all existing ._buildLogs.* files into a single ._buildLogs file.
-  static Future combineLogFiles(
-      Transform transform, [int nextNumber = 1, List<Map> logs]) {
-    if (logs == null) logs = new List<Map>();
-    var primaryInputId = transform.primaryInput.id;
-    var nextAssetPath =
-        primaryInputId.addExtension('${common.LOG_EXTENSION}.$nextNumber');
-    return transform.readInputAsString(nextAssetPath).then(
-        (data) {
-          logs.addAll(JSON.decode(data));
-          return combineLogFiles(transform, ++nextNumber, logs);
-        },
-        onError: (_) {
-          transform.addOutput(new Asset.fromString(
-              primaryInputId.addExtension(common.LOG_EXTENSION),
-              JSON.encode(logs)));
-        });
+  static Future combineLogFiles(Transform transform) {
+    var logs = new List<Map>();
+    var id = transform.primaryInput.id;
+    return _readLogFilesForAsset(id, transform, logs).then((_) {
+      return transform.addOutput(new Asset.fromString(
+          id.addExtension(common.LOG_EXTENSION),
+          JSON.encode(logs)));
+    });
+  }
+
+  // Reads all logs for an asset and adds them to this loggers log output.
+  Future addLogFilesFromAsset(AssetId id, [int nextNumber = 1]) {
+    return _readLogFilesForAsset(id, _transform, _logs);
   }
 
   void _addLog(AssetId assetId, LogLevel level, String message,
                SourceSpan span) {
     var data = {
         'level': level.name,
-        'message': message,
+        'message': const HtmlEscape().convert(message),
     };
     if (assetId != null) {
       data['assetId'] = {
@@ -103,4 +113,4 @@
     }
     _logs.add(data);
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index a82017b..85f0764 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -205,7 +205,7 @@
 
     _getPublishedProperties(type);
 
-    // merge names from 'attributes' attribute
+    // merge names from 'attributes' attribute into the '_publish' object
     var attrs = element.attributes['attributes'];
     if (attrs != null) {
       // names='a b c' or names='a,b,c'
@@ -489,7 +489,7 @@
 /// Using Polymer's platform/src/ShadowCSS.js passing the style tag's content.
 void _shimShadowDomStyling(DocumentFragment template, String name,
     String extendee) {
-  if (template == null || _ShadowCss == null) return;
+  if (template == null || _ShadowCss == null ||!_hasShadowDomPolyfill) return;
 
   _ShadowCss.callMethod('shimStyling', [template, name, extendee]);
 }
diff --git a/pkg/polymer/lib/src/events.dart b/pkg/polymer/lib/src/events.dart
index ccf0786..881728a 100644
--- a/pkg/polymer/lib/src/events.dart
+++ b/pkg/polymer/lib/src/events.dart
@@ -88,21 +88,28 @@
     eventType = translated != null ? translated : eventType;
 
     return (model, node, oneTime) {
-      var handler = getEventHandler(null, node, path);
-      var sub = node.on[eventType].listen(handler);
+      var eventHandler =
+          Zone.current.bindUnaryCallback(getEventHandler(null, node, path));
+      // TODO(jakemac): Remove this indirection if/when JsFunction gets a
+      // simpler constructor that doesn't pass this, http://dartbug.com/20545.
+      var handler = new JsFunction.withThis((_, e) => eventHandler(e));
+      _PolymerGestures.callMethod(
+          'addEventListener', [node, eventType, handler]);
 
       if (oneTime) return null;
-      return new _EventBindable(sub, path);
+      return new _EventBindable(path, node, eventType, handler);
     };
   }
 }
 
 
 class _EventBindable extends Bindable {
-  StreamSubscription _sub;
   final String _path;
+  final Node _node;
+  final String _eventType;
+  final JsFunction _handler;
 
-  _EventBindable(this._sub, this._path);
+  _EventBindable(this._path, this._node, this._eventType, this._handler);
 
   // TODO(rafaelw): This is really pointless work. Aside from the cost
   // of these allocations, NodeBind is going to setAttribute back to its
@@ -113,10 +120,8 @@
   open(callback) => value;
 
   void close() {
-    if (_sub != null) {
-      _sub.cancel();
-      _sub = null;
-    }
+    _PolymerGestures.callMethod(
+        'removeEventListener', [_node, _eventType, _handler]);
   }
 }
 
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index c089bd2..c9d5ade 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -352,10 +352,7 @@
           'incorrect binding types.');
     }
     prepareElement();
-
-    // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected
-    // https://github.com/Polymer/ShadowDOM/issues/420
-    if (!isTemplateStagingDocument(ownerDocument) || _hasShadowDomPolyfill) {
+    if (!isTemplateStagingDocument(ownerDocument)) {
       makeElementReady();
     }
   }
@@ -374,7 +371,6 @@
     _element = _getDeclaration(_name);
     // install property storage
     createPropertyObserver();
-    // TODO (sorvell): temporarily open observer when created
     openPropertyObserver();
     // install boilerplate attributes
     copyInstanceAttributes();
@@ -524,11 +520,6 @@
   void shadowRootReady(Node root) {
     // locate nodes with id and store references to them in this.$ hash
     marshalNodeReferences(root);
-
-    // set up polymer gestures
-    if (_PolymerGestures != null) {
-      _PolymerGestures.callMethod('register', [root]);
-    }
   }
 
   /// Locate nodes with id and store references to them in [$] hash.
@@ -1026,7 +1017,10 @@
     // by default supports 1 thing being bound.
     events.forEach((type, methodName) {
       // Dart note: the getEventHandler method is on our PolymerExpressions.
-      on[type].listen(element.syntax.getEventHandler(this, this, methodName));
+      _PolymerGestures.callMethod(
+          'addEventListener',
+          [this, type, Zone.current.bindUnaryCallback(
+              element.syntax.getEventHandler(this, this, methodName))]);
     });
   }
 
@@ -1173,7 +1167,7 @@
 
     if (scope == null) return;
 
-    if (_ShadowCss != null) {
+    if (_hasShadowDomPolyfill) {
       cssText = _shimCssText(cssText, scope is ShadowRoot ? scope.host : null);
     }
     var style = element.cssTextToScopeStyle(cssText,
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index ab39540..703f18d 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,37 +1,34 @@
 BUILD LOG
 ---------
-Build Time: 2014-07-24T17:50:13
+Build Time: 2014-08-12T15:26:59
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.21
+nodejs: v0.10.29
 chai: 1.9.1
-grunt-audit: 0.0.3
 grunt: 0.4.5
+grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.3
-grunt-contrib-concat: 0.4.0
-grunt-contrib-uglify: 0.4.0
-grunt-karma: 0.8.3
+grunt-contrib-concat: 0.5.0
+grunt-contrib-uglify: 0.4.1
 grunt-contrib-yuidoc: 0.5.2
+grunt-karma: 0.8.3
 grunt-string-replace: 0.2.7
-karma: 0.12.17
+karma: 0.12.21
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.6
+karma-mocha: 0.1.7
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
-mocha: 1.20.1
+mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-polymer-expressions: 20247f68f0bc401cbca852fb3cfbdf12ec95a135
-polymer-gestures: 1353a3aadee345e3e4cd35f9788d02595a27cb30
-polymer-dev:
-  (0.3.4) 6a3e1b0e2a0bbe546f6896b3f4f064950d7aee8f
-  (with patch for CSP issue) 370b65fa23d6bb283923b10a0b9078863f5e9676
+polymer-expressions: 92f860ef9ff871e4b51fc5da38b2b76ba13ebdbe
+polymer-gestures: a21142376f0c8a9541a2919d3f77ca557d13afe9
+polymer-dev: 5d00e4b0252e443e2ed6d5c4a04a568e72ef3b25
 
 BUILD HASHES
 ============
-build/polymer.js: ebbc1241930fb9a1bd7d216b0e3510dc1d5963da
-(without patch, it would be 3e0477c0b09f5800e359044f3358fd1edc6f8449)
+build/polymer.js: 23408455239101d17426ef7448361730103cb2cf
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 816116f..65d22b9 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -7,10 +7,7 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-window.PolymerGestures = {
-  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)
-};
-PolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };
+window.PolymerGestures = {};
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -26,7 +23,7 @@
 
   // test for full event path support
   var pathTest = document.createElement('meta');
-  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {
+  if (pathTest.createShadowRoot) {
     var sr = pathTest.createShadowRoot();
     var s = document.createElement('span');
     sr.appendChild(s);
@@ -122,25 +119,27 @@
       }
       return this.searchRoot(s, x, y);
     },
-    findScrollAxis: function(inEvent) {
+    findTouchAction: function(inEvent) {
       var n;
       if (HAS_FULL_PATH && inEvent.path) {
         var path = inEvent.path;
         for (var i = 0; i < path.length; i++) {
           n = path[i];
-          if (n._scrollType) {
-            return n._scrollType;
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
           }
         }
       } else {
-        n = scope.wrap(inEvent.currentTarget);
+        n = inEvent.target;
         while(n) {
-          if (n._scrollType) {
-            return n._scrollType;
+          if (n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
           }
           n = n.parentNode || n.host;
         }
       }
+      // auto is default
+      return "auto";
     },
     LCA: function(a, b) {
       if (a === b) {
@@ -253,7 +252,7 @@
 
 (function() {
   function shadowSelector(v) {
-    return 'body /deep/ ' + selector(v);
+    return 'html /deep/ ' + selector(v);
   }
   function selector(v) {
     return '[touch-action="' + v + '"]';
@@ -277,7 +276,6 @@
   ];
   var styles = '';
   // only install stylesheet if the browser has touch action support
-  var head = document.head;
   var hasTouchAction = typeof document.head.style.touchAction === 'string';
   // only add shadow selectors if shadowdom is supported
   var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
@@ -593,9 +591,6 @@
 
   var eventFactory = scope.eventFactory;
 
-  var hasSDPolyfill = scope.hasSDPolyfill;
-  var wrap = scope.wrap;
-
   /**
    * This module is for normalizing events. Mouse and Touch events will be
    * collected here, and fire PointerEvents that have the same semantics, no
@@ -616,6 +611,12 @@
     eventSources: Object.create(null),
     eventSourceList: [],
     gestures: [],
+    // map gesture event -> {listeners: int, index: gestures[int]}
+    dependencyMap: {
+      // make sure down and up are in the map to trigger "register"
+      down: {listeners: 0, index: -1},
+      up: {listeners: 0, index: -1}
+    },
     gestureQueue: [],
     /**
      * Add a new event source that will generate pointer events.
@@ -639,13 +640,20 @@
       }
     },
     registerGesture: function(name, source) {
+      var obj = Object.create(null);
+      obj.listeners = 0;
+      obj.index = this.gestures.length;
+      for (var i = 0, g; i < source.exposes.length; i++) {
+        g = source.exposes[i].toLowerCase();
+        this.dependencyMap[g] = obj;
+      }
       this.gestures.push(source);
     },
-    register: function(element) {
+    register: function(element, initial) {
       var l = this.eventSourceList.length;
       for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
         // call eventsource register
-        es.register.call(es, element);
+        es.register.call(es, element, initial);
       }
     },
     unregister: function(element) {
@@ -676,6 +684,9 @@
       // This is used to prevent multiple dispatch of events from
       // platform events. This can happen when two elements in different scopes
       // are set up to create pointer events, which is relevant to Shadow DOM.
+
+      // TODO(dfreedm): make this check more granular, allow for minimal event generation
+      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc
       if (inEvent._handledByPG) {
         return;
       }
@@ -699,20 +710,10 @@
       }
     },
     addEvent: function(target, eventName) {
-      // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (hasSDPolyfill) {
-        target.addEventListener_(eventName, this.boundHandler);
-      } else {
-        target.addEventListener(eventName, this.boundHandler);
-      }
+      target.addEventListener(eventName, this.boundHandler);
     },
     removeEvent: function(target, eventName) {
-      // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (hasSDPolyfill) {
-        target.removeEventListener_(eventName, this.boundHandler);
-      } else {
-        target.removeEventListener(eventName, this.boundHandler);
-      }
+      target.removeEventListener(eventName, this.boundHandler);
     },
     // EVENT CREATION AND TRACKING
     /**
@@ -754,11 +755,12 @@
           if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {
             eventCopy[p] = eventCopy[p].correspondingUseElement;
           }
-          eventCopy[p] = wrap(eventCopy[p]);
         }
       }
       // keep the semantics of preventDefault
-      eventCopy.preventDefault = inEvent.preventDefault;
+      eventCopy.preventDefault = function() {
+        inEvent.preventDefault();
+      };
       return eventCopy;
     },
     /**
@@ -785,7 +787,7 @@
         for (var j = 0, g, fn; j < this.gestures.length; j++) {
           g = this.gestures[j];
           fn = g[e.type];
-          if (fn) {
+          if (g.enabled && fn) {
             fn.call(g, e);
           }
         }
@@ -803,136 +805,117 @@
   dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
   dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
   scope.dispatcher = dispatcher;
-  scope.register = function(root) {
-    dispatcher.register(root);
-  };
-  scope.unregister = dispatcher.unregister.bind(dispatcher);
-  scope.wrap = wrap;
-})(window.PolymerGestures);
 
-/*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-/**
- * This module uses Mutation Observers to dynamically adjust which nodes will
- * generate Pointer Events.
- *
- * All nodes that wish to generate Pointer Events must have the attribute
- * `touch-action` set to `none`.
- */
-(function(scope) {
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  var map = Array.prototype.map.call.bind(Array.prototype.map);
-  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-  var MO = window.MutationObserver || window.WebKitMutationObserver;
-  var SELECTOR = '[touch-action]';
-  var OBSERVER_INIT = {
-    subtree: true,
-    childList: true,
-    attributes: true,
-    attributeOldValue: true,
-    attributeFilter: ['touch-action']
-  };
-
-  function Installer(add, remove, changed, binder) {
-    this.addCallback = add.bind(binder);
-    this.removeCallback = remove.bind(binder);
-    this.changedCallback = changed.bind(binder);
-    if (MO) {
-      this.observer = new MO(this.mutationWatcher.bind(this));
-    }
-  }
-
-  Installer.prototype = {
-    watchSubtree: function(target) {
-      // Only watch scopes that can target find, as these are top-level.
-      // Otherwise we can see duplicate additions and removals that add noise.
-      //
-      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see
-      // a removal without an insertion when a node is redistributed among
-      // shadows. Since it all ends up correct in the document, watching only
-      // the document will yield the correct mutations to watch.
-      if (scope.targetFinding.canTarget(target)) {
-        this.observer.observe(target, OBSERVER_INIT);
-      }
-    },
-    enableOnSubtree: function(target) {
-      this.watchSubtree(target);
-      if (target === document && document.readyState !== 'complete') {
-        this.installOnLoad();
-      } else {
-        this.installNewSubtree(target);
-      }
-    },
-    installNewSubtree: function(target) {
-      forEach(this.findElements(target), this.addElement, this);
-    },
-    findElements: function(target) {
-      if (target.querySelectorAll) {
-        return target.querySelectorAll(SELECTOR);
-      }
-      return [];
-    },
-    removeElement: function(el) {
-      this.removeCallback(el);
-    },
-    addElement: function(el) {
-      this.addCallback(el);
-    },
-    elementChanged: function(el, oldValue) {
-      this.changedCallback(el, oldValue);
-    },
-    concatLists: function(accum, list) {
-      return accum.concat(toArray(list));
-    },
-    // register all touch-action = none nodes on document load
-    installOnLoad: function() {
-      document.addEventListener('readystatechange', function() {
-        if (document.readyState === 'complete') {
-          this.installNewSubtree(document);
+  /**
+   * Listen for `gesture` on `node` with the `handler` function
+   *
+   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.activateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      var recognizer = dispatcher.gestures[dep.index];
+      if (dep.listeners === 0) {
+        if (recognizer) {
+          recognizer.enabled = true;
         }
-      }.bind(this));
-    },
-    isElement: function(n) {
-      return n.nodeType === Node.ELEMENT_NODE;
-    },
-    flattenMutationTree: function(inNodes) {
-      // find children with touch-action
-      var tree = map(inNodes, this.findElements, this);
-      // make sure the added nodes are accounted for
-      tree.push(filter(inNodes, this.isElement));
-      // flatten the list
-      return tree.reduce(this.concatLists, []);
-    },
-    mutationWatcher: function(mutations) {
-      mutations.forEach(this.mutationHandler, this);
-    },
-    mutationHandler: function(m) {
-      if (m.type === 'childList') {
-        var added = this.flattenMutationTree(m.addedNodes);
-        added.forEach(this.addElement, this);
-        var removed = this.flattenMutationTree(m.removedNodes);
-        removed.forEach(this.removeElement, this);
-      } else if (m.type === 'attributes') {
-        this.elementChanged(m.target, m.oldValue);
       }
+      dep.listeners++;
+      if (!node._pgListeners) {
+        dispatcher.register(node);
+        node._pgListeners = 0;
+      }
+      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes
+      if (recognizer) {
+        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];
+        var actionNode;
+        switch(node.nodeType) {
+          case Node.ELEMENT_NODE:
+            actionNode = node;
+          break;
+          case Node.DOCUMENT_FRAGMENT_NODE:
+            actionNode = node.host;
+          break;
+          default:
+            actionNode = null;
+          break;
+        }
+        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {
+          actionNode.setAttribute('touch-action', touchAction);
+        }
+      }
+      node._pgListeners++;
+    }
+    return Boolean(dep);
+  };
+
+  /**
+   *
+   * Listen for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.addEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.activateGesture(node, gesture);
+      node.addEventListener(gesture, handler, capture);
     }
   };
 
-  if (!MO) {
-    Installer.prototype.watchSubtree = function(){
-      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');
-    };
-  }
+  /**
+   * Tears down the gesture configuration for `node`
+   *
+   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.deactivateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      if (dep.listeners > 0) {
+        dep.listeners--;
+      }
+      if (dep.listeners === 0) {
+        var recognizer = dispatcher.gestures[dep.index];
+        if (recognizer) {
+          recognizer.enabled = false;
+        }
+      }
+      if (node._pgListeners > 0) {
+        node._pgListeners--;
+      }
+      if (node._pgListeners === 0) {
+        dispatcher.unregister(node);
+      }
+    }
+    return Boolean(dep);
+  };
 
-  scope.Installer = Installer;
+  /**
+   * Stop listening for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.removeEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.deactivateGesture(node, gesture);
+      node.removeEventListener(gesture, handler, capture);
+    }
+  };
 })(window.PolymerGestures);
 
 /*
@@ -966,10 +949,12 @@
       'mousemove',
       'mouseup'
     ],
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
     register: function(target) {
-      if (target !== document) {
-        return;
-      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1008,22 +993,31 @@
           this.mouseup(inEvent);
         }
         var e = this.prepareEvent(inEvent);
-        e.target = scope.wrap(scope.findTarget(inEvent));
+        e.target = scope.findTarget(inEvent);
         pointermap.set(this.POINTER_ID, e.target);
         dispatcher.down(e);
       }
     },
     mousemove: function(inEvent) {
       if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        e.target = pointermap.get(this.POINTER_ID);
-        dispatcher.move(e);
+        var target = pointermap.get(this.POINTER_ID);
+        if (target) {
+          var e = this.prepareEvent(inEvent);
+          e.target = target;
+          // handle case where we missed a mouseup
+          if (e.buttons === 0) {
+            dispatcher.cancel(e);
+            this.cleanupMouse();
+          } else {
+            dispatcher.move(e);
+          }
+        }
       }
     },
     mouseup: function(inEvent) {
       if (!this.isEventSimulatedFromTouch(inEvent)) {
         var e = this.prepareEvent(inEvent);
-        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
+        e.relatedTarget = scope.findTarget(inEvent);
         e.target = pointermap.get(this.POINTER_ID);
         dispatcher.up(e);
         this.cleanupMouse();
@@ -1056,10 +1050,9 @@
   var CLICK_COUNT_TIMEOUT = 200;
   var HYSTERESIS = 20;
   var ATTRIB = 'touch-action';
-  var INSTALLER;
-  // maybe one day...
-  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;
-  var CAN_USE_GLOBAL = false;
+  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved
+  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;
+  var HAS_TOUCH_ACTION = false;
 
   // handler block for native touch events
   var touchEvents = {
@@ -1069,74 +1062,35 @@
       'touchend',
       'touchcancel'
     ],
-    register: function(target) {
-      if (CAN_USE_GLOBAL) {
-        dispatcher.listen(target, this.events);
-      } else {
-        INSTALLER.enableOnSubtree(target);
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
+    register: function(target, initial) {
+      if (initial) {
+        return;
       }
+      dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
-      if (CAN_USE_GLOBAL) {
-        dispatcher.unlisten(target, this.events);
-      } else {
-        // TODO(dfreedman): is it worth it to disconnect the MO?
-      }
-    },
-    elementAdded: function(el) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      if (st) {
-        el._scrollType = st;
-        dispatcher.listen(el, this.events);
-        // set touch-action on shadows as well
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-          dispatcher.listen(s, this.events);
-        }, this);
-      }
-    },
-    elementRemoved: function(el) {
-      el._scrollType = undefined;
-      dispatcher.unlisten(el, this.events);
-      // remove touch-action from shadow
-      allShadows(el).forEach(function(s) {
-        s._scrollType = undefined;
-        dispatcher.unlisten(s, this.events);
-      }, this);
-    },
-    elementChanged: function(el, oldValue) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      var oldSt = this.touchActionToScrollType(oldValue);
-      // simply update scrollType if listeners are already established
-      if (st && oldSt) {
-        el._scrollType = st;
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-        }, this);
-      } else if (oldSt) {
-        this.elementRemoved(el);
-      } else if (st) {
-        this.elementAdded(el);
-      }
+      dispatcher.unlisten(target, this.events);
     },
     scrollTypes: {
       EMITTER: 'none',
       XSCROLLER: 'pan-x',
       YSCROLLER: 'pan-y',
-      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/
     },
     touchActionToScrollType: function(touchAction) {
       var t = touchAction;
       var st = this.scrollTypes;
-      if (t === 'none') {
+      if (t === st.EMITTER) {
         return 'none';
       } else if (t === st.XSCROLLER) {
         return 'X';
       } else if (t === st.YSCROLLER) {
         return 'Y';
-      } else if (st.SCROLLER.exec(t)) {
+      } else {
         return 'XY';
       }
     },
@@ -1189,7 +1143,7 @@
             clientX: touch.clientX,
             clientY: touch.clientY,
             path: this.currentTouchEvent.path,
-            target: scope.wrap(this.currentTouchEvent.target)
+            target: this.currentTouchEvent.target
           };
           return scope.findTarget(fastPath);
         } else {
@@ -1206,7 +1160,7 @@
       // Touch identifiers can start at 0.
       // Add 2 to the touch identifier for compatibility.
       var id = e.pointerId = inTouch.identifier + 2;
-      e.target = scope.wrap(this.findTarget(inTouch, id));
+      e.target = this.findTarget(inTouch, id);
       e.bubbles = true;
       e.cancelable = true;
       e.detail = this.clickCount;
@@ -1248,7 +1202,8 @@
     shouldScroll: function(inEvent) {
       if (this.firstXY) {
         var ret;
-        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);
+        var touchAction = scope.targetFinding.findTouchAction(inEvent);
+        var scrollAxis = this.touchActionToScrollType(touchAction);
         if (scrollAxis === 'none') {
           // this element is a touch-action: none, should never scroll
           ret = false;
@@ -1316,8 +1271,12 @@
       dispatcher.down(inPointer);
     },
     touchmove: function(inEvent) {
-      if (CAN_USE_GLOBAL) {
-        this.processTouches(inEvent, this.move);
+      if (HAS_TOUCH_ACTION) {
+        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36
+        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ
+        if (inEvent.cancelable) {
+          this.processTouches(inEvent, this.move);
+        }
       } else {
         if (!this.scrolling) {
           if (this.scrolling === null && this.shouldScroll(inEvent)) {
@@ -1348,7 +1307,7 @@
       this.processTouches(inEvent, this.up);
     },
     up: function(inPointer) {
-      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));
+      inPointer.relatedTarget = scope.findTarget(inPointer);
       dispatcher.up(inPointer);
     },
     cancel: function(inPointer) {
@@ -1382,10 +1341,6 @@
     }
   };
 
-  if (!CAN_USE_GLOBAL) {
-    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
-  }
-
   scope.touchEvents = touchEvents;
 })(window.PolymerGestures);
 
@@ -1439,7 +1394,7 @@
     },
     MSPointerDown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.target = scope.wrap(scope.findTarget(inEvent));
+      e.target = scope.findTarget(inEvent);
       pointermap.set(inEvent.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1450,14 +1405,14 @@
     },
     MSPointerUp: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
+      e.relatedTarget = scope.findTarget(inEvent);
       e.target = pointermap.get(e.pointerId);
       dispatcher.up(e);
       this.cleanup(inEvent.pointerId);
     },
     MSPointerCancel: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
+      e.relatedTarget = scope.findTarget(inEvent);
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1505,7 +1460,7 @@
     },
     pointerdown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.target = scope.wrap(scope.findTarget(inEvent));
+      e.target = scope.findTarget(inEvent);
       pointermap.set(e.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1516,14 +1471,14 @@
     },
     pointerup: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
+      e.relatedTarget = scope.findTarget(inEvent);
       e.target = pointermap.get(e.pointerId);
       dispatcher.up(e);
       this.cleanup(inEvent.pointerId);
     },
     pointercancel: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
+      e.relatedTarget = scope.findTarget(inEvent);
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1549,19 +1504,29 @@
  */
 (function(scope) {
   var dispatcher = scope.dispatcher;
+  var nav = window.navigator;
 
   if (window.PointerEvent) {
     dispatcher.registerSource('pointer', scope.pointerEvents);
-  } else if (window.navigator.msPointerEnabled) {
+  } else if (nav.msPointerEnabled) {
     dispatcher.registerSource('ms', scope.msEvents);
   } else {
     dispatcher.registerSource('mouse', scope.mouseEvents);
     if (window.ontouchstart !== undefined) {
       dispatcher.registerSource('touch', scope.touchEvents);
+      /*
+       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners
+       * Removing it will re-break the nodes
+       *
+       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628
+       */
+      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');
+      if (isSafari) {
+        document.body.addEventListener('touchstart', function(){});
+      }
     }
   }
-
-  dispatcher.register(document);
+  dispatcher.register(document, true);
 })(window.PolymerGestures);
 
 /*
@@ -1679,6 +1644,18 @@
        'move',
        'up',
      ],
+     exposes: [
+      'trackstart',
+      'track',
+      'trackx',
+      'tracky',
+      'trackend'
+     ],
+     defaultActions: {
+       'track': 'none',
+       'trackx': 'pan-y',
+       'tracky': 'pan-x'
+     },
      WIGGLE_THRESHOLD: 4,
      clampDir: function(inDelta) {
        return inDelta > 0 ? 1 : -1;
@@ -1697,33 +1674,42 @@
        var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
        if (dd.x) {
          t.xDirection = this.clampDir(dd.x);
+       } else if (inType === 'trackx') {
+         return;
        }
        if (dd.y) {
          t.yDirection = this.clampDir(dd.y);
+       } else if (inType === 'tracky') {
+         return;
        }
-       var e = eventFactory.makeGestureEvent(inType, {
+       var gestureProto = {
          bubbles: true,
          cancelable: true,
-         dx: d.x,
-         dy: d.y,
-         ddx: dd.x,
-         ddy: dd.y,
-         x: inEvent.x,
-         y: inEvent.y,
-         clientX: inEvent.clientX,
-         clientY: inEvent.clientY,
-         pageX: inEvent.pageX,
-         pageY: inEvent.pageY,
-         screenX: inEvent.screenX,
-         screenY: inEvent.screenY,
-         xDirection: t.xDirection,
-         yDirection: t.yDirection,
          trackInfo: t.trackInfo,
          relatedTarget: inEvent.relatedTarget,
          pointerType: inEvent.pointerType,
          pointerId: inEvent.pointerId,
          _source: 'track'
-       });
+       };
+       if (inType !== 'tracky') {
+         gestureProto.x = inEvent.x;
+         gestureProto.dx = d.x;
+         gestureProto.ddx = dd.x;
+         gestureProto.clientX = inEvent.clientX;
+         gestureProto.pageX = inEvent.pageX;
+         gestureProto.screenX = inEvent.screenX;
+         gestureProto.xDirection = t.xDirection;
+       }
+       if (inType !== 'trackx') {
+         gestureProto.dy = d.y;
+         gestureProto.ddy = dd.y;
+         gestureProto.y = inEvent.y;
+         gestureProto.clientY = inEvent.clientY;
+         gestureProto.pageY = inEvent.pageY;
+         gestureProto.screenY = inEvent.screenY;
+         gestureProto.yDirection = t.yDirection;
+       }
+       var e = eventFactory.makeGestureEvent(inType, gestureProto);
        t.downTarget.dispatchEvent(e);
      },
      down: function(inEvent) {
@@ -1749,11 +1735,14 @@
            // start tracking only if finger moves more than WIGGLE_THRESHOLD
            if (move > this.WIGGLE_THRESHOLD) {
              p.tracking = true;
-             this.fireTrack('trackstart', p.downEvent, p);
-             this.fireTrack('track', inEvent, p);
+             p.lastMoveEvent = p.downEvent;
+             this.fireTrack('trackstart', inEvent, p);
            }
-         } else {
+         }
+         if (p.tracking) {
            this.fireTrack('track', inEvent, p);
+           this.fireTrack('trackx', inEvent, p);
+           this.fireTrack('tracky', inEvent, p);
          }
          p.lastMoveEvent = inEvent;
        }
@@ -1837,6 +1826,11 @@
       'move',
       'up',
     ],
+    exposes: [
+      'hold',
+      'holdpulse',
+      'release'
+    ],
     heldPointer: null,
     holdJob: null,
     pulse: function() {
@@ -1943,6 +1937,9 @@
       'down',
       'up'
     ],
+    exposes: [
+      'tap'
+    ],
     down: function(inEvent) {
       if (inEvent.isPrimary && !inEvent.tapPrevented) {
         pointermap.set(inEvent.pointerId, {
@@ -3327,6 +3324,21 @@
       left = getFn(left);
       right = getFn(right);
 
+      switch (op) {
+        case '||':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) ||
+                right(model, observer, filterRegistry);
+          };
+        case '&&':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) &&
+                right(model, observer, filterRegistry);
+          };
+      }
+
       return function(model, observer, filterRegistry) {
         return binaryOperators[op](left(model, observer, filterRegistry),
                                    right(model, observer, filterRegistry));
@@ -3338,6 +3350,8 @@
       consequent = getFn(consequent);
       alternate = getFn(alternate);
 
+      this.dynamicDeps = true;
+
       return function(model, observer, filterRegistry) {
         return test(model, observer, filterRegistry) ?
             consequent(model, observer, filterRegistry) :
@@ -3653,6 +3667,18 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
+Polymer = {
+  version: '0.3.5-5d00e4b'
+};
+
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
 
 // TODO(sorvell): this ensures Polymer is an object and not a function
 // Platform is currently defining it as a function to allow for async loading
@@ -3954,10 +3980,13 @@
 
 (function(scope) {
 
+  function noopHandler(value) {
+    return value;
+  }
+
   var typeHandlers = {
-    string: function(value) {
-      return value;
-    },
+    string: noopHandler,
+    'undefined': noopHandler,
     date: function(value) {
       return new Date(Date.parse(value) || Date.now());
     },
@@ -4098,13 +4127,15 @@
       * @param {string} type An event name.
       * @param {any} detail
       * @param {Node} onNode Target node.
+      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true
+      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true
       */
     fire: function(type, detail, onNode, bubbles, cancelable) {
       var node = onNode || this;
-      var detail = detail || {};
+      var detail = detail === null || detail === undefined ? {} : detail;
       var event = new CustomEvent(type, {
-        bubbles: (bubbles !== undefined ? bubbles : true), 
-        cancelable: (cancelable !== undefined ? cancelable : true), 
+        bubbles: bubbles !== undefined ? bubbles : true,
+        cancelable: cancelable !== undefined ? cancelable : true,
         detail: detail
       });
       node.dispatchEvent(event);
@@ -4201,8 +4232,7 @@
       // by default supports 1 thing being bound.
       for (var type in events) {
         var methodName = events[type];
-        this.addEventListener(type, this.element.getEventHandler(this, this,
-                                                                 methodName));
+        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));
       }
     },
     // call 'method' or function method on 'obj' with 'args', if the method exists
@@ -4223,6 +4253,10 @@
 
   scope.api.instance.events = events;
 
+  // alias PolymerGestures event listener logic
+  scope.addEventListener = PolymerGestures.addEventListener;
+  scope.removeEventListener = PolymerGestures.removeEventListener;
+
 })(Polymer);
 
 /*

@@ -4739,9 +4773,7 @@
       }
       this.created();
       this.prepareElement();
-      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected
-      // https://github.com/Polymer/ShadowDOM/issues/420
-      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {
+      if (!this.ownerDocument.isStagingDocument) {
         this.makeElementReady();
       }
     },
@@ -4756,7 +4788,6 @@
       this.shadowRoots = {};
       // install property observers
       this.createPropertyObserver();
-      // TODO (sorvell): temporarily open observer when created
       this.openPropertyObserver();
       // install boilerplate attributes
       this.copyInstanceAttributes();
@@ -4781,9 +4812,6 @@
       this.removeAttribute('unresolved');
       // user entry point
       this.ready();
-      // TODO (sorvell): temporarily open observer when created
-      // turn on property observation and take any initial changes
-      //this.openPropertyObserver();
     },
     attachedCallback: function() {
       this.cancelUnbindAll();
@@ -4900,8 +4928,6 @@
     shadowRootReady: function(root) {
       // locate nodes with id and store references to them in this.$ hash
       this.marshalNodeReferences(root);
-      // set up polymer gestures
-      PolymerGestures.register(root);
     },
     // locate nodes with id and store references to them in this.$ hash
     marshalNodeReferences: function(root) {
@@ -4966,7 +4992,8 @@
   // imports
 
   var log = window.logFlags || {};
-  
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
   // magic words
   
   var STYLE_SCOPE_ATTRIBUTE = 'element';
@@ -5014,7 +5041,7 @@
       if (!scope) {
         return;
       }
-      if (window.ShadowDOMPolyfill) {
+      if (hasShadowDOMPolyfill) {
         cssText = shimCssText(cssText, scope.host);
       }
       var style = this.element.cssTextToScopeStyle(cssText,
@@ -5036,7 +5063,7 @@
       return cache[name];
     },
     styleCacheForScope: function(scope) {
-      if (window.ShadowDOMPolyfill) {
+      if (hasShadowDOMPolyfill) {
         var scopeName = scope.host ? scope.host.localName : scope.localName;
         return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
       } else {
@@ -5221,6 +5248,8 @@
   var api = scope.api.instance.styles;
   var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
 
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
   // magic words
 
   var STYLE_SELECTOR = 'style';
@@ -5393,7 +5422,7 @@
       if (scope === document) {
         scope = document.head;
       }
-      if (window.ShadowDOMPolyfill) {
+      if (hasShadowDOMPolyfill) {
         scope = document.head;
       }
       // TODO(sorvell): necessary for IE
@@ -5534,7 +5563,7 @@
 
       return function(model, node, oneTime) {
         var handler = events.getEventHandler(undefined, node, pathString);
-        node.addEventListener(eventType, handler);
+        PolymerGestures.addEventListener(node, eventType, handler);
 
         if (oneTime)
           return;
@@ -5551,7 +5580,7 @@
           open: bindingValue,
           discardChanges: bindingValue,
           close: function() {
-            node.removeEventListener(eventType, handler);
+            PolymerGestures.removeEventListener(node, eventType, handler);
           }
         };
       };
@@ -5642,40 +5671,53 @@
         prototype._publishLC = this.lowerCaseMap(publish);
       }
     },
-    // sync prototype to property descriptors;
-    // desriptor format contains default value and optionally a
-    // hint for reflecting the property to an attribute.
-    // e.g. {foo: 5, bar: {value: true, reflect: true}}
-    // reflect: {foo: true} is also supported
     //
-    requireProperties: function(propertyDescriptors, prototype, base) {
-      // reflected properties
+    // `name: value` entries in the `publish` object may need to generate 
+    // matching properties on the prototype.
+    //
+    // Values that are objects may have a `reflect` property, which
+    // signals that the value describes property control metadata.
+    // In metadata objects, the prototype default value (if any)
+    // is encoded in the `value` property.
+    //
+    // publish: {
+    //   foo: 5, 
+    //   bar: {value: true, reflect: true},
+    //   zot: {}
+    // }
+    //
+    // `reflect` metadata property controls whether changes to the property
+    // are reflected back to the attribute (default false). 
+    //
+    // A value is stored on the prototype unless it's === `undefined`,
+    // in which case the base chain is checked for a value.
+    // If the basal value is also undefined, `null` is stored on the prototype.
+    //
+    // The reflection data is stored on another prototype object, `reflect`
+    // which also can be specified directly.
+    //
+    // reflect: {
+    //   foo: true
+    // }
+    //
+    requireProperties: function(propertyInfos, prototype, base) {
+      // per-prototype storage for reflected properties
       prototype.reflect = prototype.reflect || {};
       // ensure a prototype value for each property
       // and update the property's reflect to attribute status
-      for (var n in propertyDescriptors) {
-        var propertyDescriptor = propertyDescriptors[n];
-        var reflects = this.reflectHintForDescriptor(propertyDescriptor);
-        if (prototype.reflect[n] === undefined && reflects !== undefined) {
-          prototype.reflect[n] = reflects;
+      for (var n in propertyInfos) {
+        var value = propertyInfos[n];
+        // value has metadata if it has a `reflect` property
+        if (value && value.reflect !== undefined) {
+          prototype.reflect[n] = Boolean(value.reflect);
+          value = value.value;
         }
-        if (prototype[n] === undefined) {
-          prototype[n] = this.valueForDescriptor(propertyDescriptor);
+        // only set a value if one is specified
+        if (value !== undefined) {
+          prototype[n] = value;
         }
       }
     },
-    valueForDescriptor: function(propertyDescriptor) {
-      var value = typeof propertyDescriptor === 'object' &&
-          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;
-      return value !== undefined ? value : null;
-    },
-    // returns the value of the descriptor's 'reflect' property or undefined
-    reflectHintForDescriptor: function(propertyDescriptor) {
-      if (typeof propertyDescriptor === 'object' &&
-          propertyDescriptor && propertyDescriptor.reflect !== undefined) {
-        return propertyDescriptor.reflect;
-      }
-    },
     lowerCaseMap: function(properties) {
       var map = {};
       for (var n in properties) {
@@ -5721,14 +5763,12 @@
           this.createPropertyAccessor(n);
         }
       }
-
       var n$ = prototype._computedNames;
       if (n$ && n$.length) {
         for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
           this.createPropertyAccessor(n);
         }
       }
-
     }
   };
 
@@ -5765,35 +5805,27 @@
     },
 
     publishAttributes: function(prototype, base) {
-      // merge names from 'attributes' attribute
+      // merge names from 'attributes' attribute into the 'publish' object
       var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
       if (attributes) {
-        // get properties to publish
-        var publish = prototype.publish || (prototype.publish = {});
+        // create a `publish` object if needed.
+        // the `publish` object is only relevant to this prototype, the 
+        // publishing logic in `declaration/properties.js` is responsible for
+        // managing property values on the prototype chain.
+        // TODO(sjmiles): the `publish` object is later chained to it's 
+        //                ancestor object, presumably this is only for 
+        //                reflection or other non-library uses. 
+        var publish = prototype.publish || (prototype.publish = {}); 
         // names='a b c' or names='a,b,c'
         var names = attributes.split(ATTRIBUTES_REGEX);
         // record each name for publishing
         for (var i=0, l=names.length, n; i<l; i++) {
           // remove excess ws
           n = names[i].trim();
-          // if the user hasn't specified a value, we want to use the
-          // default, unless a superclass has already chosen one
+          // looks weird, but causes n to exist on `publish` if it does not;
+          // a more careful test would need expensive `in` operator
           if (n && publish[n] === undefined) {
-            // TODO(sjmiles): querying native properties on IE11 (and possibly
-            // on other browsers) throws an exception because there is no actual
-            // instance.
-            // In fact, trying to publish native properties is known bad for this
-            // and other reasons, and we need to solve this problem writ large.
-            try {
-              var hasValue = (base[n] !== undefined);
-            } catch(x) {
-              hasValue = false;
-            }
-            // supply an empty 'descriptor' object and let the publishProperties
-            // code determine a default
-            if (!hasValue) {
-              publish[n] = Polymer.nob;
-            }
+            publish[n] = undefined;
           }
         }
       }
@@ -5900,6 +5932,8 @@
   var isBase = scope.isBase;
   var extend = scope.extend;
 
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
   // prototype api
 
   var prototype = {
@@ -5986,7 +6020,7 @@
       // this.$.image.src = this.resolvePath('images/foo.png')
       this.addResolvePathApi();
       // under ShadowDOMPolyfill, transforms to approximate missing CSS features
-      if (window.ShadowDOMPolyfill) {
+      if (hasShadowDOMPolyfill) {
         Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
       }
       // allow custom element access to the declarative context
@@ -6256,9 +6290,6 @@
       if (this.flushing) {
         return;
       }
-      if (flushQueue.length) {
-        console.warn('flushing %s elements', flushQueue.length);
-      }
       this.flushing = true;
       var element;
       while (flushQueue.length) {
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
index f524e1f..23532d4 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -8,7 +8,6 @@
     "../polymer-gestures/src/eventFactory.js",
     "../polymer-gestures/src/pointermap.js",
     "../polymer-gestures/src/dispatcher.js",
-    "../polymer-gestures/src/installer.js",
     "../polymer-gestures/src/mouse.js",
     "../polymer-gestures/src/touch.js",
     "../polymer-gestures/src/ms.js",
@@ -19,6 +18,7 @@
     "../polymer-gestures/src/tap.js",
     "../polymer-expressions/third_party/esprima/esprima.js",
     "../polymer-expressions/src/polymer-expressions.js",
+    "build/polymer-versioned.js",
     "src/boot.js",
     "src/lib/lang.js",
     "src/lib/job.js",
@@ -47,48 +47,48 @@
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACraA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
-    "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
-    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
+    "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
+    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      // TODO(dfreedm): make this check more granular, allow for minimal event generation\n      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (g.enabled && fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (dep.listeners === 0) {\n        if (recognizer) {\n          recognizer.enabled = true;\n        }\n      }\n      dep.listeners++;\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (dep.listeners > 0) {\n        dep.listeners--;\n      }\n      if (dep.listeners === 0) {\n        var recognizer = dispatcher.gestures[dep.index];\n        if (recognizer) {\n          recognizer.enabled = false;\n        }\n      }\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
     "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
-    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.5-5d00e4b'\n};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n",
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n",
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (window.ShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      if (flushQueue.length) {\n        console.warn('flushing %s elements', flushQueue.length);\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 759356b..ce50ae2 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,8 +7,8 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.4-370b65f
-window.PolymerGestures={hasSDPolyfill:Boolean(window.ShadowDOMPolyfill)},PolymerGestures.wrap=PolymerGestures.hasSDPolyfill?ShadowDOMPolyfill.wrapIfNeeded:function(a){return a},function(a){var b=!1,c=document.createElement("meta");if(!a.hasSDPolyfill&&c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findScrollAxis:function(c){var d;if(b&&c.path){for(var e=c.path,f=0;f<e.length;f++)if(d=e[f],d._scrollType)return d._scrollType}else for(d=a.wrap(c.currentTarget);d;){if(d._scrollType)return d._scrollType;d=d.parentNode||d.host}},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"body /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f=(document.head,"string"==typeof document.head.style.touchAction),g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f=a.hasSDPolyfill,g=a.wrap,h={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){this.gestures.push(b)},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){f?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){f?a.removeEventListener_(b,this.boundHandler):a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f=Object.create(null),h=0;h<b.length;h++)e=b[h],f[e]=a[e]||c[h],("target"===e||"relatedTarget"===e)&&(d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement),f[e]=g(f[e]));return f.preventDefault=a.preventDefault,f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d,e=0;e<this.gestures.length;e++)c=this.gestures[e],d=c[a.type],d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};h.boundHandler=h.eventHandler.bind(h),h.boundGestureTrigger=h.gestureTrigger.bind(h),a.dispatcher=h,a.register=function(a){h.register(a)},a.unregister=h.unregister.bind(h),a.wrap=g}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.wrap(a.findTarget(d)),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h=20,i="touch-action",j=!1,k={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){j?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){j&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(i),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(i),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var d={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:a.wrap(this.currentTouchEvent.target)};return a.findTarget(d)}return a.findTarget(b)}return e.get(c)},touchToPointer:function(b){var d=this.currentTouchEvent,e=c.cloneEvent(b),f=e.pointerId=b.identifier+2;e.target=a.wrap(this.findTarget(b,f)),e.bubbles=!0,e.cancelable=!0,e.detail=this.clickCount,e.buttons=this.typeToButtons(d.type),e.width=b.webkitRadiusX||b.radiusX||0,e.height=b.webkitRadiusY||b.radiusY||0,e.pressure=b.webkitForce||b.force||.5,e.isPrimary=this.isPrimaryTouch(b),e.pointerType=this.POINTER_TYPE,e._source="touch";var g=this;return e.preventDefault=function(){g.scrolling=!1,g.firstXY=null,d.preventDefault()},e},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,f,g=0;g<c.length;g++)d=c[g],f=this.touchToPointer(d),"touchstart"===a.type&&e.set(f.pointerId,f.target),e.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findScrollAxis(b);if("none"===d)c=!1;else if("XY"===d)c=!0;else{var e=b.changedTouches[0],f=d,g="Y"===d?"X":"Y",h=Math.abs(e["client"+f]-this.firstXY[f]),i=Math.abs(e["client"+g]-this.firstXY[g]);c=h>=i}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a;c.push(e)}},this),c.forEach(function(a){this.cancel(a),e.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){c.down(a)},touchmove:function(a){if(j)this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=h&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){b.relatedTarget=a.wrap(a.findTarget(b)),c.up(b)},cancel:function(a){c.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};j||(b=new a.Installer(k.elementAdded,k.elementRemoved,k.elementChanged,k)),a.touchEvents=k}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(a.findTarget(d)),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"});e.downTarget.dispatchEvent(h)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(b.tracking)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);
-d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=b}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=b||{},g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];this.addEventListener(c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),(!this.ownerDocument.isStagingDocument||window.ShadowDOMPolyfill)&&this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PolymerGestures.register(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(e),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),this.styleCacheForScope(b)[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(window.ShadowDOMPolyfill){var b=a.host?a.host.localName:a.localName;return g[b]||(g[b]={})}return a._scopeStyles=a._scopeStyles||{}}},g={};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),window.ShadowDOMPolyfill&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)if(f=h[i].trim(),f&&void 0===g[f]){try{var k=void 0!==d[f]}catch(l){k=!1}k||(g[f]=Polymer.nob)}},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),window.ShadowDOMPolyfill&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),g[a]=b}return b},findBasePrototype:function(a){return g[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},g={};f.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=f}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){g.length&&console.warn("flushing %s elements",g.length),this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;
-this.flushing=!1}},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+// @version: 0.3.5-5d00e4b
+window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f=Object.create(null),g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],("target"===e||"relatedTarget"===e)&&d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d,e=0;e<this.gestures.length;e++)c=this.gestures[e],d=c[a.type],c.enabled&&d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};f.boundHandler=f.eventHandler.bind(f),f.boundGestureTrigger=f.gestureTrigger.bind(f),a.dispatcher=f,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){var e=f.gestures[d.index];if(0===d.listeners&&e&&(e.enabled=!0),d.listeners++,a._pgListeners||(f.register(a),a._pgListeners=0),e){var g,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:g=a;break;case Node.DOCUMENT_FRAGMENT_NODE:g=a.host;break;default:g=null}h&&g&&!g.hasAttribute("touch-action")&&g.setAttribute("touch-action",h)}a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=f.dependencyMap[c];if(d){if(d.listeners>0&&d.listeners--,0===d.listeners){var e=f.gestures[d.index];e&&(e.enabled=!1)}a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&f.unregister(a)}return Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;
+if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.3.5-5d00e4b"},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}a.extend=b}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&Platform.templateContent(a)},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenPolymerReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()
+},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
index 5d3998a..59f018e 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -1 +1 @@
-{"version":3,"file":"polymer.js","sources":["../polymer-gestures/src/scope.js","../polymer-gestures/src/targetfind.js","../polymer-gestures/src/touch-action.js","../polymer-gestures/src/eventFactory.js","../polymer-gestures/src/pointermap.js","../polymer-gestures/src/dispatcher.js","../polymer-gestures/src/installer.js","../polymer-gestures/src/mouse.js","../polymer-gestures/src/touch.js","../polymer-gestures/src/ms.js","../polymer-gestures/src/pointer.js","../polymer-gestures/src/platform-events.js","../polymer-gestures/src/track.js","../polymer-gestures/src/hold.js","../polymer-gestures/src/tap.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/boot.js","src/lib/lang.js","src/lib/job.js","src/lib/dom.js","src/lib/super.js","src/lib/deserialize.js","src/api.js","src/instance/utils.js","src/instance/events.js","src/instance/attributes.js","src/instance/properties.js","src/instance/mdv.js","src/instance/base.js","src/instance/styles.js","src/declaration/polymer.js","src/declaration/path.js","src/declaration/styles.js","src/declaration/events.js","src/declaration/properties.js","src/declaration/attributes.js","src/declaration/mdv.js","src/declaration/prototype.js","src/declaration/queue.js","src/declaration/import.js","src/declaration/polymer-element.js","src/lib/auto-binding.js"],"names":[],"mappings":";;;;;;;;;;AASA,OAAA,iBACA,cAAA,QAAA,OAAA,oBAEA,gBAAA,KAAA,gBAAA,cAAA,kBAAA,aAAA,SAAA,GAAA,MAAA,ICHA,SAAA,GACA,GAAA,IAAA,EAGA,EAAA,SAAA,cAAA,OACA,KAAA,EAAA,eAAA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,mBACA,EAAA,SAAA,cAAA,OACA,GAAA,YAAA,GACA,EAAA,iBAAA,WAAA,SAAA,GACA,EAAA,OAEA,EAAA,EAAA,KAAA,KAAA,GAEA,EAAA,mBAEA,IAAA,GAAA,GAAA,aAAA,YAAA,SAAA,GAEA,UAAA,KAAA,YAAA,GACA,EAAA,cAAA,GACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,KAEA,EAAA,IAEA,IAAA,IACA,OAAA,SAAA,GACA,MAAA,GACA,EAAA,YAAA,EAAA,iBADA,QAIA,UAAA,SAAA,GACA,MAAA,IAAA,QAAA,EAAA,mBAEA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OAAA,EACA,OAAA,MAAA,UAAA,GACA,EADA,QAIA,YAAA,SAAA,GACA,GAAA,GAAA,EAAA,eACA,KAAA,EAAA,CACA,GAAA,GAAA,EAAA,cAAA,SACA,KACA,EAAA,EAAA,iBAGA,MAAA,IAEA,WAAA,SAAA,GAEA,IADA,GAAA,MAAA,EAAA,KAAA,OAAA,GACA,GACA,EAAA,KAAA,GACA,EAAA,KAAA,YAAA,EAEA,OAAA,IAEA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,CACA,OAAA,IACA,EAAA,EAAA,iBAAA,EAAA,GACA,EAEA,EAAA,KAAA,gBAAA,GACA,IAAA,WAEA,EAAA,KAAA,YAAA,IAGA,KAAA,WAAA,EAAA,EAAA,IAAA,GAVA,QAaA,MAAA,SAAA,GACA,IAAA,EACA,MAAA,SAIA,KAFA,GAAA,GAAA,EAEA,EAAA,YACA,EAAA,EAAA,UAMA,OAHA,GAAA,UAAA,KAAA,eAAA,EAAA,UAAA,KAAA,yBACA,EAAA,UAEA,GAEA,WAAA,SAAA,GACA,GAAA,GAAA,EAAA,KACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,EAAA,QAAA,EAAA,EAAA,QAEA,EAAA,KAAA,MAAA,EAAA,OAKA,OAHA,GAAA,iBAAA,EAAA,KACA,EAAA,UAEA,KAAA,WAAA,EAAA,EAAA,IAEA,eAAA,SAAA,GACA,GAAA,EACA,IAAA,GAAA,EAAA,MAEA,IAAA,GADA,GAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,GADA,EAAA,EAAA,GACA,EAAA,YACA,MAAA,GAAA,gBAKA,KADA,EAAA,EAAA,KAAA,EAAA,eACA,GAAA,CACA,GAAA,EAAA,YACA,MAAA,GAAA,WAEA,GAAA,EAAA,YAAA,EAAA,OAIA,IAAA,SAAA,EAAA,GACA,GAAA,IAAA,EACA,MAAA,EAEA,IAAA,IAAA,EACA,MAAA,EAEA,IAAA,IAAA,EACA,MAAA,EAEA,KAAA,IAAA,EACA,MAAA,SAGA,IAAA,EAAA,UAAA,EAAA,SAAA,GACA,MAAA,EAEA,IAAA,EAAA,UAAA,EAAA,SAAA,GACA,MAAA,EAEA,IAAA,GAAA,KAAA,MAAA,GACA,EAAA,KAAA,MAAA,GACA,EAAA,EAAA,CAMA,KALA,GAAA,EACA,EAAA,KAAA,KAAA,EAAA,GAEA,EAAA,KAAA,KAAA,GAAA,GAEA,GAAA,GAAA,IAAA,GACA,EAAA,EAAA,YAAA,EAAA,KACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,KAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,IACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,MAAA,SAAA,GAEA,IADA,GAAA,GAAA,EACA,GACA,IACA,EAAA,EAAA,YAAA,EAAA,IAEA,OAAA,IAEA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,EAAA,EAEA,OAAA,KAAA,GAEA,WAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,uBACA,OAAA,GAAA,MAAA,GAAA,GAAA,EAAA,OAAA,EAAA,KAAA,GAAA,GAAA,EAAA,QAGA,GAAA,cAAA,EAOA,EAAA,WAAA,EAAA,WAAA,KAAA,GASA,EAAA,aAAA,EAAA,aAAA,KAAA,GAqBA,EAAA,WAAA,EAAA,YAEA,OAAA,iBCzNA,WACA,QAAA,GAAA,GACA,MAAA,eAAA,EAAA,GAEA,QAAA,GAAA,GACA,MAAA,kBAAA,EAAA,KAEA,QAAA,GAAA,GACA,MAAA,uBAAA,EAAA,mBAAA,EAAA,KAEA,GAAA,IACA,OACA,OACA,QACA,SAEA,KAAA,cACA,WACA,cACA,gBAGA,gBAEA,EAAA,GAGA,GADA,SAAA,KACA,gBAAA,UAAA,KAAA,MAAA,aAEA,GAAA,OAAA,mBAAA,SAAA,KAAA,gBAEA,IAAA,EAAA,CACA,EAAA,QAAA,SAAA,GACA,OAAA,KAAA,GACA,GAAA,EAAA,GAAA,EAAA,GAAA,KACA,IACA,GAAA,EAAA,GAAA,EAAA,GAAA,QAGA,GAAA,EAAA,UAAA,IAAA,GAAA,EAAA,EAAA,MAAA,KACA,IACA,GAAA,EAAA,UAAA,IAAA,GAAA,EAAA,EAAA,MAAA,QAKA,IAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,EACA,SAAA,KAAA,YAAA,OCnCA,SAAA,GAEA,GAAA,IACA,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBACA,QACA,SAGA,IACA,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KACA,EACA,GAGA,EAAA,WAAA,MAAA,eAEA,GAEA,WAAA,EACA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,QAGA,OAFA,GAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,GACA,EAAA,WAAA,EAAA,WAAA,GACA,GAEA,iBAAA,SAAA,EAAA,GACA,EAAA,GAAA,OAAA,OAAA,KAGA,KAAA,GAAA,GADA,EAAA,KAAA,cAAA,EAAA,GACA,EAAA,EAAA,EAAA,OAAA,KAAA,GAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,EAEA,OAAA,IAEA,iBAAA,SAAA,EAAA,GACA,EAAA,GAAA,OAAA,OAAA,KAIA,KAAA,GAAA,GAFA,EAAA,KAAA,cAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,EAEA,GAAA,QAAA,EAAA,SAAA,CAIA,IAAA,GAAA,CAsBA,OApBA,GADA,EAAA,SACA,EAAA,SAEA,EAAA,QAAA,GAAA,EAIA,EAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,QAGA,EAAA,UAAA,EAAA,WAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,OAAA,EAAA,QAAA,EACA,EAAA,SAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,MAAA,EAAA,OAAA,EACA,EAAA,YAAA,EAAA,aAAA,GACA,EAAA,YAAA,EAAA,aAAA,EACA,EAAA,UAAA,EAAA,YAAA,EACA,EAAA,QAAA,EAAA,SAAA,GACA,GAIA,GAAA,aAAA,GACA,OAAA,iBChHA,SAAA,GAGA,QAAA,KACA,GAAA,EAAA,CACA,GAAA,GAAA,GAAA,IAEA,OADA,GAAA,SAAA,EACA,EAEA,KAAA,QACA,KAAA,UATA,GAAA,GAAA,OAAA,KAAA,OAAA,IAAA,UAAA,QACA,EAAA,WAAA,MAAA,MAAA,KAYA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,GACA,KAAA,OAAA,GAAA,GAEA,KAAA,KAAA,KAAA,GACA,KAAA,OAAA,KAAA,KAGA,IAAA,SAAA,GACA,MAAA,MAAA,KAAA,QAAA,GAAA,IAEA,SAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,KACA,KAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,OAAA,EAAA,KAGA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,OAAA,MAAA,OAAA,IAEA,MAAA,WACA,KAAA,KAAA,OAAA,EACA,KAAA,OAAA,OAAA,GAGA,QAAA,SAAA,EAAA,GACA,KAAA,OAAA,QAAA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,KAAA,KAAA,GAAA,OACA,OAEA,SAAA,WACA,MAAA,MAAA,KAAA,SAIA,EAAA,WAAA,GACA,OAAA,iBCzDA,SAAA,GACA,GAAA,IAEA,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBAEA,UAEA,YACA,QACA,SACA,WACA,QACA,QACA,cACA,cACA,YAEA,OACA,SACA,gBACA,QACA,QACA,QACA,YAEA,aACA,eACA,WAGA,IAEA,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KAEA,EAEA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAEA,GACA,KACA,KACA,EACA,EACA,EACA,EACA,cACA,GAGA,EAAA,mBAAA,oBAEA,EAAA,EAAA,aAEA,EAAA,EAAA,cACA,EAAA,EAAA,KAcA,GACA,WAAA,GAAA,GAAA,WACA,SAAA,OAAA,OAAA,MAGA,aAAA,OAAA,OAAA,MACA,mBACA,YACA,gBASA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAAA,MACA,KACA,EAAA,QAAA,SAAA,GACA,EAAA,KACA,KAAA,SAAA,GAAA,EAAA,GAAA,KAAA,KAEA,MACA,KAAA,aAAA,GAAA,EACA,KAAA,gBAAA,KAAA,KAGA,gBAAA,SAAA,EAAA,GACA,KAAA,SAAA,KAAA,IAEA,SAAA,SAAA,GAEA,IAAA,GAAA,GADA,EAAA,KAAA,gBAAA,OACA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,gBAAA,IAAA,IAEA,EAAA,SAAA,KAAA,EAAA,IAGA,WAAA,SAAA,GAEA,IAAA,GAAA,GADA,EAAA,KAAA,gBAAA,OACA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,gBAAA,IAAA,IAEA,EAAA,WAAA,KAAA,EAAA,IAIA,KAAA,SAAA,GACA,KAAA,UAAA,OAAA,IAEA,KAAA,SAAA,GAEA,EAAA,KAAA,OACA,KAAA,iBAAA,IAEA,GAAA,SAAA,GACA,KAAA,UAAA,KAAA,IAEA,OAAA,SAAA,GACA,EAAA,cAAA,EACA,KAAA,UAAA,KAAA,IAGA,aAAA,SAAA,GAIA,IAAA,EAAA,aAAA,CAGA,GAAA,GAAA,EAAA,KACA,EAAA,KAAA,UAAA,KAAA,SAAA,EACA,IACA,EAAA,GAEA,EAAA,cAAA,IAGA,OAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,SAAA,EAAA,IAIA,SAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,YAAA,EAAA,IAGA,SAAA,SAAA,EAAA,GAEA,EACA,EAAA,kBAAA,EAAA,KAAA,cAEA,EAAA,iBAAA,EAAA,KAAA,eAGA,YAAA,SAAA,EAAA,GAEA,EACA,EAAA,qBAAA,EAAA,KAAA,cAEA,EAAA,oBAAA,EAAA,KAAA,eAYA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,EAAA,EAIA,OAHA,GAAA,eAAA,EAAA,eACA,EAAA,aAAA,EAAA,aACA,EAAA,QAAA,EAAA,SAAA,EAAA,OACA,GAGA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,UAAA,EAAA,EACA,OAAA,MAAA,cAAA,IASA,WAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,OAAA,OAAA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,IAIA,WAAA,GAAA,kBAAA,KACA,GAAA,EAAA,YAAA,sBACA,EAAA,GAAA,EAAA,GAAA,yBAEA,EAAA,GAAA,EAAA,EAAA,IAKA,OADA,GAAA,eAAA,EAAA,eACA,GAQA,cAAA,SAAA,GACA,GAAA,GAAA,EAAA,OACA,IAAA,EAAA,CACA,EAAA,cAAA,EAGA,IAAA,GAAA,KAAA,WAAA,EACA,GAAA,OAAA,EACA,KAAA,iBAAA,KAGA,eAAA,WAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,aAAA,OAAA,IAAA,CACA,EAAA,KAAA,aAAA,EACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,KAAA,SAAA,OAAA,IACA,EAAA,KAAA,SAAA,GACA,EAAA,EAAA,EAAA,MACA,GACA,EAAA,KAAA,EAAA,GAIA,KAAA,aAAA,OAAA,GAEA,iBAAA,SAAA,GAEA,KAAA,aAAA,QACA,sBAAA,KAAA,qBAEA,KAAA,aAAA,KAAA,IAGA,GAAA,aAAA,EAAA,aAAA,KAAA,GACA,EAAA,oBAAA,EAAA,eAAA,KAAA,GACA,EAAA,WAAA,EACA,EAAA,SAAA,SAAA,GACA,EAAA,SAAA,IAEA,EAAA,WAAA,EAAA,WAAA,KAAA,GACA,EAAA,KAAA,GACA,OAAA,iBCvSA,SAAA,GAeA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,KAAA,YAAA,EAAA,KAAA,GACA,KAAA,eAAA,EAAA,KAAA,GACA,KAAA,gBAAA,EAAA,KAAA,GACA,IACA,KAAA,SAAA,GAAA,GAAA,KAAA,gBAAA,KAAA,QAnBA,GAAA,GAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SACA,EAAA,MAAA,UAAA,IAAA,KAAA,KAAA,MAAA,UAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,KAAA,MAAA,UAAA,OACA,EAAA,MAAA,UAAA,OAAA,KAAA,KAAA,MAAA,UAAA,QACA,EAAA,OAAA,kBAAA,OAAA,uBACA,EAAA,iBACA,GACA,SAAA,EACA,WAAA,EACA,YAAA,EACA,mBAAA,EACA,iBAAA,gBAYA,GAAA,WACA,aAAA,SAAA,GAQA,EAAA,cAAA,UAAA,IACA,KAAA,SAAA,QAAA,EAAA,IAGA,gBAAA,SAAA,GACA,KAAA,aAAA,GACA,IAAA,UAAA,aAAA,SAAA,WACA,KAAA,gBAEA,KAAA,kBAAA,IAGA,kBAAA,SAAA,GACA,EAAA,KAAA,aAAA,GAAA,KAAA,WAAA,OAEA,aAAA,SAAA,GACA,MAAA,GAAA,iBACA,EAAA,iBAAA,OAIA,cAAA,SAAA,GACA,KAAA,eAAA,IAEA,WAAA,SAAA,GACA,KAAA,YAAA,IAEA,eAAA,SAAA,EAAA,GACA,KAAA,gBAAA,EAAA,IAEA,YAAA,SAAA,EAAA,GACA,MAAA,GAAA,OAAA,EAAA,KAGA,cAAA,WACA,SAAA,iBAAA,mBAAA,WACA,aAAA,SAAA,YACA,KAAA,kBAAA,WAEA,KAAA,QAEA,UAAA,SAAA,GACA,MAAA,GAAA,WAAA,KAAA,cAEA,oBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,EAAA,KAAA,aAAA,KAIA,OAFA,GAAA,KAAA,EAAA,EAAA,KAAA,YAEA,EAAA,OAAA,KAAA,iBAEA,gBAAA,SAAA,GACA,EAAA,QAAA,KAAA,gBAAA,OAEA,gBAAA,SAAA,GACA,GAAA,cAAA,EAAA,KAAA,CACA,GAAA,GAAA,KAAA,oBAAA,EAAA,WACA,GAAA,QAAA,KAAA,WAAA,KACA,IAAA,GAAA,KAAA,oBAAA,EAAA,aACA,GAAA,QAAA,KAAA,cAAA,UACA,eAAA,EAAA,MACA,KAAA,eAAA,EAAA,OAAA,EAAA,YAKA,IACA,EAAA,UAAA,aAAA,WACA,QAAA,KAAA,iGAIA,EAAA,UAAA,GACA,OAAA,iBClHA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WAEA,EAAA,GAEA,GAAA,EAAA,EAAA,EAAA,GAEA,GAAA,CACA,KACA,EAAA,IAAA,GAAA,YAAA,QAAA,QAAA,IAAA,QACA,MAAA,IAGA,GAAA,IACA,WAAA,EACA,aAAA,QACA,QACA,YACA,YACA,WAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,eAEA,0BAAA,SAAA,GAGA,IAAA,GAAA,GAFA,EAAA,KAAA,YACA,EAAA,EAAA,QAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,CAEA,GAAA,GAAA,KAAA,IAAA,EAAA,EAAA,GAAA,EAAA,KAAA,IAAA,EAAA,EAAA,EACA,IAAA,GAAA,GAAA,GAAA,EACA,OAAA,IAIA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAQA,OAPA,GAAA,UAAA,KAAA,WACA,EAAA,WAAA,EACA,EAAA,YAAA,KAAA,aACA,EAAA,QAAA,QACA,IACA,EAAA,QAAA,EAAA,EAAA,QAAA,GAEA,GAEA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAAA,KAAA,WAGA,IACA,KAAA,QAAA,EAEA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,KAAA,WAAA,EAAA,QACA,EAAA,KAAA,KAGA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,KAAA,YACA,EAAA,KAAA,KAGA,QAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,KAAA,YACA,EAAA,GAAA,GACA,KAAA,iBAGA,aAAA,WACA,EAAA,UAAA,KAAA,aAIA,GAAA,YAAA,GACA,OAAA,iBC3FA,SAAA,GACA,GASA,GATA,EAAA,EAAA,WACA,EAAA,EAAA,cAAA,WAAA,KAAA,EAAA,eACA,EAAA,EAAA,WAGA,GAFA,MAAA,UAAA,IAAA,KAAA,KAAA,MAAA,UAAA,KAEA,MACA,EAAA,IACA,EAAA,GACA,EAAA,eAIA,GAAA,EAGA,GACA,QACA,aACA,YACA,WACA,eAEA,SAAA,SAAA,GACA,EACA,EAAA,OAAA,EAAA,KAAA,QAEA,EAAA,gBAAA,IAGA,WAAA,SAAA,GACA,GACA,EAAA,SAAA,EAAA,KAAA,SAKA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,aAAA,GACA,EAAA,KAAA,wBAAA,EACA,KACA,EAAA,YAAA,EACA,EAAA,OAAA,EAAA,KAAA,QAEA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,EACA,EAAA,OAAA,EAAA,KAAA,SACA,QAGA,eAAA,SAAA,GACA,EAAA,YAAA,OACA,EAAA,SAAA,EAAA,KAAA,QAEA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,OACA,EAAA,SAAA,EAAA,KAAA,SACA,OAEA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,GACA,EAAA,KAAA,wBAAA,GACA,EAAA,KAAA,wBAAA,EAEA,IAAA,GACA,EAAA,YAAA,EACA,EAAA,GAAA,QAAA,SAAA,GACA,EAAA,YAAA,GACA,OACA,EACA,KAAA,eAAA,GACA,GACA,KAAA,aAAA,IAGA,aACA,QAAA,OACA,UAAA,QACA,UAAA,QACA,SAAA,uDAEA,wBAAA,SAAA,GACA,GAAA,GAAA,EACA,EAAA,KAAA,WACA,OAAA,SAAA,EACA,OACA,IAAA,EAAA,UACA,IACA,IAAA,EAAA,UACA,IACA,EAAA,SAAA,KAAA,GACA,KADA,QAIA,aAAA,QACA,WAAA,KACA,eAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,YAEA,gBAAA,SAAA,IAEA,IAAA,EAAA,YAAA,IAAA,EAAA,YAAA,EAAA,IAAA,MACA,KAAA,WAAA,EAAA,WACA,KAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,SACA,KAAA,UAAA,KACA,KAAA,0BAGA,qBAAA,SAAA,GACA,EAAA,YACA,KAAA,WAAA,KACA,KAAA,QAAA,KACA,KAAA,oBAGA,WAAA,EACA,QAAA,KACA,gBAAA,WACA,GAAA,GAAA,WACA,KAAA,WAAA,EACA,KAAA,QAAA,MACA,KAAA,KACA,MAAA,QAAA,WAAA,EAAA,IAEA,sBAAA,WACA,KAAA,SACA,aAAA,KAAA,UAGA,cAAA,SAAA,GACA,GAAA,GAAA,CAIA,QAHA,eAAA,GAAA,cAAA,KACA,EAAA,GAEA,GAEA,WAAA,SAAA,EAAA,GACA,GAAA,eAAA,KAAA,kBAAA,KAAA,CACA,GAAA,KAAA,eAAA,GAAA,CACA,GAAA,IACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,KAAA,KAAA,kBAAA,KACA,OAAA,EAAA,KAAA,KAAA,kBAAA,QAEA,OAAA,GAAA,WAAA,GAEA,MAAA,GAAA,WAAA,GAIA,MAAA,GAAA,IAAA,IAEA,eAAA,SAAA,GACA,GAAA,GAAA,KAAA,kBACA,EAAA,EAAA,WAAA,GAIA,EAAA,EAAA,UAAA,EAAA,WAAA,CACA,GAAA,OAAA,EAAA,KAAA,KAAA,WAAA,EAAA,IACA,EAAA,SAAA,EACA,EAAA,YAAA,EACA,EAAA,OAAA,KAAA,WACA,EAAA,QAAA,KAAA,cAAA,EAAA,MACA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EACA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EACA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,GACA,EAAA,UAAA,KAAA,eAAA,GACA,EAAA,YAAA,KAAA,aACA,EAAA,QAAA,OAEA,IAAA,GAAA,IAMA,OALA,GAAA,eAAA,WACA,EAAA,WAAA,EACA,EAAA,QAAA,KACA,EAAA,kBAEA,GAEA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,cACA,MAAA,kBAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,KAAA,eAAA,GACA,eAAA,EAAA,MACA,EAAA,IAAA,EAAA,UAAA,EAAA,QAEA,EAAA,IAAA,EAAA,YACA,EAAA,KAAA,KAAA,IAEA,aAAA,EAAA,MAAA,EAAA,UACA,KAAA,eAAA,IAMA,aAAA,SAAA,GACA,GAAA,KAAA,QAAA,CACA,GAAA,GACA,EAAA,EAAA,cAAA,eAAA,EACA,IAAA,SAAA,EAEA,GAAA,MACA,IAAA,OAAA,EAEA,GAAA,MACA,CACA,GAAA,GAAA,EAAA,eAAA,GAEA,EAAA,EACA,EAAA,MAAA,EAAA,IAAA,IACA,EAAA,KAAA,IAAA,EAAA,SAAA,GAAA,KAAA,QAAA,IACA,EAAA,KAAA,IAAA,EAAA,SAAA,GAAA,KAAA,QAAA,GAGA,GAAA,GAAA,EAEA,MAAA,KAGA,UAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,aAAA,EACA,OAAA,GAUA,cAAA,SAAA,GACA,GAAA,GAAA,EAAA,OAGA,IAAA,EAAA,YAAA,EAAA,OAAA,CACA,GAAA,KACA,GAAA,QAAA,SAAA,EAAA,GAIA,GAAA,IAAA,IAAA,KAAA,UAAA,EAAA,EAAA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,KAAA,KAEA,MACA,EAAA,QAAA,SAAA,GACA,KAAA,OAAA,GACA,EAAA,OAAA,EAAA,eAIA,WAAA,SAAA,GACA,KAAA,cAAA,GACA,KAAA,gBAAA,EAAA,eAAA,IACA,KAAA,gBAAA,GACA,KAAA,YACA,KAAA,aACA,KAAA,eAAA,EAAA,KAAA,QAGA,KAAA,SAAA,GACA,EAAA,KAAA,IAEA,UAAA,SAAA,GACA,GAAA,EACA,KAAA,eAAA,EAAA,KAAA,UAEA,IAAA,KAAA,WAQA,GAAA,KAAA,QAAA,CACA,GAAA,GAAA,EAAA,eAAA,GACA,EAAA,EAAA,QAAA,KAAA,QAAA,EACA,EAAA,EAAA,QAAA,KAAA,QAAA,EACA,EAAA,KAAA,KAAA,EAAA,EAAA,EAAA,EACA,IAAA,IACA,KAAA,YAAA,GACA,KAAA,WAAA,EACA,KAAA,QAAA,WAfA,QAAA,KAAA,WAAA,KAAA,aAAA,GACA,KAAA,WAAA,GAEA,KAAA,WAAA,EACA,EAAA,iBACA,KAAA,eAAA,EAAA,KAAA,QAeA,KAAA,SAAA,GACA,EAAA,KAAA,IAEA,SAAA,SAAA,GACA,KAAA,gBAAA,GACA,KAAA,eAAA,EAAA,KAAA,KAEA,GAAA,SAAA,GACA,EAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,GAAA,IAEA,OAAA,SAAA,GACA,EAAA,OAAA,IAEA,YAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,eAAA,EAAA,KAAA,SAEA,eAAA,SAAA,GACA,EAAA,UAAA,EAAA,WACA,KAAA,qBAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,EAAA,YAAA,YACA,EAAA,EAAA,eAAA,EAEA,IAAA,KAAA,eAAA,GAAA,CAEA,GAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,QACA,GAAA,KAAA,EACA,IAAA,GAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EACA,GAAA,IACA,EAAA,OAAA,EAAA,IAEA,KAAA,KAAA,EAAA,EACA,YAAA,EAAA,KAKA,KACA,EAAA,GAAA,GAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,IAGA,EAAA,YAAA,GACA,OAAA,iBCrVA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WACA,EAAA,OAAA,gBAAA,gBAAA,QAAA,eAAA,qBACA,GACA,QACA,gBACA,gBACA,cACA,mBAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,eACA,GACA,cACA,QACA,MACA,SAEA,aAAA,SAAA,GACA,GAAA,GAAA,CAMA,OALA,GAAA,EAAA,WAAA,GACA,IACA,EAAA,YAAA,KAAA,cAAA,EAAA,cAEA,EAAA,QAAA,KACA,GAEA,QAAA,SAAA,GACA,EAAA,UAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,EAAA,UAAA,EAAA,QACA,EAAA,KAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,KAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,GAAA,GACA,KAAA,QAAA,EAAA,YAEA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,OAAA,GACA,KAAA,QAAA,EAAA,YAIA,GAAA,SAAA,GACA,OAAA,iBCnEA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WACA,GACA,QACA,cACA,cACA,YACA,iBAEA,aAAA,SAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAEA,OADA,GAAA,QAAA,UACA,GAEA,SAAA,SAAA,GACA,IAAA,UAGA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,QAAA,SAAA,GACA,EAAA,UAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,IAAA,EAAA,UAAA,EAAA,QACA,EAAA,KAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,KAAA,IAEA,UAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,GAAA,GACA,KAAA,QAAA,EAAA,YAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,cAAA,EAAA,KAAA,EAAA,WAAA,IACA,EAAA,OAAA,EAAA,IAAA,EAAA,WACA,EAAA,OAAA,GACA,KAAA,QAAA,EAAA,YAIA,GAAA,cAAA,GACA,OAAA,iBClDA,SAAA,GACA,GAAA,GAAA,EAAA,UAEA,QAAA,aACA,EAAA,eAAA,UAAA,EAAA,eACA,OAAA,UAAA,iBACA,EAAA,eAAA,KAAA,EAAA,WAEA,EAAA,eAAA,QAAA,EAAA,aACA,SAAA,OAAA,cACA,EAAA,eAAA,QAAA,EAAA,cAIA,EAAA,SAAA,WACA,OAAA,iBC4EA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,OACA,OACA,MAEA,iBAAA,EACA,SAAA,SAAA,GACA,MAAA,GAAA,EAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,CAKA,OAJA,IAAA,IACA,EAAA,EAAA,MAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,QAEA,EAAA,EAAA,EAAA,IAEA,UAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,KAAA,kBAAA,EAAA,UAAA,GACA,EAAA,KAAA,kBAAA,EAAA,cAAA,EACA,GAAA,IACA,EAAA,WAAA,KAAA,SAAA,EAAA,IAEA,EAAA,IACA,EAAA,WAAA,KAAA,SAAA,EAAA,GAEA,IAAA,GAAA,EAAA,iBAAA,GACA,SAAA,EACA,YAAA,EACA,GAAA,EAAA,EACA,GAAA,EAAA,EACA,IAAA,EAAA,EACA,IAAA,EAAA,EACA,EAAA,EAAA,EACA,EAAA,EAAA,EACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,MAAA,EAAA,MACA,MAAA,EAAA,MACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,WAAA,EAAA,WACA,WAAA,EAAA,WACA,UAAA,EAAA,UACA,cAAA,EAAA,cACA,YAAA,EAAA,YACA,UAAA,EAAA,UACA,QAAA,SAEA,GAAA,WAAA,cAAA,IAEA,KAAA,SAAA,GACA,GAAA,EAAA,YAAA,UAAA,EAAA,YAAA,IAAA,EAAA,SAAA,GAAA,CACA,GAAA,IACA,UAAA,EACA,WAAA,EAAA,OACA,aACA,cAAA,KACA,WAAA,EACA,WAAA,EACA,UAAA,EAEA,GAAA,IAAA,EAAA,UAAA,KAGA,KAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,EAAA,CACA,GAAA,EAAA,SAUA,KAAA,UAAA,QAAA,EAAA,OAVA,CACA,GAAA,GAAA,KAAA,kBAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAEA,GAAA,KAAA,mBACA,EAAA,UAAA,EACA,KAAA,UAAA,aAAA,EAAA,UAAA,GACA,KAAA,UAAA,QAAA,EAAA,IAKA,EAAA,cAAA,IAGA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,KACA,EAAA,UACA,KAAA,UAAA,WAAA,EAAA,GAEA,EAAA,OAAA,EAAA,aAIA,GAAA,gBAAA,QAAA,IACA,OAAA,iBCxJA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,GAEA,WAAA,IAEA,iBAAA,GACA,QACA,OACA,OACA,MAEA,YAAA,KACA,QAAA,KACA,MAAA,WACA,GAAA,GAAA,KAAA,MAAA,KAAA,YAAA,UACA,EAAA,KAAA,KAAA,YAAA,MACA,MAAA,SAAA,EAAA,GACA,KAAA,MAAA,GAEA,OAAA,WACA,cAAA,KAAA,SACA,KAAA,MACA,KAAA,SAAA,WAEA,KAAA,MAAA,EACA,KAAA,YAAA,KACA,KAAA,OAAA,KACA,KAAA,QAAA,MAEA,KAAA,SAAA,GACA,EAAA,YAAA,KAAA,cACA,KAAA,YAAA,EACA,KAAA,OAAA,EAAA,OACA,KAAA,QAAA,YAAA,KAAA,MAAA,KAAA,MAAA,KAAA,cAGA,GAAA,SAAA,GACA,KAAA,aAAA,KAAA,YAAA,YAAA,EAAA,WACA,KAAA,UAGA,KAAA,SAAA,GACA,GAAA,KAAA,aAAA,KAAA,YAAA,YAAA,EAAA,UAAA,CACA,GAAA,GAAA,EAAA,QAAA,KAAA,YAAA,QACA,EAAA,EAAA,QAAA,KAAA,YAAA,OACA,GAAA,EAAA,EAAA,EAAA,KAAA,kBACA,KAAA,WAIA,SAAA,SAAA,EAAA,GACA,GAAA,IACA,SAAA,EACA,YAAA,EACA,YAAA,KAAA,YAAA,YACA,UAAA,KAAA,YAAA,UACA,EAAA,KAAA,YAAA,QACA,EAAA,KAAA,YAAA,QACA,QAAA,OAEA,KACA,EAAA,SAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,EAAA,EACA,MAAA,OAAA,cAAA,IAGA,GAAA,gBAAA,OAAA,IACA,OAAA,iBCrFA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,OACA,MAEA,KAAA,SAAA,GACA,EAAA,YAAA,EAAA,cACA,EAAA,IAAA,EAAA,WACA,OAAA,EAAA,OACA,QAAA,EAAA,QACA,EAAA,EAAA,QACA,EAAA,EAAA,WAIA,UAAA,SAAA,EAAA,GACA,MAAA,UAAA,EAAA,YAEA,IAAA,EAAA,SAEA,EAAA,cAEA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,GAAA,KAAA,UAAA,EAAA,GAAA,CAEA,GAAA,GAAA,EAAA,cAAA,IAAA,EAAA,OAAA,EAAA,cACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,iBAAA,OACA,SAAA,EACA,YAAA,EACA,EAAA,EAAA,QACA,EAAA,EAAA,QACA,OAAA,EAAA,OACA,YAAA,EAAA,YACA,UAAA,EAAA,UACA,OAAA,EAAA,OACA,QAAA,EAAA,QACA,QAAA,EAAA,QACA,SAAA,EAAA,SACA,QAAA,OAEA,GAAA,cAAA,IAGA,EAAA,OAAA,EAAA,YAIA,GAAA,WAAA,SAAA,GACA,MAAA,YACA,EAAA,cAAA,EACA,EAAA,OAAA,EAAA,aAGA,EAAA,gBAAA,MAAA,IACA,OAAA,iBClEA,SAAA,GACA,YAiEA,SAAA,GAAA,EAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,WAAA,GAIA,QAAA,GAAA,GACA,MAAA,IAAA,IAAA,IAAA,EAMA,QAAA,GAAA,GACA,MAAA,MAAA,GACA,IAAA,GACA,KAAA,GACA,KAAA,GACA,MAAA,GACA,GAAA,MAAA,yGAAA,QAAA,OAAA,aAAA,IAAA,EAKA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GAAA,OAAA,GAAA,OAAA,EAKA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GACA,GAAA,IAAA,IAAA,GACA,GAAA,IAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,MAAA,GAAA,KAAA,GACA,GAAA,IAAA,IAAA,GACA,GAAA,IAAA,KAAA,GACA,GAAA,IAAA,IAAA,EAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAKA,QAAA,KACA,KAAA,EAAA,GAAA,EAAA,EAAA,WAAA,OACA,EAIA,QAAA,KACA,GAAA,GAAA,CAGA,KADA,EAAA,IACA,EAAA,IACA,EAAA,EAAA,WAAA,GACA,EAAA,OACA,CAMA,OAAA,GAAA,MAAA,EAAA,GAGA,QAAA,KACA,GAAA,GAAA,EAAA,CAoBA,OAlBA,GAAA,EAEA,EAAA,IAKA,EADA,IAAA,EAAA,OACA,EAAA,WACA,EAAA,GACA,EAAA,QACA,SAAA,EACA,EAAA,YACA,SAAA,GAAA,UAAA,EACA,EAAA,eAEA,EAAA,YAIA,KAAA,EACA,MAAA,EACA,OAAA,EAAA,IAOA,QAAA,KACA,GAEA,GAEA,EAJA,EAAA,EACA,EAAA,EAAA,WAAA,GAEA,EAAA,EAAA,EAGA,QAAA,GAGA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,KACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IAEA,QADA,GAEA,KAAA,EAAA,WACA,MAAA,OAAA,aAAA,GACA,OAAA,EAAA,GAGA,SAIA,GAHA,EAAA,EAAA,WAAA,EAAA,GAGA,KAAA,EACA,OAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,KAEA,MADA,IAAA,GAEA,KAAA,EAAA,WACA,MAAA,OAAA,aAAA,GAAA,OAAA,aAAA,GACA,OAAA,EAAA,GAGA,KAAA,IACA,IAAA,IAOA,MANA,IAAA,EAGA,KAAA,EAAA,WAAA,MACA,GAGA,KAAA,EAAA,WACA,MAAA,EAAA,MAAA,EAAA,GACA,OAAA,EAAA,KAeA,MAJA,GAAA,EAAA,EAAA,GAIA,IAAA,GAAA,KAAA,QAAA,IAAA,GACA,GAAA,GAEA,KAAA,EAAA,WACA,MAAA,EAAA,EACA,OAAA,EAAA,KAIA,eAAA,QAAA,IAAA,KACA,GAEA,KAAA,EAAA,WACA,MAAA,EACA,OAAA,EAAA,SAIA,MAAA,EAAA,gBAAA,WAIA,QAAA,KACA,GAAA,GAAA,EAAA,CAQA,IANA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,WAAA,KAAA,MAAA,EACA,sEAEA,EAAA,EACA,EAAA,GACA,MAAA,EAAA,CAaA,IAZA,EAAA,EAAA,KACA,EAAA,EAAA,GAIA,MAAA,GAEA,GAAA,EAAA,EAAA,WAAA,KACA,KAAA,EAAA,gBAAA,WAIA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,IAEA,GAAA,EAAA,GAGA,GAAA,MAAA,EAAA,CAEA,IADA,GAAA,EAAA,KACA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,IAEA,GAAA,EAAA,GAGA,GAAA,MAAA,GAAA,MAAA,EAOA,GANA,GAAA,EAAA,KAEA,EAAA,EAAA,IACA,MAAA,GAAA,MAAA,KACA,GAAA,EAAA,MAEA,EAAA,EAAA,WAAA,IACA,KAAA,EAAA,EAAA,WAAA,KACA,GAAA,EAAA,SAGA,MAAA,EAAA,gBAAA,UAQA,OAJA,GAAA,EAAA,WAAA,KACA,KAAA,EAAA,gBAAA,YAIA,KAAA,EAAA,eACA,MAAA,WAAA,GACA,OAAA,EAAA,IAMA,QAAA,KACA,GAAA,GAAA,EAAA,EAAA,EAAA,GAAA,GAAA,CASA,KAPA,EAAA,EAAA,GACA,EAAA,MAAA,GAAA,MAAA,EACA,2CAEA,EAAA,IACA,EAEA,EAAA,GAAA,CAGA,GAFA,EAAA,EAAA,KAEA,IAAA,EAAA,CACA,EAAA,EACA,OACA,GAAA,OAAA,EAEA,GADA,EAAA,EAAA,KACA,GAAA,EAAA,EAAA,WAAA,IA0BA,OAAA,GAAA,OAAA,EAAA,MACA,MA1BA,QAAA,GACA,IAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,GACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,IACA,MACA,KAAA,IACA,GAAA,GACA,MAEA,SACA,GAAA,MAQA,CAAA,GAAA,EAAA,EAAA,WAAA,IACA,KAEA,IAAA,GAQA,MAJA,KAAA,GACA,KAAA,EAAA,gBAAA,YAIA,KAAA,EAAA,cACA,MAAA,EACA,MAAA,EACA,OAAA,EAAA,IAIA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,YACA,EAAA,OAAA,EAAA,SACA,EAAA,OAAA,EAAA,gBACA,EAAA,OAAA,EAAA,YAGA,QAAA,KACA,GAAA,EAIA,OAFA,KAEA,GAAA,GAEA,KAAA,EAAA,IACA,OAAA,EAAA,KAIA,EAAA,EAAA,WAAA,GAGA,KAAA,GAAA,KAAA,GAAA,KAAA,EACA,IAIA,KAAA,GAAA,KAAA,EACA,IAGA,EAAA,GACA,IAKA,KAAA,EACA,EAAA,EAAA,WAAA,EAAA,IACA,IAEA,IAGA,EAAA,GACA,IAGA,KAGA,QAAA,KACA,GAAA,EASA,OAPA,GAAA,EACA,EAAA,EAAA,MAAA,GAEA,EAAA,IAEA,EAAA,EAAA,MAAA,GAEA,EAGA,QAAA,KACA,GAAA,EAEA,GAAA,EACA,EAAA,IACA,EAAA,EAKA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,GACA,EAAA,EAAA,QACA,SACA,SAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,OAAA,sCACA,EAAA,IAOA,MAHA,GAAA,GAAA,OAAA,GACA,EAAA,MAAA,EACA,EAAA,YAAA,EACA,EAKA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,gBAAA,EAAA,OAMA,QAAA,GAAA,GACA,GAAA,GAAA,KACA,EAAA,OAAA,EAAA,YAAA,EAAA,QAAA,IACA,EAAA,GAMA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,YAAA,EAAA,QAAA,EAKA,QAAA,GAAA,GACA,MAAA,GAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAwBA,QAAA,KACA,GAAA,KAIA,KAFA,EAAA,MAEA,EAAA,MACA,EAAA,MACA,IACA,EAAA,KAAA,QAEA,EAAA,KAAA,MAEA,EAAA,MACA,EAAA,KAOA,OAFA,GAAA,KAEA,EAAA,sBAAA,GAKA,QAAA,KACA,GAAA,EAOA,OALA,KACA,EAAA,IAIA,EAAA,OAAA,EAAA,eAAA,EAAA,OAAA,EAAA,eACA,EAAA,cAAA,GAGA,EAAA,iBAAA,EAAA,OAGA,QAAA,KACA,GAAA,GAAA,CAWA,OATA,GAAA,EACA,KAEA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aACA,EAAA,GAGA,EAAA,IACA,EAAA,KACA,EAAA,eAAA,OAAA,EAAA,MAGA,QAAA,KACA,GAAA,KAIA,KAFA,EAAA,MAEA,EAAA,MACA,EAAA,KAAA,KAEA,EAAA,MACA,EAAA,IAMA,OAFA,GAAA,KAEA,EAAA,uBAAA,GAKA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,KAEA,EAAA,KAEA,EAAA,KAEA,EAMA,QAAA,KACA,GAAA,GAAA,EAAA,CAEA,OAAA,GAAA,KACA,KAGA,EAAA,EAAA,KAEA,IAAA,EAAA,WACA,EAAA,EAAA,iBAAA,IAAA,OACA,IAAA,EAAA,eAAA,IAAA,EAAA,eACA,EAAA,EAAA,cAAA,KACA,IAAA,EAAA,QACA,EAAA,UACA,IACA,EAAA,EAAA,wBAEA,IAAA,EAAA,gBACA,EAAA,IACA,EAAA,MAAA,SAAA,EAAA,MACA,EAAA,EAAA,cAAA,IACA,IAAA,EAAA,aACA,EAAA,IACA,EAAA,MAAA,KACA,EAAA,EAAA,cAAA,IACA,EAAA,KACA,EAAA,IACA,EAAA,OACA,EAAA,KAGA,EACA,MAGA,GAAA,MAKA,QAAA,KACA,GAAA,KAIA,IAFA,EAAA,MAEA,EAAA,KACA,KAAA,EAAA,IACA,EAAA,KAAA,OACA,EAAA,OAGA,EAAA,IAMA,OAFA,GAAA,KAEA,EAGA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,IAEA,EAAA,IACA,EAAA,GAGA,EAAA,iBAAA,EAAA,OAGA,QAAA,KAGA,MAFA,GAAA,KAEA,IAGA,QAAA,KACA,GAAA,EAQA,OANA,GAAA,KAEA,EAAA,KAEA,EAAA,KAEA,EAGA,QAAA,KACA,GAAA,GAAA,EAAA,CAIA,KAFA,EAAA,MAGA,GAAA,EAAA,KACA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,OACA,IAAA,EAAA,KACA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,OACA,CAAA,IAAA,EAAA,KAIA,KAHA,GAAA,IACA,EAAA,EAAA,qBAAA,EAAA,GAMA,MAAA,GASA,QAAA,KACA,GAAA,GAAA,CAcA,OAZA,GAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QACA,EAAA,KACA,EAAA,MAAA,EAAA,MAAA,EAAA,MACA,EAAA,IACA,EAAA,IACA,EAAA,EAAA,sBAAA,EAAA,MAAA,IACA,EAAA,WAAA,EAAA,SAAA,EAAA,UACA,KAAA,EAAA,iBAEA,EAAA,KAGA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,CAEA,IAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,EAAA,QACA,MAAA,EAGA,QAAA,EAAA,OACA,IAAA,KACA,EAAA,CACA,MAEA,KAAA,KACA,EAAA,CACA,MAEA,KAAA,KACA,IAAA,KACA,IAAA,MACA,IAAA,MACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,KACA,IAAA,aACA,EAAA,CACA,MAEA,KAAA,KACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,EAAA,CACA,MAEA,KAAA,IACA,IAAA,IACA,IAAA,IACA,EAAA,GAOA,MAAA,GAWA,QAAA,KACA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAMA,IAJA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,GACA,IAAA,EACA,MAAA,EASA,KAPA,EAAA,KAAA,EACA,IAEA,EAAA,IAEA,GAAA,EAAA,EAAA,IAEA,EAAA,EAAA,IAAA,GAAA,CAGA,KAAA,EAAA,OAAA,GAAA,GAAA,EAAA,EAAA,OAAA,GAAA,MACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,MACA,EAAA,EAAA,MACA,EAAA,EAAA,uBAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAIA,GAAA,IACA,EAAA,KAAA,EACA,EAAA,KAAA,GACA,EAAA,IACA,EAAA,KAAA,GAMA,IAFA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,GACA,EAAA,GACA,EAAA,EAAA,uBAAA,EAAA,EAAA,GAAA,MAAA,EAAA,EAAA,GAAA,GACA,GAAA,CAGA,OAAA,GAMA,QAAA,KACA,GAAA,GAAA,EAAA,CAaA,OAXA,GAAA,IAEA,EAAA,OACA,IACA,EAAA,IACA,EAAA,KACA,EAAA,IAEA,EAAA,EAAA,4BAAA,EAAA,EAAA,IAGA,EAaA,QAAA,KACA,GAAA,GAAA,CAUA,OARA,GAAA,IAEA,EAAA,OAAA,EAAA,YACA,EAAA,GAGA,EAAA,EAAA,KAAA,OAEA,EAAA,aAAA,EAAA,MAAA,GAOA,QAAA,KACA,KAAA,EAAA,MACA,IACA,IAqBA,QAAA,KACA,IACA,GAEA,IAAA,GAAA,IACA,KACA,MAAA,EAAA,OAAA,MAAA,EAAA,OACA,EAAA,OAAA,EAAA,WACA,EAAA,IAEA,IACA,OAAA,EAAA,MACA,EAAA,GAEA,EAAA,eAAA,KAKA,EAAA,OAAA,EAAA,KACA,EAAA,GAIA,QAAA,GAAA,GACA,GACA,IAAA,GAAA,IAAA,KACA,GAAA,mBAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,EACA,OAAA,EAAA,QACA,IACA,EAAA,OAAA,EAAA,YACA,EAAA,GACA,EAAA,IAAA,OAGA,GACA,IAAA,GAAA,IACA,KACA,EAAA,mBAAA,EAAA,KAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GAUA,MATA,GAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,OACA,EAAA,KACA,GACA,aAGA,IAx+BA,GAAA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CAEA,IACA,eAAA,EACA,IAAA,EACA,WAAA,EACA,QAAA,EACA,YAAA,EACA,eAAA,EACA,WAAA,EACA,cAAA,GAGA,KACA,EAAA,EAAA,gBAAA,UACA,EAAA,EAAA,KAAA,QACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,aAAA,OACA,EAAA,EAAA,gBAAA,UACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,eAAA,SAEA,GACA,gBAAA,kBACA,iBAAA,mBACA,eAAA,iBACA,sBAAA,wBACA,eAAA,iBACA,oBAAA,sBACA,WAAA,aACA,QAAA,UACA,iBAAA,mBACA,kBAAA,oBACA,iBAAA,mBACA,iBAAA,mBACA,QAAA,UACA,SAAA,WACA,eAAA,iBACA,gBAAA,mBAIA,GACA,gBAAA,sBACA,aAAA,uBACA,cAAA,oCAgrBA,IAAA,IAAA,EAuJA,GAAA,CA6GA,GAAA,SACA,MAAA,IAEA,MC1gCA,SAAA,GACA,YAEA,SAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EACA,KAEA,GADA,EAAA,EAAA,GACA,EAAA,aACA,EAAA,WAAA,KAAA,cACA,aAAA,EAAA,SACA,SAAA,GAAA,WAAA,GACA,KAAA,OAAA,4DAEA,MAAA,GAEA,WADA,SAAA,MAAA,8BAAA,EAAA,GAIA,MAAA,UAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAOA,OANA,GAAA,YAAA,IACA,EAAA,6BAAA,EAAA,WACA,EAAA,aACA,EAAA,6BAAA,EAAA,aAGA,GAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,KAAA,EAAA,CACA,GAAA,GAAA,GAAA,EACA,SAAA,MAAA,EAAA,GACA,EAAA,GAAA,GAAA,GACA,EAAA,GAAA,EAEA,MAAA,GAGA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,SAAA,OAgBA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,KAAA,KAAA,IAAA,GA2BA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,KAAA,EAEA,KAAA,YAAA,kBAAA,IACA,EAAA,aACA,KAAA,YAAA,YAAA,IAEA,KAAA,YACA,KAAA,cACA,YAAA,IAAA,YAAA,MACA,YAAA,IAAA,YAAA,IAEA,KAAA,OAAA,KAAA,WAAA,EAAA,EAAA,GACA,KAAA,UAAA,KAAA,UAAA,KAAA,WACA,EAAA,EAAA,GAuEA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,KAAA,GAAA,EAAA,EAAA,IA0CA,QAAA,KAAA,KAAA,OAAA,mBA0BA,QAAA,GAAA,GACA,MAAA,kBAAA,GAAA,EAAA,EAAA,UAGA,QAAA,KACA,KAAA,WAAA,KACA,KAAA,WACA,KAAA,QACA,KAAA,YAAA,OACA,KAAA,WAAA,OACA,KAAA,WAAA,OACA,KAAA,aAAA,EA0HA,QAAA,GAAA,GACA,KAAA,OAAA,EAUA,QAAA,GAAA,GAIA,GAHA,KAAA,WAAA,EAAA,WACA,KAAA,WAAA,EAAA,YAEA,EAAA,WACA,KAAA,OAAA,uBAEA,MAAA,WAAA,EAAA,WACA,EAAA,KAAA,YAEA,KAAA,QAAA,EAAA,QACA,KAAA,YAAA,EAAA,YAmEA,QAAA,GAAA,GACA,MAAA,QAAA,GAAA,QAAA,SAAA,SAAA,GACA,MAAA,IAAA,EAAA,gBASA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,KACA,OAAA,UAAA,eAAA,KAAA,EAAA,IACA,EAAA,EAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,GACA,OAAA,CAEA,KAAA,QACA,IAAA,OACA,IAAA,OACA,OAAA,EAGA,MAAA,OAAA,OAAA,KAGA,GAFA,EAKA,QAAA,MA5dA,GAAA,GAAA,OAAA,OAAA,KAkBA;EAAA,WACA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GAAA,GAAA,KAAA,KACA,MAAA,SAAA,WACA,MAAA,IAIA,MAAA,MAAA,WASA,EAAA,WACA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GACA,IADA,KAAA,KACA,KAAA,KACA,MAAA,SAAA,SAAA,EAAA,GAIA,MAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,IAIA,MAAA,MAAA,UAGA,SAAA,SAAA,EAAA,GAIA,MAHA,IAAA,KAAA,KAAA,OACA,EAAA,EAAA,EAAA,KAAA,KAAA,IAEA,KAAA,KAAA,aAAA,EAAA,KAqBA,EAAA,WACA,GAAA,YACA,IAAA,KAAA,UAAA,CAEA,GAAA,GAAA,KAAA,iBAAA,GACA,KAAA,OAAA,SAAA,SAAA,KAAA,OAAA,KACA,GAAA,KAAA,KAAA,mBAAA,GACA,KAAA,SAAA,KAAA,KAAA,SAAA,OACA,KAAA,UAAA,KAAA,IAAA,GAGA,MAAA,MAAA,WAGA,QAAA,WACA,IAAA,KAAA,SAAA,CACA,GAAA,GAAA,KAAA,MAEA,IAAA,KAAA,WAAA,CACA,GAAA,GAAA,KAAA,QAEA,MAAA,SAAA,SAAA,EAAA,GAIA,MAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,QAEA,IAAA,KAAA,SAWA,CAEA,GAAA,GAAA,KAAA,QAEA,MAAA,SAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAIA,OAHA,IACA,EAAA,QAAA,GAAA,IAEA,EAAA,EAAA,GAAA,YArBA,CACA,GAAA,GAAA,KAAA,IAAA,KAAA,SAAA,KAEA,MAAA,SAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,OAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,KAgBA,MAAA,MAAA,UAGA,SAAA,SAAA,EAAA,GACA,GAAA,KAAA,WAEA,MADA,MAAA,SAAA,aAAA,EAAA,GACA,CAGA,IAAA,GAAA,KAAA,OAAA,GACA,EAAA,KAAA,mBAAA,GAAA,KAAA,SAAA,KACA,KAAA,SAAA,EACA,OAAA,GAAA,GAAA,IAYA,EAAA,WACA,UAAA,SAAA,EAAA,EAAA,EAAA,EACA,GACA,GAAA,GAAA,EAAA,KAAA,MACA,EAAA,CACA,IAAA,EACA,EAAA,WAGA,IADA,EAAA,EAAA,KAAA,OACA,EAEA,WADA,SAAA,MAAA,mCAAA,KAAA,KAcA,IANA,EACA,EAAA,EAAA,QACA,kBAAA,GAAA,QACA,EAAA,EAAA,OAGA,kBAAA,GAEA,WADA,SAAA,MAAA,mCAAA,KAAA,KAKA,KAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,EAAA,GAGA,OAAA,GAAA,MAAA,EAAA,IAMA,IAAA,IACA,IAAA,SAAA,GAAA,OAAA,GACA,IAAA,SAAA,GAAA,OAAA,GACA,IAAA,SAAA,GAAA,OAAA,IAGA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,IAAA,SAAA,EAAA,GAAA,MAAA,GAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,MAAA,SAAA,EAAA,GAAA,MAAA,KAAA,GACA,MAAA,SAAA,EAAA,GAAA,MAAA,KAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GACA,KAAA,SAAA,EAAA,GAAA,MAAA,IAAA,GAiBA,GAAA,WACA,sBAAA,SAAA,EAAA,GACA,IAAA,EAAA,GACA,KAAA,OAAA,wBAAA,EAIA,OAFA,GAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,MAIA,uBAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,GACA,KAAA,OAAA,wBAAA,EAKA,OAHA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,MAIA,4BAAA,SAAA,EAAA,EAAA,GAKA,MAJA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAIA,iBAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAEA,OADA,GAAA,KAAA,aACA,GAGA,uBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,EAGA,OAFA,GAAA,cACA,KAAA,aAAA,GACA,GAGA,qBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IACA,KAAA,OAAA,mDAEA,IAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAEA,OAAA,UAAA,EAAA,EAAA,GACA,MAAA,GAAA,UAAA,EAAA,EAAA,GAAA,KAIA,cAAA,SAAA,GACA,MAAA,IAAA,GAAA,EAAA,QAGA,sBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAEA,OAAA,UAAA,EAAA,EAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAAA,EAAA,EAAA,GACA,OAAA,KAIA,eAAA,SAAA,EAAA,EAAA,GACA,OACA,IAAA,YAAA,GAAA,EAAA,KAAA,EAAA,MACA,MAAA,IAIA,uBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,MAAA,EAAA,EAAA,GAAA,MAEA,OAAA,UAAA,EAAA,EAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,KACA,EAAA,GAAA,MAAA,EAAA,EAAA,EACA,OAAA,KAIA,aAAA,SAAA,EAAA,GACA,KAAA,QAAA,KAAA,GAAA,GAAA,EAAA,KAGA,mBAAA,SAAA,EAAA,GACA,KAAA,WAAA,EACA,KAAA,WAAA,GAGA,mBAAA,SAAA,EAAA,EAAA,GACA,KAAA,WAAA,EACA,KAAA,WAAA,EACA,KAAA,WAAA,GAGA,eAAA,SAAA,GACA,KAAA,WAAA,GAGA,qBAAA,GAOA,EAAA,WACA,KAAA,WAAA,MAAA,MAAA,QACA,eAAA,WAAA,MAAA,MAAA,QACA,QAAA,aACA,MAAA,cAiBA,EAAA,WACA,WAAA,SAAA,EAAA,EAAA,GAUA,QAAA,KAEA,GAAA,EAEA,MADA,IAAA,EACA,CAGA,GAAA,aACA,EAAA,YAEA,IAAA,GAAA,EAAA,SAAA,EACA,EAAA,YAAA,EAAA,OACA,EAIA,OAHA,GAAA,aACA,EAAA,cAEA,EAGA,QAAA,GAAA,GAEA,MADA,GAAA,SAAA,EAAA,EAAA,GACA,EA9BA,GAAA,EACA,MAAA,MAAA,SAAA,EAAA,OAAA,EAEA,IAAA,GAAA,GAAA,kBAEA,EAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,EACA,EAAA,IA0BA,OAAA,IAAA,mBAAA,EAAA,EAAA,GAAA,IAGA,SAAA,SAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,QAAA,OAAA,IACA,EAAA,KAAA,QAAA,GAAA,UAAA,EAAA,EAAA,GACA,GAAA,GAGA,OAAA,IAGA,SAAA,SAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,KAAA,QAAA,KAAA,QAAA,OAAA,EACA,IAAA,GACA,EAAA,KAAA,QAAA,GAAA,UAAA,EAAA,OACA,GAAA,GAAA,GAGA,OAAA,MAAA,WAAA,SACA,KAAA,WAAA,SAAA,EAAA,GADA,QAeA,IAAA,GAAA,IAAA,KAAA,SAAA,SAAA,IAAA,MAAA,EAiCA,GAAA,WAEA,YAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,KAAA,EAAA,GAAA,KAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAGA,UAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,IACA,EAAA,KAAA,EAEA,OAAA,GAAA,KAAA,MAIA,+BAAA,SAAA,GACA,GAAA,GAAA,EAAA,4BACA,IAAA,EAGA,MAAA,UAAA,EAAA,GACA,EAAA,MAAA,GAAA,IAIA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,EAEA,EAAA,GAAA,EAAA,KAAA,EAAA,MAaA,MAAA,GAAA,EAAA,EAAA,EAAA,KAZA,IAAA,GAAA,EAAA,OACA,MAAA,UAAA,EAAA,EAAA,GACA,GAAA,EACA,MAAA,GAAA,aAAA,EAEA,IAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,IAAA,cAAA,EAAA,MASA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,4BACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,iBACA,EAAA,iBAAA,MACA,EAAA,MAEA,EAAA,EAAA,4BAEA,OAAA,UAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,MAKA,IAAA,GAAA,gBACA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,KAKA,OAJA,GAAA,GAAA,EACA,EAAA,GAAA,OACA,EAAA,GAAA,EACA,EAAA,UAAA,EACA,GAEA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,OAAA,EAOA,OANA,QAAA,eAAA,EAAA,GACA,MAAA,EAAA,cAAA,EAAA,UAAA,IACA,OAAA,eAAA,EAAA,GACA,MAAA,OAAA,cAAA,EAAA,UAAA,IACA,OAAA,eAAA,EAAA,GACA,MAAA,EAAA,cAAA,EAAA,UAAA,IACA,EAGA,GAAA,mBAAA,EACA,EAAA,cAAA,GACA,MChlBA,kBAAA,QAAA,UACA,YCJA,SAAA,GAGA,QAAA,GAAA,EAAA,GAiBA,MAhBA,IAAA,GAEA,OAAA,oBAAA,GAAA,QAAA,SAAA,GAEA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,KAEA,OAAA,eAAA,EAAA,EAAA,GAEA,kBAAA,GAAA,QAEA,EAAA,MAAA,IAAA,MAKA,EAKA,EAAA,OAAA,GAEA,SC3BA,SAAA,GA6CA,QAAA,GAAA,EAAA,EAAA,GAOA,MANA,GACA,EAAA,OAEA,EAAA,GAAA,GAAA,MAEA,EAAA,GAAA,EAAA,GACA,EAzCA,GAAA,GAAA,SAAA,GACA,KAAA,QAAA,EACA,KAAA,cAAA,KAAA,SAAA,KAAA,MAEA,GAAA,WACA,GAAA,SAAA,EAAA,GACA,KAAA,SAAA,CACA,IAAA,EACA,IAMA,EAAA,WAAA,KAAA,cAAA,GACA,KAAA,OAAA,WACA,aAAA,MAPA,EAAA,sBAAA,KAAA,eACA,KAAA,OAAA,WACA,qBAAA,MASA,KAAA,WACA,KAAA,SACA,KAAA,SACA,KAAA,OAAA,OAGA,SAAA,WACA,KAAA,SACA,KAAA,OACA,KAAA,SAAA,KAAA,KAAA,YAiBA,EAAA,IAAA,GAEA,SC3DA,WAEA,GAAA,KAEA,aAAA,SAAA,SAAA,EAAA,GACA,EAAA,GAAA,GAIA,YAAA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,EAAA,GAAA,YAAA,SAEA,OAAA,IAAA,OAAA,eAAA,SAAA,cAAA,IAIA,IAAA,GAAA,MAAA,UAAA,eACA,OAAA,UAAA,gBAAA,WACA,KAAA,cAAA,EACA,EAAA,MAAA,KAAA,aASA,SC5BA,SAAA,GAgBA,QAAA,GAAA,GAMA,GAAA,GAAA,EAAA,OAEA,EAAA,EAAA,IAEA,EAAA,EAAA,MACA,KACA,IACA,EAAA,EAAA,IAAA,EAAA,KAAA,KAAA,IAEA,GACA,QAAA,KAAA,iFAQA,EAAA,EAAA,EAAA,EAAA,EAAA,OAGA,IAAA,GAAA,EAAA,EACA,OAAA,IAEA,EAAA,QAEA,EAAA,EAAA,EAAA,GAIA,EAAA,MAAA,KAAA,QARA,OAYA,QAAA,GAAA,GAEA,IADA,GAAA,GAAA,KAAA,UACA,GAAA,IAAA,YAAA,WAAA,CAGA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,IAAA,kBAAA,GAAA,OAAA,EAAA,QAAA,EACA,MAAA,GAGA,EAAA,EAAA,WAIA,QAAA,GAAA,EAAA,EAAA,GAIA,GAAA,GAAA,EAAA,EAAA,EAAA,EAMA,OALA,GAAA,KAGA,EAAA,GAAA,IAAA,GAEA,EAAA,OAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GAEA,KAAA,GAAA,CACA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,EAEA,GAAA,EAAA,GAMA,MAAA,QAMA,QAAA,GAAA,GACA,MAAA,GAAA,UAkBA,EAAA,MAAA,GAEA,SC3HA,SAAA,GA8CA,QAAA,GAAA,EAAA,GAEA,GAAA,SAAA,EAMA,OAJA,aAAA,QACA,EAAA,QAGA,EAAA,GAAA,EAAA,GApDA,GAAA,IACA,OAAA,SAAA,GACA,MAAA,IAEA,KAAA,SAAA,GACA,MAAA,IAAA,MAAA,KAAA,MAAA,IAAA,KAAA,QAEA,UAAA,SAAA,GACA,MAAA,KAAA,GACA,EAEA,UAAA,GAAA,IAAA,GAEA,OAAA,SAAA,GACA,GAAA,GAAA,WAAA,EAKA,OAHA,KAAA,IACA,EAAA,SAAA,IAEA,MAAA,GAAA,EAAA,GAKA,OAAA,SAAA,EAAA,GACA,GAAA,OAAA,EACA,MAAA,EAEA,KAIA,MAAA,MAAA,MAAA,EAAA,QAAA,KAAA,MACA,MAAA,GAEA,MAAA,KAIA,WAAA,SAAA,EAAA,GACA,MAAA,IAiBA,GAAA,iBAAA,GAEA,SC9DA,SAAA,GAIA,GAAA,GAAA,EAAA,OAIA,IAEA,GAAA,eACA,EAAA,YAEA,EAAA,QAAA,SAAA,EAAA,GACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,KAMA,EAAA,IAAA,GAEA,SCtBA,SAAA,GAEA,GAAA,IASA,MAAA,SAAA,EAAA,EAAA,GAGA,SAAA,QAEA,EAAA,GAAA,EAAA,OAAA,GAAA,EAEA,IAAA,GAAA,YACA,KAAA,IAAA,GAAA,MAAA,KAAA,IACA,KAAA,MAEA,EAAA,EAAA,WAAA,EAAA,GACA,sBAAA,EAEA,OAAA,GAAA,GAAA,GAEA,YAAA,SAAA,GACA,EAAA,EACA,sBAAA,GAEA,aAAA,IAWA,KAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,EAAA,MACA,EAAA,GAAA,aAAA,GACA,QAAA,SAAA,EAAA,GAAA,EACA,WAAA,SAAA,EAAA,GAAA,EACA,OAAA,GAGA,OADA,GAAA,cAAA,GACA,GASA,UAAA,WACA,KAAA,MAAA,OAAA,YASA,aAAA,SAAA,EAAA,EAAA,GACA,GACA,EAAA,UAAA,OAAA,GAEA,GACA,EAAA,UAAA,IAAA,IASA,gBAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,cAAA,WACA,GAAA,UAAA,CACA,IAAA,GAAA,KAAA,iBAAA,EAKA,OAJA,KACA,EAAA,YAAA,GACA,EAAA,YAAA,IAEA,IAKA,EAAA,aAGA,IAIA,GAAA,YAAA,EAAA,MAIA,EAAA,IAAA,SAAA,MAAA,EACA,EAAA,IAAA,EACA,EAAA,IAAA,GAEA,SChHA,SAAA,GAIA,GAAA,GAAA,OAAA,aACA,EAAA,MAGA,GAEA,aAAA,EAEA,iBAAA,WACA,GAAA,GAAA,KAAA,cACA,GAAA,QAAA,OAAA,KAAA,GAAA,OAAA,GAAA,QAAA,IAAA,yBAAA,KAAA,UAAA,EAKA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,MAAA,iBAAA,EAAA,KAAA,QAAA,gBAAA,KAAA,KACA,MAIA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,EAAA,QAAA,QAAA,MAAA,qBAAA,EAAA,UAAA,EACA,IAAA,GAAA,kBAAA,GAAA,EAAA,EAAA,EACA,IACA,EAAA,EAAA,QAAA,QAAA,EAAA,GAEA,EAAA,QAAA,QAAA,WACA,SAAA,UAOA,GAAA,IAAA,SAAA,OAAA,GAEA,SC3CA,SAAA,GAIA,GAAA,IACA,uBAAA,WACA,GAAA,GAAA,KAAA,mBACA,KAAA,GAAA,KAAA,GACA,KAAA,aAAA,IACA,KAAA,aAAA,EAAA,EAAA,KAKA,eAAA,WAGA,GAAA,KAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,IACA,KAAA,oBAAA,EAAA,KAAA,EAAA,QAMA,oBAAA,SAAA,EAAA,GAGA,GAAA,GAAA,KAAA,qBAAA,EACA,IAAA,EAAA,CAIA,GAAA,GAAA,EAAA,OAAA,EAAA,cAAA,EACA,MAGA,IAAA,GAAA,KAAA,GAEA,EAAA,KAAA,iBAAA,EAAA,EAEA,KAAA,IAEA,KAAA,GAAA,KAKA,qBAAA,SAAA,GACA,GAAA,GAAA,KAAA,YAAA,KAAA,WAAA,EAEA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,iBAAA,EAAA,IAEA,eAAA,SAAA,EAAA,GACA,MAAA,YAAA,EACA,EAAA,GAAA,OACA,WAAA,GAAA,aAAA,GACA,SAAA,EACA,EAFA,QAKA,2BAAA,SAAA,GACA,GAAA,SAAA,MAAA,GAEA,EAAA,KAAA,eAAA,KAAA,GAAA,EAEA,UAAA,EACA,KAAA,aAAA,EAAA,GAMA,YAAA,GACA,KAAA,gBAAA,IAOA,GAAA,IAAA,SAAA,WAAA,GAEA,SCvFA,SAAA,GAyBA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,EAAA,IAAA,EAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAKA,QAAA,GAAA,EAAA,GACA,MAAA,UAAA,GAAA,OAAA,EACA,EAEA,OAAA,GAAA,SAAA,EAAA,EAAA,EApCA,GAAA,GAAA,OAAA,aAUA,GACA,OAAA,OACA,KAAA,SACA,KAAA,OACA,SAAA,QAGA,EAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,MAAA,IAqBA,GACA,uBAAA,WACA,GAAA,GAAA,KAAA,aACA,IAAA,GAAA,EAAA,OAAA,CACA,GAAA,GAAA,KAAA,kBAAA,GAAA,mBAAA,EACA,MAAA,iBAAA,EAKA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,QAAA,KAAA,GACA,KAAA,kBAAA,EAAA,KAAA,GAAA,QAIA,qBAAA,WACA,KAAA,mBACA,KAAA,kBAAA,KAAA,KAAA,sBAAA,OAGA,sBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,KAAA,GAAA,KAAA,GAIA,GAFA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,QAAA,GACA,CACA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAEA,MAAA,kBAAA,EAAA,EAAA,GACA,EAAA,KAEA,SAAA,GAAA,OAAA,GAAA,SAAA,GAAA,OAAA,KACA,EAAA,IAAA,EAKA,KAAA,aAAA,GAAA,EAAA,EAAA,eAMA,eAAA,WACA,KAAA,mBACA,KAAA,kBAAA,WAGA,iBAAA,SAAA,GACA,KAAA,QAAA,IACA,KAAA,2BAAA,IAGA,kBAAA,SAAA,EAAA,EAAA,GAEA,GAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAEA,MAAA,QAAA,KACA,EAAA,SAAA,QAAA,IAAA,mDAAA,KAAA,UAAA,GACA,KAAA,mBAAA,EAAA,YAGA,MAAA,QAAA,IAAA,CACA,EAAA,SAAA,QAAA,IAAA,iDAAA,KAAA,UAAA,EAAA,EACA,IAAA,GAAA,GAAA,eAAA,EACA,GAAA,KAAA,SAAA,EAAA,GACA,KAAA,aAAA,GAAA,KACA,MACA,KAAA,sBAAA,EAAA,UAAA,KAIA,yBAAA,SAAA,EAAA,EAAA,GAEA,IAAA,EAAA,EAAA,KAGA,KAAA,iBAAA,EAAA,EAAA,GAEA,SAAA,kBAAA,CAGA,GAAA,GAAA,KAAA,SACA,KACA,EAAA,KAAA,UAAA,OAAA,YAAA,OAEA,EAAA,OAAA,KACA,EAAA,KAAA,EACA,EAAA,SAAA,EAEA,EAAA,OAAA,KAEA,eAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,MAAA,GAAA,CACA,IAAA,GAAA,KAAA,GAEA,EAAA,KACA,EAAA,EAAA,KAAA,SAAA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,yBAAA,EAAA,EAAA,IAGA,IAAA,IAAA,EAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,EAAA,KACA,EAAA,EACA,EAAA,UACA,EAAA,SAAA,IAIA,KAAA,GAAA,EACA,KAAA,yBAAA,EAAA,EAAA,EAEA,IAAA,IACA,MAAA,WACA,EAAA,QACA,EAAA,GAAA,QAIA,OADA,MAAA,iBAAA,GACA,GAEA,yBAAA,WACA,GAAA,KAAA,eAIA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,eAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,eAAA,GACA,EAAA,KAAA,SAAA,EACA,KACA,GAAA,GAAA,mBAAA,cAAA,GACA,EAAA,EAAA,WAAA,KAAA,KAAA,QAAA,OACA,MAAA,eAAA,EAAA,GACA,MAAA,GACA,QAAA,MAAA,qCAAA,MAIA,aAAA,SAAA,EAAA,EAAA,GACA,MAAA,QACA,KAAA,GAAA,GAGA,KAAA,eAAA,EAAA,EAAA,IAEA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,IAAA,CACA,mBAAA,IACA,EAAA,MAAA,KAAA,IAGA,iBAAA,SAAA,GACA,MAAA,MAAA,eAKA,MAAA,WAAA,KAAA,QAJA,KAAA,YAAA,KAOA,eAAA,WACA,GAAA,KAAA,WAAA,CAKA,IAAA,GADA,GAAA,KAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,kBAAA,GAAA,OACA,EAAA,QAIA,KAAA,gBAGA,sBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,kBAAA,KAAA,mBACA,GAAA,GAAA,GAEA,mBAAA,SAAA,GACA,GAAA,GAAA,KAAA,eACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,QACA,EAAA,GAAA,MACA,GAHA,QAMA,oBAAA,WACA,GAAA,KAAA,gBAAA,CACA,IAAA,GAAA,KAAA,MAAA,gBACA,KAAA,mBAAA,EAEA,MAAA,qBAYA,GAAA,IAAA,SAAA,WAAA,GAEA,SClQA,SAAA,GAIA,GAAA,GAAA,OAAA,UAAA,EAGA,GACA,iBAAA,SAAA,GAMA,IAAA,GAJA,GAAA,KAAA,SAAA,EAAA,iBACA,KAAA,QAAA,OACA,EAAA,EAAA,eAAA,KAAA,GACA,EAAA,EAAA,UACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,iBAAA,EAAA,GAEA,OAAA,IAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,qBAAA,EACA,IAAA,EAIA,CAEA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EAUA,OAPA,UAAA,0BAAA,IACA,EAAA,KAAA,EAAA,MACA,KAAA,eAAA,EAAA,IAEA,KAAA,QAAA,IACA,KAAA,2BAAA,GAEA,EAbA,MAAA,MAAA,WAAA,YAgBA,aAAA,WACA,KAAA,oBAEA,eAAA,SAAA,EAAA,GACA,KAAA,UAAA,KAAA,cACA,KAAA,UAAA,GAAA,GAKA,eAAA,WACA,KAAA,WACA,EAAA,QAAA,QAAA,IAAA,sBAAA,KAAA,WACA,KAAA,cAAA,KAAA,IAAA,KAAA,cAAA,KAAA,UAAA,KAGA,UAAA,WACA,KAAA,WACA,KAAA,iBACA,KAAA,sBACA,KAAA,UAAA,IAGA,gBAAA,WACA,MAAA,MAAA,cACA,EAAA,QAAA,QAAA,KAAA,gDAAA,KAAA,aAGA,EAAA,QAAA,QAAA,IAAA,uBAAA,KAAA,gBACA,KAAA,gBACA,KAAA,cAAA,KAAA,cAAA,YAsBA,EAAA,gBAIA,GAAA,YAAA,EACA,EAAA,IAAA,SAAA,IAAA,GAEA,SCnGA,SAAA,GA+NA,QAAA,GAAA,GACA,MAAA,GAAA,eAAA,eAKA,QAAA,MAnOA,GAAA,IACA,aAAA,EACA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,gBAAA,GAIA,MAAA,SAAA,IAAA,KAAA,KAAA,EAAA,EAAA,EAHA,IAAA,GAAA,MAAA,CACA,MAAA,GAAA,QAAA,IAAA,KAAA,KAAA,KAAA,GAAA,EAAA,IAKA,QAAA,QAAA,MAEA,QAAA,aAIA,MAAA,aAEA,gBAAA,WACA,KAAA,kBAAA,KAAA,iBAAA,OACA,QAAA,KAAA,iBAAA,KAAA,UAAA,wGAIA,KAAA,UACA,KAAA,mBAGA,KAAA,cAAA,mBAAA,OAAA,oBACA,KAAA,oBAIA,eAAA,WACA,MAAA,MAAA,qBACA,SAAA,KAAA,2BAAA,KAAA,YAGA,KAAA,kBAAA,EAEA,KAAA,eAEA,KAAA,yBAEA,KAAA,uBAEA,KAAA,yBAEA,KAAA,qBAEA,MAAA,qBAEA,iBAAA,WACA,KAAA,WAGA,KAAA,UAAA,EACA,KAAA,2BAIA,KAAA,kBAAA,KAAA,WAIA,KAAA,gBAAA,cAEA,KAAA,UAKA,iBAAA,WACA,KAAA,kBAEA,KAAA,UACA,KAAA,WAGA,KAAA,aACA,KAAA,cAMA,KAAA,kBACA,KAAA,iBAAA,EACA,KAAA,UACA,KAAA,MAAA,cAIA,iBAAA,WACA,KAAA,gBACA,KAAA,iBAGA,KAAA,UACA,KAAA,WAGA,KAAA,UACA,KAAA,YAIA,oBAAA,WACA,KAAA,oBAGA,iBAAA,WACA,KAAA,oBAGA,wBAAA,WACA,KAAA,oBAGA,qBAAA,WACA,KAAA,oBAGA,kBAAA,SAAA,GACA,GAAA,EAAA,UACA,KAAA,kBAAA,EAAA,WACA,EAAA,iBAAA,KAAA,KAAA,EAAA,WAIA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,cAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,KAAA,mBAAA,EACA,MAAA,YAAA,EAAA,MAAA,IAIA,cAAA,SAAA,GACA,MAAA,GAAA,cAAA,aAGA,mBAAA,SAAA,GACA,GAAA,EAAA,CAEA,GAAA,GAAA,KAAA,mBAKA,EAAA,KAAA,iBAAA,EAMA,OAJA,GAAA,YAAA,GAEA,KAAA,gBAAA,EAAA,GAEA,IAIA,kBAAA,SAAA,EAAA,GACA,GAAA,EAAA,CAKA,KAAA,gBAAA,IAKA,IAAA,GAAA,KAAA,iBAAA,EAUA,OARA,GACA,KAAA,aAAA,EAAA,GAEA,KAAA,YAAA,GAGA,KAAA,gBAAA,MAEA,IAGA,gBAAA,SAAA,GAEA,KAAA,sBAAA,GAEA,gBAAA,SAAA,IAGA,sBAAA,SAAA,GAEA,GAAA,GAAA,KAAA,EAAA,KAAA,KAEA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,IAAA,GAIA,yBAAA,SAAA,GAEA,UAAA,GAAA,UAAA,GACA,KAAA,oBAAA,EAAA,KAAA,aAAA,IAEA,KAAA,kBACA,KAAA,iBAAA,MAAA,KAAA,YAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,kBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,GACA,EAAA,cACA,KAAA,MACA,GAAA,QAAA,GAAA,WAAA,EAAA,SAAA,KAYA,GAAA,UAAA,EACA,EAAA,YAAA,EAIA,EAAA,KAAA,EACA,EAAA,OAAA,EACA,EAAA,IAAA,SAAA,KAAA,GAEA,SC/OA,SAAA,GAwFA,QAAA,GAAA,GACA,MAAA,GAAA,UAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,GAAA,GAAA,CACA,KACA,EAAA,EAAA,UACA,EAAA,EAAA,aAAA,MAEA,IAAA,GAAA,SAAA,UAAA,kBAAA,EAAA,EACA,OAAA,UAAA,UAAA,YAAA,EAAA,GA/FA,GAIA,IAJA,OAAA,aAIA,WACA,EAAA,aAEA,GACA,sBAAA,EAMA,wBAAA,WAEA,GAAA,GAAA,KAAA,gBACA,IAAA,IAAA,KAAA,mBAAA,EAAA,KAAA,WAAA,CAGA,IADA,GAAA,GAAA,EAAA,MAAA,EAAA,GACA,GAAA,EAAA,SACA,GAAA,EAAA,QAAA,gBAAA,GACA,EAAA,EAAA,EAEA,IACA,KAAA,oBAAA,EAAA,KAIA,kBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,iBAAA,EAAA,GAAA,EACA,IAAA,IAAA,KAAA,mBAAA,EAAA,KAAA,UAAA,GAAA,CACA,GAAA,GAAA,EACA,IAAA,YAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,YAAA,WAGA,GAAA,EAAA,WAEA,MAAA,oBAAA,EAAA,EAAA,KAGA,oBAAA,SAAA,EAAA,EAAA,GAGA,GAFA,EAAA,GAAA,KAAA,iBACA,EAAA,GAAA,GACA,EAAA,CAGA,OAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAEA,IAAA,GAAA,KAAA,QAAA,oBAAA,EACA,EACA,SAAA,kBAAA,EAAA,GAEA,KAAA,mBAAA,GAAA,KAAA,UAAA,IAAA,IAEA,eAAA,SAAA,GAGA,IADA,GAAA,GAAA,GAAA,KACA,EAAA,YACA,EAAA,EAAA,UAEA,OAAA,IAEA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,mBAAA,EACA,OAAA,GAAA,IAEA,mBAAA,SAAA,GACA,GAAA,OAAA,kBAAA,CACA,GAAA,GAAA,EAAA,KAAA,EAAA,KAAA,UAAA,EAAA,SACA,OAAA,GAAA,KAAA,EAAA,OAEA,MAAA,GAAA,aAAA,EAAA,mBAKA,IAoBA,GAAA,IAAA,SAAA,OAAA,GAEA,SC1GA,SAAA,GAUA,QAAA,GAAA,EAAA,GACA,GAAA,IAAA,UAAA,QAAA,gBAAA,WAAA,GAAA,CACA,EAAA,CACA,IAAA,GAAA,SAAA,cAGA,IAFA,EAAA,GAAA,EAAA,YAAA,EAAA,WAAA,aACA,EAAA,WAAA,aAAA,QAAA,IACA,EACA,KAAA,sCAGA,GAAA,EAAA,GACA,KAAA,sDAAA,CAGA,GAAA,EAAA,GAEA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAKA,QAAA,GAAA,GACA,EAAA,KACA,EAAA,GAAA,0BACA,GAAA,IAgBA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,MAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAzDA,GAAA,GAAA,EAAA,OA+BA,GA9BA,EAAA,QAiDA,IAYA,GAAA,uBAAA,EACA,EAAA,oBAAA,EAOA,OAAA,QAAA,EAKA,EAAA,QAAA,EAOA,IAAA,GAAA,SAAA,qBACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,MAAA,KAAA,IAIA,SC7FA,SAAA,GAEA,GAAA,IACA,oBAAA,SAAA,GACA,SAAA,YAAA,WAAA,IAEA,kBAAA,WAEA,GAAA,GAAA,KAAA,aAAA,cAAA,GACA,EAAA,GAAA,KAAA,EAAA,KAAA,cAAA,QACA,MAAA,UAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,EAAA,GAAA,EACA,OAAA,GAAA,OAMA,GAAA,IAAA,YAAA,KAAA,GAEA,SCpBA,SAAA,GA0KA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,EAAA,aAAA,QAAA,GAAA,IACA,OAAA,YAAA,EAAA,KAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,IAAA,WACA,EAAA,SAAA,MAEA,OAAA,oBACA,EAAA,SAAA,KAOA,IAAA,GAAA,EAAA,EAAA,aACA,EAAA,EAAA,aAAA,EACA,IACA,EAAA,aAAA,EAAA,EAIA,IAAA,GAAA,EAAA,iBACA,IAAA,IAAA,SAAA,KAAA,CACA,GAAA,GAAA,SAAA,EAAA,IACA,EAAA,SAAA,KAAA,iBAAA,EACA,GAAA,SACA,EAAA,EAAA,EAAA,OAAA,GAAA,oBAGA,EAAA,aAAA,EAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,SACA,EAAA,EAAA,cAAA,EAAA,EAAA,aACA,IAAA,GAAA,EAAA,cAAA,QAEA,OADA,GAAA,YAAA,EACA,EAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,GACA,EAAA,KAAA,EAAA,GADA,OAxNA,GACA,IADA,OAAA,aACA,EAAA,IAAA,SAAA,QACA,EAAA,EAAA,sBAIA,EAAA,QACA,EAAA,UACA,EAAA,uBACA,EAAA,SACA,EAAA,gBAEA,GAEA,WAAA,SAAA,GACA,GAAA,GAAA,KAAA,gBACA,EAAA,GAAA,KAAA,iBACA,IAAA,EAAA,CACA,KAAA,sBAAA,EACA,IAAA,GAAA,KAAA,mBAAA,EACA,IAAA,EAAA,OAAA,CACA,GAAA,GAAA,EAAA,cAAA,OACA,OAAA,UAAA,cAAA,WAAA,EAAA,EAAA,IAGA,GACA,KAGA,sBAAA,SAAA,GAEA,IAAA,GAAA,GAAA,EADA,EAAA,EAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,KAAA,cAAA,SACA,KAAA,eACA,KAAA,oBAAA,EAAA,GACA,EAAA,WAAA,aAAA,EAAA,IAGA,oBAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,IACA,QAAA,EAAA,MAAA,SAAA,EAAA,MACA,EAAA,aAAA,EAAA,KAAA,EAAA,QAIA,mBAAA,SAAA,GACA,GAAA,KACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YAAA,MAAA,IACA,EAAA,KAAA,EAIA,OAAA,IAOA,cAAA,WACA,KAAA,cACA,KAAA,cACA,KAAA,qBACA,KAAA,uBAKA,YAAA,WACA,KAAA,OAAA,KAAA,UAAA,GACA,KAAA,OAAA,QAAA,SAAA,GACA,EAAA,YACA,EAAA,WAAA,YAAA,MAIA,YAAA,WACA,KAAA,OAAA,KAAA,UAAA,EAAA,IAAA,EAAA,KACA,KAAA,OAAA,QAAA,SAAA,GACA,EAAA,YACA,EAAA,WAAA,YAAA,MAaA,mBAAA,WACA,GAAA,GAAA,KAAA,OAAA,OAAA,SAAA,GACA,OAAA,EAAA,aAAA,KAEA,EAAA,KAAA,iBACA,IAAA,EAAA,CACA,GAAA,GAAA,EAIA,IAHA,EAAA,QAAA,SAAA,GACA,GAAA,EAAA,GAAA,OAEA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,KAAA,cACA,GAAA,aAAA,EAAA,EAAA,eAIA,UAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,iBAAA,GAAA,QACA,EAAA,KAAA,iBACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,iBAAA,GAAA,OACA,GAAA,EAAA,OAAA,GAEA,MAAA,GAAA,EAAA,OAAA,GAAA,GAWA,oBAAA,WACA,GAAA,GAAA,KAAA,cAAA,EACA,GAAA,EAAA,SAAA,OAEA,gBAAA,SAAA,GACA,GAAA,GAAA,GAEA,EAAA,IAAA,EAAA,IAAA,EAAA,IACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,IAEA,EAAA,KAAA,OAAA,OAAA,EACA,GAAA,QAAA,SAAA,GACA,GAAA,EAAA,GAAA,QAGA,IAAA,GAAA,KAAA,OAAA,OAAA,EAIA,OAHA,GAAA,QAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAEA,GAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,gBAAA,EACA,OAAA,MAAA,oBAAA,EAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAGA,OAFA,GAAA,aAAA,EAAA,KAAA,aAAA,QACA,IAAA,GACA,KA2DA,EAAA,YAAA,UACA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,uBACA,EAAA,kBAIA,GAAA,IAAA,YAAA,OAAA,EACA,EAAA,kBAAA,GAEA,SCzOA,SAAA,GAIA,GACA,IADA,OAAA,aACA,EAAA,IAAA,SAAA,QACA,EAAA,EAAA,aAGA,MAEA,uBACA,qBACA,sBACA,cACA,aACA,kBACA,QAAA,SAAA,GACA,EAAA,EAAA,eAAA,GAGA,IAAA,IACA,gBAAA,WAEA,GAAA,GAAA,KAAA,UAAA,cAEA,MAAA,sBAAA,IAEA,sBAAA,SAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,KAAA,WAAA,GAAA,IAEA,KAAA,eAAA,EAAA,QAEA,EAAA,KAAA,kBAAA,EAAA,OAAA,EAAA,MAAA,QAAA,KAAA,IACA,QAAA,KAAA,IAAA,SAKA,eAAA,SAAA,GACA,MAAA,IAAA,MAAA,EAAA,IAAA,MAAA,EAAA,IAAA,MAAA,EAAA,IAEA,kBAAA,SAAA,GACA,MAAA,GAAA,MAAA,IAEA,eAAA,SAAA,GACA,KAAA,EAAA,YAAA,CACA,GAAA,EAAA,gBACA,MAAA,GAAA,eAEA,GAAA,EAAA,WAEA,MAAA,GAAA,MAEA,gBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,IACA,OAAA,UAAA,GACA,GAAA,EAAA,cACA,EAAA,EAAA,eAAA,GAGA,IAAA,IAAA,EAAA,EAAA,OAAA,EAAA,cACA,GAAA,eAAA,EAAA,EAAA,KAGA,oBAAA,SAAA,EAAA,GACA,GAAA,KAAA,eAAA,GAAA,CAGA,GAAA,GAAA,KAAA,kBAAA,EACA,GAAA,EAAA,IAAA,CAEA,IAAA,GAAA,IAEA,OAAA,UAAA,EAAA,EAAA,GAWA,QAAA,KACA,MAAA,MAAA,EAAA,MAXA,GAAA,GAAA,EAAA,gBAAA,OAAA,EAAA,EAGA,OAFA,GAAA,iBAAA,EAAA,GAEA,EAAA,QAYA,KAAA,EACA,eAAA,EACA,MAAA,WACA,EAAA,oBAAA,EAAA,SAOA,EAAA,EAAA,MAGA,GAAA,IAAA,YAAA,OAAA,GAEA,SC1GA,SAAA,GAIA,GAAA,IACA,eAAA,SAAA,GAEA,GAAA,GAAA,EAAA,EAAA,OACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,MAAA,MACA,IACA,EAAA,EAAA,YAEA,EAAA,EAAA,MAAA,EAAA,IACA,EAAA,GAAA,EAAA,IAAA,IAIA,iBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,OACA,IAAA,EAAA,CACA,GAAA,KACA,KAAA,GAAA,KAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,GAAA,EAAA,EAGA,GAAA,QAAA,IAGA,qBAAA,SAAA,GACA,GAAA,EAAA,QAAA,CAEA,GAAA,GAAA,EAAA,gBACA,KAAA,GAAA,KAAA,GAAA,QAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,GAIA,GAAA,EAAA,QAAA,CAEA,GAAA,GAAA,EAAA,gBACA,KAAA,GAAA,KAAA,GAAA,QACA,EAAA,KAAA,GAGA,GAAA,EAAA,SAAA,CAEA,GAAA,GAAA,EAAA,iBACA,KAAA,GAAA,KAAA,GAAA,SACA,EAAA,KAAA,KAIA,kBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,OACA,KAEA,KAAA,kBAAA,EAAA,EAAA,GAEA,EAAA,WAAA,KAAA,aAAA,KASA,kBAAA,SAAA,EAAA,GAEA,EAAA,QAAA,EAAA,WAGA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,KAAA,yBAAA,EACA,UAAA,EAAA,QAAA,IAAA,SAAA,IACA,EAAA,QAAA,GAAA,GAEA,SAAA,EAAA,KACA,EAAA,GAAA,KAAA,mBAAA,MAIA,mBAAA,SAAA,GACA,GAAA,GAAA,gBAAA,IACA,EAAA,EAAA,MAAA,CACA,OAAA,UAAA,EAAA,EAAA,MAGA,yBAAA,SAAA,GACA,MAAA,gBAAA,IACA,GAAA,SAAA,EAAA,QACA,EAAA,QAFA,QAKA,aAAA,SAAA,GACA,GAAA,KACA,KAAA,GAAA,KAAA,GACA,EAAA,EAAA,eAAA,CAEA,OAAA,IAEA,uBAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAEA,EAAA,EAAA,IACA,EAAA,EAAA,aACA,GAAA,GAAA,EAAA,GAEA,OAAA,eAAA,EAAA,GACA,IAAA,WACA,GAAA,GAAA,KAAA,EAIA,OAHA,IACA,EAAA,UAEA,KAAA,IAEA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,EACA,IAAA,EAEA,WADA,GAAA,SAAA,EAIA,IAAA,GAAA,KAAA,EAIA,OAHA,MAAA,GAAA,EACA,KAAA,yBAAA,EAAA,EAAA,GAEA,GAEA,cAAA,KAGA,wBAAA,SAAA,GACA,GAAA,GAAA,EAAA,aACA,IAAA,GAAA,EAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,uBAAA,EAIA,IAAA,GAAA,EAAA,cACA,IAAA,GAAA,EAAA,OACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,uBAAA,IASA,GAAA,IAAA,YAAA,WAAA,GAEA,SCnKA,SAAA,GAIA,GAAA,GAAA,aACA,EAAA,OAIA,GAEA,yBAAA,SAAA,GAEA,KAAA,cAAA,EAAA,aAEA,KAAA,cAAA,EAAA,wBAGA,kBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,aAAA,EACA,IAAA,EAMA,IAAA,GAAA,GAJA,EAAA,EAAA,UAAA,EAAA,YAEA,EAAA,EAAA,MAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAKA,GAHA,EAAA,EAAA,GAAA,OAGA,GAAA,SAAA,EAAA,GAAA,CAMA,IACA,GAAA,GAAA,SAAA,EAAA,GACA,MAAA,GACA,GAAA,EAIA,IACA,EAAA,GAAA,QAAA,OAQA,6BAAA,WAKA,IAAA,GAAA,GAHA,EAAA,KAAA,UAAA,oBAEA,EAAA,KAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,oBAAA,EAAA,QACA,EAAA,EAAA,MAAA,EAAA,QAKA,oBAAA,SAAA,GACA,OAAA,KAAA,UAAA,IAAA,QAAA,EAAA,MAAA,EAAA,IAIA,WACA,KAAA,EACA,UAAA,EACA,YAAA,EACA,SAAA,EACA,UAAA,EACA,gBAAA,GAMA,GAAA,UAAA,GAAA,EAIA,EAAA,IAAA,YAAA,WAAA,GAEA,SCxFA,SAAA,GAGA,GAAA,GAAA,EAAA,IAAA,YAAA,OAEA,EAAA,GAAA,oBACA,EAAA,EAAA,cAIA,GAAA,eAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,oBAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAIA,IAAA,IACA,OAAA,EACA,cAAA,WACA,MAAA,MAAA,cAAA,aAEA,gBAAA,WACA,GAAA,GAAA,KAAA,eACA,OAAA,IAAA,SAAA,gBAAA,IAEA,uBAAA,SAAA,GACA,IACA,EAAA,gBAAA,KAAA,SAMA,GAAA,IAAA,YAAA,IAAA,GAEA,SCnCA,SAAA,GAoOA,QAAA,GAAA,GACA,IAAA,OAAA,UAAA,CACA,GAAA,GAAA,OAAA,eAAA,EACA,GAAA,UAAA,EACA,EAAA,KACA,EAAA,UAAA,OAAA,eAAA,KArOA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,OACA,EAAA,EAAA,OAIA,GAEA,SAAA,SAAA,EAAA,GAEA,KAAA,eAAA,EAAA,GAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,sBAGA,eAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,uBAAA,GAEA,EAAA,KAAA,sBAAA,EAEA,MAAA,sBAAA,EAAA,GAEA,KAAA,UAAA,KAAA,gBAAA,EAAA,GAEA,KAAA,qBAAA,EAAA,IAGA,sBAAA,SAAA,EAAA,GAGA,EAAA,QAAA,KAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,kBAAA,EAAA,GAEA,KAAA,eAAA,GAEA,KAAA,iBAAA,IAGA,gBAAA,SAAA,EAAA,GAEA,KAAA,gBAAA,EAAA,EAEA,IAAA,GAAA,KAAA,YAAA,EAAA,EAGA,OADA,GAAA,GACA,GAGA,gBAAA,SAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,UAAA,EAAA,GAEA,KAAA,cAAA,aAAA,EAAA,GAEA,KAAA,cAAA,sBAAA,EAAA,GAEA,KAAA,cAAA,iBAAA,EAAA,IAIA,qBAAA,SAAA,EAAA,GAEA,KAAA,qBAAA,KAAA,WACA,KAAA,wBAAA,KAAA,WAEA,KAAA,uBAAA,KAAA,iBAEA,KAAA,gBAEA,KAAA,oBAAA,MAEA,KAAA,+BAEA,KAAA,kBAKA,KAAA,oBAEA,OAAA,mBACA,SAAA,UAAA,YAAA,KAAA,kBAAA,EAAA,GAGA,KAAA,UAAA,kBACA,KAAA,UAAA,iBAAA,OAMA,mBAAA,WACA,GAAA,GAAA,KAAA,aAAA,cACA,KACA,OAAA,GAAA,KAAA,OAKA,sBAAA,SAAA,GACA,GAAA,GAAA,KAAA,kBAAA,EACA,KAAA,EAAA,CAEA,GAAA,GAAA,YAAA,mBAAA,EAEA,GAAA,KAAA,cAAA,GAEA,EAAA,GAAA,EAEA,MAAA,IAGA,kBAAA,SAAA,GACA,MAAA,GAAA,IAIA,cAAA,SAAA,GACA,GAAA,EAAA,YACA,MAAA,EAEA,IAAA,GAAA,OAAA,OAAA,EAkBA,OAfA,GAAA,QAAA,EAAA,SAAA,GAaA,KAAA,YAAA,EAAA,EAAA,EAAA,SAAA,IAAA,QAEA,GAGA,YAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,SAAA,GACA,MAAA,GAAA,GAAA,MAAA,KAAA,GAEA,GAAA,GAAA,WAEA,MADA,MAAA,WAAA,EACA,EAAA,GAAA,MAAA,KAAA,aAKA,cAAA,SAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,MAEA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,KAIA,kBAAA,SAAA,EAAA,GACA,GAAA,IACA,UAAA,KAAA,WAGA,EAAA,KAAA,kBAAA,EACA,KACA,EAAA,QAAA,GAGA,YAAA,SAAA,EAAA,KAAA,WAEA,KAAA,KAAA,SAAA,gBAAA,EAAA,IAGA,kBAAA,SAAA,GACA,GAAA,GAAA,EAAA,QAAA,KAAA,EACA,MAAA,EAEA,IAAA,GAAA,KAAA,kBAAA,EACA,OAAA,GAAA,QACA,KAAA,kBAAA,EAAA,QAAA,SADA,SASA,IAIA,GAAA,YADA,OAAA,UACA,SAAA,EAAA,GAIA,MAHA,IAAA,GAAA,IAAA,IACA,EAAA,UAAA,GAEA,GAGA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,OAAA,OAAA,EACA,GAAA,EAAA,EAAA,GAEA,MAAA,IAoBA,EAAA,YAAA,UAAA,GAEA,SClPA,SAAA,GAsKA,QAAA,GAAA,GACA,MAAA,UAAA,SAAA,GAAA,EAAA,EAGA,QAAA,KACA,MAAA,GAAA,OAAA,EAAA,GAAA,EAAA,GASA,QAAA,GAAA,GACA,EAAA,aAAA,EACA,eAAA,OAAA,EACA,YAAA,iBAAA,WACA,EAAA,iBAAA,GACA,EAAA,aAAA,EACA,EAAA,UAnKA,GAAA,IAGA,KAAA,SAAA,GACA,EAAA,UACA,EAAA,WACA,EAAA,KAAA,KAKA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,UAAA,EAAA,QAAA,KAMA,OALA,KACA,EAAA,GAAA,KAAA,GACA,EAAA,QAAA,MAAA,EACA,EAAA,QAAA,GAAA,GAEA,IAAA,KAAA,QAAA,IAGA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,GAAA,QAAA,EAKA,OAJA,IAAA,GAAA,SAAA,SAAA,KACA,GAAA,YAAA,WAAA,YAAA,MACA,EAAA,OAAA,KAEA,GAIA,GAAA,SAAA,GACA,GAAA,GAAA,KAAA,OAAA,EACA,KACA,EAAA,QAAA,WAAA,EACA,KAAA,gBAAA,GACA,KAAA,UAIA,OAAA,SAAA,GACA,GAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAAA,EAIA,MAAA,GAAA,GAAA,SAGA,MAAA,WAEA,GAAA,GAAA,KAAA,aAIA,OAHA,IACA,EAAA,QAAA,MAAA,KAAA,GAEA,KAAA,YACA,KAAA,SACA,GAFA,QAMA,YAAA,WACA,MAAA,MAGA,SAAA,WACA,OAAA,KAAA,aAAA,KAAA,WAGA,QAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,EAAA,IAAA,IACA,GAAA,EAAA,UAAA,EAAA,QAAA,UACA,MAGA,QAAA,GAGA,gBAAA,SAAA,GACA,EAAA,KAAA,IAGA,MAAA,WAEA,IAAA,KAAA,SAAA,CAGA,EAAA,QACA,QAAA,KAAA,uBAAA,EAAA,QAEA,KAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,QACA,EAAA,EAAA,QACA,EAAA,QAAA,GAAA,KAAA,GACA,EAAA,QAAA,IAEA;KAAA,UAAA,IAGA,MAAA,WACA,KAAA,QAOA,eAAA,SAAA,IACA,eAAA,oBAAA,UACA,eAAA,OAAA,GAEA,SAAA,QACA,sBAAA,KAAA,sBAGA,iBAAA,SAAA,GACA,GACA,EAAA,KAAA,IAIA,oBAAA,WACA,GAAA,EAEA,IADA,GAAA,GACA,EAAA,SACA,EAAA,EAAA,YAMA,aAAA,GAIA,KACA,KACA,KACA,KACA,IAYA,UAAA,iBAAA,qBAAA,WACA,eAAA,OAAA,IAcA,EAAA,SAAA,EACA,EAAA,MAAA,EACA,EAAA,UAAA,EAAA,iBAAA,GACA,SClMA,SAAA,GAIA,QAAA,GAAA,EAAA,GACA,GACA,SAAA,KAAA,YAAA,GACA,EAAA,IACA,GACA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,CAEA,IAAA,GAAA,GAAA,EADA,EAAA,SAAA,yBACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SAAA,cAAA,QACA,EAAA,IAAA,SACA,EAAA,KAAA,EACA,EAAA,YAAA,EAEA,GAAA,EAAA,OACA,IACA,IAtBA,GAAA,GAAA,EAAA,gBA2BA,GAAA,OAAA,EACA,EAAA,eAAA,GAEA,SChCA,SAAA,GA2GA,QAAA,GAAA,GACA,MAAA,SAAA,YAAA,mBAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,QAAA,MAAA,EA5GA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,IACA,EAAA,EAAA,MACA,EAAA,EAAA,iBACA,EAAA,EAAA,uBACA,EAAA,EAAA,oBAIA,EAAA,EAAA,OAAA,OAAA,YAAA,YAEA,gBAAA,WACA,KAAA,aAAA,SACA,KAAA,QAIA,KAAA,WAEA,KAAA,KAAA,KAAA,aAAA,QACA,KAAA,QAAA,KAAA,aAAA,WACA,EAAA,KAAA,MAEA,KAAA,gBAEA,KAAA,qBAOA,kBAAA,WACA,KAAA,YACA,KAAA,oBAAA,KAAA,OACA,KAAA,mBACA,KAAA,uBAGA,EAAA,GAAA,OAGA,UAAA,WAGA,EAAA,KAAA,WAAA,EAAA,KAAA,UACA,QAAA,KAAA,sGACA,KAAA,KACA,KAAA,SAEA,KAAA,SAAA,KAAA,KAAA,KAAA,SACA,KAAA,YAAA,GAGA,oBAAA,SAAA,GACA,MAAA,GAAA,GAAA,QAEA,EAAA,EAAA,MAEA,KAAA,eAAA,IAEA,IAIA,eAAA,SAAA,GAEA,KAAA,aAAA,cAAA,KAAA,WACA,KAAA,UAAA,EAEA,QAAA,KAIA,oBAAA,WACA,MAAA,MAAA,iBAMA,gBAAA,WACA,MAAA,GAAA,QAAA,KAAA,KAAA,kBAAA,KAAA,YAGA,cAAA,WACA,KAAA,iBAAA,EACA,KAAA,WAAA,WACA,KAAA,iBAAA,EACA,KAAA,qBACA,KAAA,SASA,GAAA,QAAA,EAAA,YAAA,GAcA,EAAA,WACA,SAAA,KAAA,gBAAA,cACA,SAAA,cACA,GAAA,aAAA,iBAAA,SAAA,OAMA,SAAA,gBAAA,mBAAA,UAAA,KAEA,SCnGA,WAEA,GAAA,GAAA,SAAA,cAAA,kBACA,GAAA,aAAA,OAAA,gBACA,EAAA,aAAA,UAAA,YACA,EAAA,OAEA,QAAA,gBAEA,gBAAA,WACA,KAAA,OAAA,KAAA,gBAAA,KAAA,aAGA,QAAA,iBAAA,WACA,KAAA,MAAA,KACA,KAAA,aAAA,OAAA,IAGA,KAAA,MAAA,WAIA,KAAA,sBAAA,KAAA,YAGA,KAAA,KAAA,qBAEA,KAAA,QAGA,WAAA,WACA,GAAA,GAAA,OAAA,OAAA,QAAA,IAAA,YAAA,QACA,EAAA,IACA,GAAA,eAAA,WAAA,MAAA,GAAA,MAEA,IAAA,GAAA,GAAA,oBACA,EAAA,EAAA,cAKA,OAJA,GAAA,eAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,oBAAA,EAAA,EAAA,IACA,EAAA,KAAA,EAAA,EAAA,EAAA,IAEA","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {\n  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'body /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      this.gestures.push(source);\n    },\n    register: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(scope.findTarget(inEvent));\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: scope.wrap(this.currentTouchEvent.target)\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = scope.wrap(this.findTarget(inTouch, id));\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  dispatcher.register(document);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail || {};\n      var event = new CustomEvent(type, {\n        bubbles: (bubbles !== undefined ? bubbles : true), \n        cancelable: (cancelable !== undefined ? cancelable : true), \n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      // TODO (sorvell): temporarily open observer when created\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n      // set up polymer gestures\n      PolymerGestures.register(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  \n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (window.ShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (window.ShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (window.ShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        node.addEventListener(eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            node.removeEventListener(eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\n        var publish = prototype.publish || (prototype.publish = {});\n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (window.ShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      if (flushQueue.length) {\n        console.warn('flushing %s elements', flushQueue.length);\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
+{"version":3,"file":"polymer.js","sources":["../polymer-gestures/src/scope.js","../polymer-gestures/src/targetfind.js","../polymer-gestures/src/touch-action.js","../polymer-gestures/src/eventFactory.js","../polymer-gestures/src/pointermap.js","../polymer-gestures/src/dispatcher.js","../polymer-gestures/src/mouse.js","../polymer-gestures/src/touch.js","../polymer-gestures/src/ms.js","../polymer-gestures/src/pointer.js","../polymer-gestures/src/platform-events.js","../polymer-gestures/src/track.js","../polymer-gestures/src/hold.js","../polymer-gestures/src/tap.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","build/polymer-versioned.js","src/boot.js","src/lib/lang.js","src/lib/job.js","src/lib/dom.js","src/lib/super.js","src/lib/deserialize.js","src/api.js","src/instance/utils.js","src/instance/events.js","src/instance/attributes.js","src/instance/properties.js","src/instance/mdv.js","src/instance/base.js","src/instance/styles.js","src/declaration/polymer.js","src/declaration/path.js","src/declaration/styles.js","src/declaration/events.js","src/declaration/properties.js","src/declaration/attributes.js","src/declaration/mdv.js","src/declaration/prototype.js","src/declaration/queue.js","src/declaration/import.js","src/declaration/polymer-element.js","src/lib/auto-binding.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      // TODO(dfreedm): make this check more granular, allow for minimal event generation\n      // e.g inEvent._handledByPG['tap'] and inEvent._handledByPG['track'], etc\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (g.enabled && fn) {\n            fn.call(g, e);\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (dep.listeners === 0) {\n        if (recognizer) {\n          recognizer.enabled = true;\n        }\n      }\n      dep.listeners++;\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (dep.listeners > 0) {\n        dep.listeners--;\n      }\n      if (dep.listeners === 0) {\n        var recognizer = dispatcher.gestures[dep.index];\n        if (recognizer) {\n          recognizer.enabled = false;\n        }\n      }\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n","/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.3.5-5d00e4b'\n};\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n  \n  // exports\n\n  scope.extend = extend;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\n  */\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\n  if (declarations) {\n    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n      element.apply(null, d);\n    }\n  }\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Platform.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && Platform.templateContent(template);\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      this.flush();\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenPolymerReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"]}
\ No newline at end of file
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 0b877da..3ccbbfb 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.12.1
+version: 0.13.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -14,14 +14,14 @@
   code_transformers: '>=0.2.0 <0.3.0'
   html5lib: '>=0.12.0 <0.13.0'
   logging: '>=0.9.2 <0.10.0'
-  observe: '>=0.11.0 <0.12.0'
+  observe: '>=0.11.0 <0.13.0'
   path: '>=0.9.0 <2.0.0'
   polymer_expressions: '>=0.12.0 <0.13.0'
   smoke: '>=0.2.0 <0.3.0'
   source_maps: '>=0.9.4 <0.11.0'
   source_span: '>=1.0.0 <2.0.0'
   template_binding: '>=0.12.0 <0.13.0'
-  web_components: '>=0.5.0 <0.6.0'
+  web_components: '>=0.5.0+1 <0.7.0'
   yaml: '>=0.9.0 <3.0.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index edbaa0e..c25958a 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -682,12 +682,13 @@
         'a|web/test.html._buildLogs.1':
           '[{'
             '"level":"Error",'
-            '"message":"Failed to inline html import: '
-              'Could not find asset a|web/foo.html.",'
+            '"message":"${const HtmlEscape().convert(
+                'Failed to inline html import: '
+                'Could not find asset a|web/foo.html.')}",'
             '"assetId":{"package":"a","path":"web/foo.html"},'
             '"span":{'
               '"location":"web/test.html:1:28",'
-              '"text":"${new HtmlEscape().convert(
+              '"text":"${const HtmlEscape().convert(
                 '<link rel="import" href="foo.html">')}"'
               '}'
             '}]',
@@ -1103,4 +1104,4 @@
         '<script rel="import" href="../../packages/b/bar/bar.js"></script>'
         '</body></html>',
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index a834f9e..4ec7677 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -664,11 +664,12 @@
         'a|web/test.html._buildLogs.1':
           '[{'
             '"level":"Warning",'
-            '"message":${JSON.encode(usePolymerHtmlMessage(0))},'
+            '"message":${JSON.encode(const HtmlEscape().convert(
+                usePolymerHtmlMessage(0)))},'
             '"span":{'
               '"location":"web/test.html:2:1",'
               '"text":'
-                '"${new HtmlEscape().convert('<polymer-element name="x-a">')}"'
+                '"${const HtmlEscape().convert('<polymer-element name="x-a">')}"'
             '}'
           '}]',
     }, [
diff --git a/pkg/polymer/test/event_binding_release_handler_test.dart b/pkg/polymer/test/event_binding_release_handler_test.dart
new file mode 100644
index 0000000..784683a
--- /dev/null
+++ b/pkg/polymer/test/event_binding_release_handler_test.dart
@@ -0,0 +1,54 @@
+// 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 polymer.test.event_binding_release_handler_test;
+
+import 'dart:async';
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:template_binding/template_binding.dart';
+
+@CustomTag('x-foo')
+class XFoo extends PolymerElement {
+  @PublishedProperty(reflect: true)
+  int count = 1;
+
+  XFoo.created() : super.created();
+
+  increment() { ++count; }
+}
+
+main() {
+  // Do not run the test in the zone so the future does not trigger a
+  // dirtyCheck. We want to verify that event bindings trigger dirty checks on
+  // their own.
+  initPolymer();
+
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('event handlers can be released', () {
+    XFoo element = querySelector('x-foo');
+    expect(element, isNotNull);
+    ButtonElement button = element.shadowRoot.querySelector('button');
+    expect(button, isNotNull);
+
+    button.click();
+    return new Future(() {}).then((_) {
+      expect(element.shadowRoot.querySelector('p').text, 'Count: 2');
+      // Remove and detach the element so the binding is invalidated.
+      element.remove();
+      element.detached();
+    }).then((_) => new Future(() {})).then((_) {
+      // Clicks should no longer affect the elements count.
+      button.click();
+      // TODO(jakemac): This is flaky so its commented out, (the rest of the
+      // test is not flaky). Figure out how to make this not flaky.
+//      expect(element.count, 2);
+    });
+  });
+}
diff --git a/pkg/polymer/test/event_binding_release_handler_test.html b/pkg/polymer/test/event_binding_release_handler_test.html
new file mode 100644
index 0000000..ce0ebca
--- /dev/null
+++ b/pkg/polymer/test/event_binding_release_handler_test.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<!--
+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.
+-->
+<html>
+<!--polymer-test: this comment is needed for test_suite.dart-->
+<head>
+  <title>event binding release handler test</title>
+  <script src="packages/web_components/platform.js"></script>
+  <script src="packages/web_components/dart_support.js"></script>
+  <link rel="import" href="packages/polymer/polymer.html">
+  <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+</head>
+<body>
+This tests that event bindings can properly release their event listeners.
+<br>
+
+<polymer-element name="x-foo" attributes="count">
+  <template>
+    <p>Count: {{count}}</p>
+    <button on-click="{{increment}}">add</button>
+  </template>
+</polymer-element>
+
+<x-foo count="1"></x-foo>
+
+<script type="application/dart" src="event_binding_release_handler_test.dart"></script>
+</body>
+</html>
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
index 154cd01..b8cdd5a 100644
--- a/pkg/polymer/test/js_interop_test.dart
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -58,8 +58,8 @@
 
   test('elements can be passed through Node.bind to JS', () {
     var text = querySelector('dart-element2')
-        .shadowRoot.querySelector('js-element2')
-        .shadowRoot.text;
+    .shadowRoot.querySelector('js-element2')
+    .shadowRoot.text;
     expect(text, 'QUX:123');
   });
 
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index 5dab7fd..cb0b79c 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -47,6 +47,9 @@
   <polymer-element name="dart-element2">
     <template>
      <js-element2 qux="{{quux}}"></js-element2>
+      <!-- TODO(jakemac): remove this once
+          https://github.com/Polymer/ShadowDOM/issues/495 is resolved -->
+      <content hidden></content>
     </template>
   </polymer-element>
 
diff --git a/pkg/polymer/test/prop_attr_reflection_test.dart b/pkg/polymer/test/prop_attr_reflection_test.dart
index ffae840..cf260f5 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_reflection_test.dart
@@ -8,6 +8,14 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
+
+class XAttrPublish extends PolymerElement {
+  XAttrPublish.created() : super.created();
+
+  @PublishedProperty(reflect: false)
+  String nog = '';
+}
+
 class XFoo extends PolymerElement {
   XFoo.created() : super.created();
 
@@ -56,18 +64,39 @@
 main() => initPolymer().run(() {
   useHtmlConfiguration();
 
-  setUp(() => Polymer.onReady);
-
   // Most tests use @CustomTag, here we test out the impertive register:
   Polymer.register('x-foo', XFoo);
   Polymer.register('x-bar', XBar);
   Polymer.register('x-zot', XZot);
   Polymer.register('x-compose', XCompose);
+  Polymer.register('x-attr-publish', XAttrPublish);
+
+  setUp(() => Polymer.onReady);
 
   test('property to attribute reflection', () {
+    var xbasic = querySelector('x-basic');
+    expect(xbasic.getAttribute('nog'), null, reason:
+        'property published with `attributes` has correct initial value');
+    xbasic.setAttribute('nog', 'hi');
+    expect(xbasic.getAttribute('nog'), 'hi', reason:
+        'deserialization of property published via `attributes`');
+
+    var xattrpublish = querySelector('x-attr-publish');
+    expect(xattrpublish.nog, '', reason:
+        'property published with `attributes` has correct initial value');
+    xattrpublish.setAttribute('nog', 'hi');
+    expect(xattrpublish.nog, 'hi', reason:
+        'deserialization of property published via `attributes`');
+
     var xcompose = querySelector('x-compose');
     var xfoo = querySelector('x-foo');
+    expect(xfoo.foo, '', reason:
+        'property published with info object has correct initial value');
     var xbar = querySelector('x-bar');
+    expect(xbar.zim, false, reason:
+        'property published with info object has correct initial value');
+    expect(xbar.foo, '', reason:
+        'property published with info object has correct initial value');
     var xzot = querySelector('x-zot');
     xfoo.foo = 5;
     xfoo.attributes['def1'] = '15';
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index eaf5801..fac55ef 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -14,6 +14,13 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
+    <x-basic></x-basic>
+    <polymer-element name="x-basic" attributes="nog" noscript>
+    </polymer-element>
+
+    <x-attr-publish></x-attr-publish>
+    <polymer-element name="x-attr-publish" attributes="nog">
+    </polymer-element>
 
     <x-foo></x-foo>
     <polymer-element name="x-foo"></polymer-element>
diff --git a/pkg/polymer_expressions/CHANGELOG.md b/pkg/polymer_expressions/CHANGELOG.md
index 74259f8..06f49dd 100644
--- a/pkg/polymer_expressions/CHANGELOG.md
+++ b/pkg/polymer_expressions/CHANGELOG.md
@@ -3,6 +3,9 @@
 This file contains highlights of what changes on each version of the
 polymer_expressions package.
 
+#### Pub version 0.12.0+1
+  * Widen dependency constraint on `observe`.
+
 #### Pub version 0.12.0
   * Exposed a couple new APIs to create a polymer expression binding outside the
     context of a template binding.
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 02eac81..35170b4 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,11 +1,11 @@
 name: polymer_expressions
-version: 0.12.0
+version: 0.12.0+1
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
-  observe: ">=0.11.0 <0.12.0"
+  observe: ">=0.11.0 <0.13.0"
   template_binding: ">=0.12.0 <0.13.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index a8a0bb8..a4617fc 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.11.2+1
+
+* Fix a case where a `ScheduledProcess` could fail to log its output.
+
+## 0.11.2
+
+* Add a `DirectoryDescriptor.fromFilesystem` constructor.
+
 ## 0.11.1
 
 * Add a top-level `tearDown` function.
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index c99cf06..09ad741 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -189,6 +189,8 @@
   /// along with a [StreamCanceller] controlling it.
   Pair<Stream<String>, StreamCanceller> _lineStreamWithCanceller(
       Future<Stream<List<int>>> streamFuture) {
+    // Ignore errors from the future. They'll be reported through [schedule].
+    streamFuture = streamFuture.catchError((_) => new Stream.fromIterable([]));
     return streamWithCanceller(futureStream(streamFuture)
         .handleError(currentSchedule.signalError)
         .map((chunk) {
diff --git a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
index 6d8705b..93f68a6 100644
--- a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
@@ -7,7 +7,7 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:stack_trace/stack_trace.dart';
 
 import '../../descriptor.dart';
@@ -24,9 +24,26 @@
       : super(name),
         contents = contents.toList();
 
+  /// Creates a directory descriptor named [name] based on a directory on the
+  /// physical directory at [path].
+  ///
+  /// Note that reading from the filesystem isn't scheduled; it occurs as soon
+  /// as this descriptor is constructed.
+  DirectoryDescriptor.fromFilesystem(String name, String path)
+      : this(name, new Directory(path).listSync().map((entity) {
+          if (entity is Directory) {
+            return new DirectoryDescriptor.fromFilesystem(
+                p.basename(entity.path), entity.path);
+          } else if (entity is File) {
+            return new FileDescriptor.binary(
+                p.basename(entity.path), entity.readAsBytesSync());
+          }
+          // Ignore broken symlinks.
+        }));
+
   Future create([String parent]) => schedule(() {
     if (parent == null) parent = defaultRoot;
-    var fullPath = path.join(parent, name);
+    var fullPath = p.join(parent, name);
     return Chain.track(new Directory(fullPath).create(recursive: true))
         .then((_) {
       return Future.wait(
@@ -39,7 +56,7 @@
 
   Future validateNow([String parent]) {
     if (parent == null) parent = defaultRoot;
-    var fullPath = path.join(parent, name);
+    var fullPath = p.join(parent, name);
     if (!new Directory(fullPath).existsSync()) {
       fail("Directory not found: '$fullPath'.");
     }
@@ -57,11 +74,11 @@
 
   Stream<List<int>> load(String pathToLoad) {
     return futureStream(syncFuture(() {
-      if (path.posix.isAbsolute(pathToLoad)) {
+      if (p.posix.isAbsolute(pathToLoad)) {
         throw new ArgumentError("Can't load absolute path '$pathToLoad'.");
       }
 
-      var split = path.posix.split(path.posix.normalize(pathToLoad));
+      var split = p.posix.split(p.posix.normalize(pathToLoad));
       if (split.isEmpty || split.first == '.' || split.first == '..') {
         throw new ArgumentError("Can't load '$pathToLoad' from within "
             "'$name'.");
@@ -87,7 +104,7 @@
           return (matchingEntries.first as ReadableDescriptor).read();
         } else {
           return (matchingEntries.first as LoadableDescriptor)
-              .load(path.posix.joinAll(remainingPath));
+              .load(p.posix.joinAll(remainingPath));
         }
       }
     }));
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 06efbf2..f0630d4 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.1
+version: 0.11.2+1
 author: Dart Team <misc@dartlang.org>
 description: >
   A package for writing readable tests of asynchronous behavior.
diff --git a/pkg/scheduled_test/test/descriptor/directory_test.dart b/pkg/scheduled_test/test/descriptor/directory_test.dart
index 0c9cdea..60fa44c 100644
--- a/pkg/scheduled_test/test/descriptor/directory_test.dart
+++ b/pkg/scheduled_test/test/descriptor/directory_test.dart
@@ -410,4 +410,31 @@
       expect(d.dir('dir').describe(), equals('dir'));
     });
   });
+
+  expectTestPasses("new DirectoryDescriptor().fromFilesystem creates a "
+      "descriptor based on the physical filesystem", () {
+    scheduleSandbox();
+
+    d.dir('dir', [
+      d.dir('subdir', [
+        d.file('subfile1.txt', 'subcontents1'),
+        d.file('subfile2.txt', 'subcontents2')
+      ]),
+      d.file('file1.txt', 'contents1'),
+      d.file('file2.txt', 'contents2')
+    ]).create();
+
+    schedule(() {
+      var descriptor = new d.DirectoryDescriptor.fromFilesystem(
+          "descriptor", path.join(sandbox, 'dir'));
+      expect(descriptor, isDirectoryDescriptor('descriptor', [
+        isDirectoryDescriptor('subdir', [
+          isFileDescriptor('subfile1.txt', 'subcontents1'),
+          isFileDescriptor('subfile2.txt', 'subcontents2')
+        ]),
+        isFileDescriptor('file1.txt', 'contents1'),
+        isFileDescriptor('file2.txt', 'contents2')
+      ]));
+    });
+  });
 }
diff --git a/pkg/scheduled_test/test/descriptor/utils.dart b/pkg/scheduled_test/test/descriptor/utils.dart
index f0fa13c..e8c34b9 100644
--- a/pkg/scheduled_test/test/descriptor/utils.dart
+++ b/pkg/scheduled_test/test/descriptor/utils.dart
@@ -41,3 +41,29 @@
 Future<String> byteStreamToString(Stream<List<int>> stream) =>
   byteStreamToList(stream).then((bytes) => new String.fromCharCodes(bytes));
 
+Matcher isDirectoryDescriptor(String name, List contents) {
+  return predicate((object) {
+    try {
+      expect(object, new isInstanceOf<d.DirectoryDescriptor>());
+      expect(object.name, equals(name));
+      expect(object.contents, unorderedMatches(contents));
+      return true;
+    } on TestFailure catch (_) {
+      return false;
+    }
+  }, "a directory descriptor named $name containing $contents");
+}
+
+Matcher isFileDescriptor(String name, contents) {
+  return predicate((object) {
+    try {
+      expect(object, new isInstanceOf<d.FileDescriptor>());
+      expect(object.name, equals(name));
+      expect(object.textContents, contents);
+      return true;
+    } on TestFailure catch (_) {
+      return false;
+    }
+  }, "a file descriptor named $name containing $contents");
+}
+
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index 0e6dc49..5856040 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.4+3
+
+* Widen the version constraint on the `collection` package.
+
 ## 0.5.4+2
 
 * Updated headers map to use a more efficient case-insensitive backing store.
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index 4e7c128..01ae8de 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,12 +1,12 @@
 name: shelf
-version: 0.5.4+2
+version: 0.5.4+3
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.4.0 <2.0.0'
 dependencies:
-  collection: '>=0.9.4 <0.10.0'
+  collection: '>=0.9.4 <2.0.0'
   http_parser: '>=0.0.0 <0.1.0'
   path: '>=1.0.0 <2.0.0'
   stack_trace: '>=0.9.2 <2.0.0'
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 984dbfc..21bf6e4 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,6 +3,12 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
+#### Pub version 0.12.1
+  * Up to date with [TemplateBinding#6a2808][6a2808] (release 0.3.5)
+
+#### Pub version 0.12.0+4
+  * Widen the dependency constraint on `observe`.
+
 #### Pub version 0.12.0+3
   * fix bug in interop layer to ensure callbacks are run in the dirty-checking
     zone (this only affected running code directly in Dartium without running
diff --git a/pkg/template_binding/lib/src/template.dart b/pkg/template_binding/lib/src/template.dart
index 7554dc8..2dc7ac5 100644
--- a/pkg/template_binding/lib/src/template.dart
+++ b/pkg/template_binding/lib/src/template.dart
@@ -184,7 +184,7 @@
 
     _refContent = null;
     _iterator._valueChanged(null);
-    _iterator._updateIteratedValue(null);
+    _iterator._updateIteratedValue(this._iterator._getUpdatedValue());
   }
 
   void clear() {
diff --git a/pkg/template_binding/lib/src/template_iterator.dart b/pkg/template_binding/lib/src/template_iterator.dart
index a2839ea..7100486 100644
--- a/pkg/template_binding/lib/src/template_iterator.dart
+++ b/pkg/template_binding/lib/src/template_iterator.dart
@@ -257,18 +257,20 @@
     _hasIf = directives._if != null;
     _hasRepeat = directives._repeat != null;
 
+    var ifValue = true;
     if (_hasIf) {
       _ifOneTime = directives._if.onlyOneTime;
       _ifValue = _processBinding('if', directives._if, template, model);
+      ifValue = _ifValue;
 
       // oneTime if & predicate is false. nothing else to do.
-      if (_ifOneTime) {
-        if (!_toBoolean(_ifValue)) {
-          _updateIteratedValue(null);
-          return;
-        }
-      } else {
-        (_ifValue as Bindable).open(_updateIteratedValue);
+      if (_ifOneTime && !_toBoolean(ifValue)) {
+        _valueChanged(null);
+        return;
+      }
+
+      if (!_ifOneTime) {
+        ifValue = (ifValue as Bindable).open(_updateIfValue);
       }
     }
 
@@ -280,12 +282,38 @@
       _value = _processBinding('bind', directives._bind, template, model);
     }
 
-    if (!_oneTime) _value.open(_updateIteratedValue);
+    var value = _value;
+    if (!_oneTime) {
+      value = _value.open(_updateIteratedValue);
+    }
 
-    _updateIteratedValue(null);
+    if (!_toBoolean(ifValue)) {
+      _valueChanged(null);
+      return;
+    }
+
+    _updateValue(value);
   }
 
-  void _updateIteratedValue(_) {
+  /// Gets the updated value of the bind/repeat. This can potentially call
+  /// user code (if a bindingDelegate is set up) so we try to avoid it if we
+  /// already have the value in hand (from Observer.open).
+  Object _getUpdatedValue() {
+    var value = _value;
+    // Dart note: x.discardChanges() is x.value in Dart.
+    if (!_toBoolean(_oneTime)) value = value.value;
+    return value;
+  }
+
+  void _updateIfValue(ifValue) {
+    if (!_toBoolean(ifValue)) {
+      _valueChanged(null);
+      return;
+    }
+    _updateValue(_getUpdatedValue());
+  }
+
+  void _updateIteratedValue(value) {
     if (_hasIf) {
       var ifValue = _ifValue;
       if (!_ifOneTime) ifValue = (ifValue as Bindable).value;
@@ -295,8 +323,10 @@
       }
     }
 
-    var value = _value;
-    if (!_oneTime) value = (value as Bindable).value;
+    _updateValue(value);
+  }
+
+  void _updateValue(Object value) {
     if (!_hasRepeat) value = [value];
     _valueChanged(value);
   }
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 7f2de55..745f8c4 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,12 +1,12 @@
 name: template_binding
-version: 0.12.0+3
+version: 0.12.1
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
   create, manage, and remove instances of content bound to data defined in Dart.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  observe: ">=0.11.0 <0.12.0"
+  observe: ">=0.11.0 <0.13.0"
 dev_dependencies:
   web_components: ">=0.3.1 <0.4.0"
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index 375d3d6..de7e8c3 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -397,6 +397,59 @@
     });
   });
 
+  test('Bind If minimal discardChanges', () {
+    var div = createTestHtml(
+        '<template bind="{{bound}}" if="{{predicate}}">value:{{ value }}'
+        '</template>');
+    // Dart Note: bound changed from null->{}.
+    var m = toObservable({ 'bound': {}, 'predicate': null });
+    var template = div.firstChild;
+
+    var discardChangesCalled = { 'bound': 0, 'predicate': 0 };
+    templateBind(template)
+        ..model = m
+        ..bindingDelegate =
+            new BindIfMinimalDiscardChanges(discardChangesCalled);
+
+    return new Future(() {
+      expect(discardChangesCalled['bound'], 0);
+      expect(discardChangesCalled['predicate'], 0);
+      expect(div.childNodes.length, 1);
+      m['predicate'] = 1;
+    }).then(endOfMicrotask).then((_) {
+      expect(discardChangesCalled['bound'], 1);
+      expect(discardChangesCalled['predicate'], 0);
+
+      expect(div.nodes.length, 2);
+      expect(div.lastChild.text, 'value:');
+
+      m['bound'] = toObservable({'value': 2});
+    }).then(endOfMicrotask).then((_) {
+      expect(discardChangesCalled['bound'], 1);
+      expect(discardChangesCalled['predicate'], 1);
+
+      expect(div.nodes.length, 2);
+      expect(div.lastChild.text, 'value:2');
+
+      m['bound']['value'] = 3;
+
+    }).then(endOfMicrotask).then((_) {
+      expect(discardChangesCalled['bound'], 1);
+      expect(discardChangesCalled['predicate'], 1);
+
+      expect(div.nodes.length, 2);
+      expect(div.lastChild.text, 'value:3');
+
+      templateBind(template).model = null;
+    }).then(endOfMicrotask).then((_) {
+      expect(discardChangesCalled['bound'], 1);
+      expect(discardChangesCalled['predicate'], 1);
+
+      expect(div.nodes.length, 1);
+    });
+  });
+
+
   test('Empty-If', () {
     var div = createTestHtml('<template if>{{ value }}</template>');
     var template = div.firstChild;
@@ -2643,6 +2696,29 @@
   }
 }
 
+class BindIfMinimalDiscardChanges extends BindingDelegate {
+  Map<String, int> discardChangesCalled;
+
+  BindIfMinimalDiscardChanges(this.discardChangesCalled) : super() {}
+
+  prepareBinding(path, name, node) {
+    return (model, node, oneTime) =>
+      new DiscardCountingPathObserver(discardChangesCalled, model, path);
+  }
+}
+
+class DiscardCountingPathObserver extends PathObserver {
+  Map<String, int> discardChangesCalled;
+
+  DiscardCountingPathObserver(this.discardChangesCalled, model, path)
+      : super(model, path) {}
+
+  get value {
+    discardChangesCalled[path.toString()]++;
+    return super.value;
+  }
+}
+
 class TestAccessorModel extends Observable {
   @observable var value = 1;
   var count = 0;
diff --git a/pkg/typed_data/pubspec.yaml b/pkg/typed_data/pubspec.yaml
index af2e72a..5688a24 100644
--- a/pkg/typed_data/pubspec.yaml
+++ b/pkg/typed_data/pubspec.yaml
@@ -1,9 +1,9 @@
 name: typed_data
-version: 0.9.0
+version: 1.0.0
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:typed_data' library.
 homepage: http://www.dartlang.org
 dev_dependencies:
   unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=1.0.0 <2.0.0"
+  sdk: ">=1.5.0 <2.0.0"
diff --git a/pkg/unittest/lib/src/test_case.dart b/pkg/unittest/lib/src/test_case.dart
index fe0d12de..9f2a632 100644
--- a/pkg/unittest/lib/src/test_case.dart
+++ b/pkg/unittest/lib/src/test_case.dart
@@ -15,13 +15,13 @@
   final String description;
 
   /// The setup function to call before the test, if any.
-  final Function _setUp;
+  Function _setUp;
 
   /// The teardown function to call after the test, if any.
-  final Function _tearDown;
+  Function _tearDown;
 
   /// The body of the test case.
-  final TestFunction _testFunction;
+  TestFunction _testFunction;
 
   /// Remaining number of callbacks functions that must reach a 'done' state
   /// to wait for before the test completes.
@@ -120,7 +120,11 @@
       } else if (_tearDown != null) {
         return _tearDown();
       }
-    }).catchError(_errorHandler('Teardown'));
+    }).catchError(_errorHandler('Teardown')).whenComplete(() {
+      _setUp = null;
+      _tearDown = null;
+      _testFunction = null;
+    });
   }
 
   // Set the results, notify the config, and return true if this
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index 0a36d5c..b531c81 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.11.0+4
+version: 0.11.0+5
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://pub.dartlang.org/packages/unittest
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
index 1f0fedb..6aa9545 100644
--- a/pkg/web_components/CHANGELOG.md
+++ b/pkg/web_components/CHANGELOG.md
@@ -2,6 +2,18 @@
 
 This file contains highlights of what changes on each version of this package.
 
+#### Pub version 0.6.0
+  * Upgrades to platform master as of 8/25/2014 (see lib/build.log for details).
+    This is more recent than the 0.3.5 release as there were multiple breakages
+    that required updating past that.
+  * There is a bug in this version where selecting non-rendered elements doesn't
+    work, but it shouldn't affect most people. See 
+    https://github.com/Polymer/ShadowDOM/issues/495.
+
+#### Pub version 0.5.0+1
+  * Backward compatible change to prepare for upcoming change of the user agent
+    in Dartium.
+
 #### Pub version 0.5.0
   * Upgrades to platform version 0.3.4-02a0f66 (see lib/build.log for details).
 
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index f1cbe74..3793c56 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,45 +1,36 @@
 BUILD LOG
 ---------
-Build Time: 2014-07-24T18:04:50
+Build Time: 2014-08-25T14:50:58
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.21
-chai: 1.9.0
-grunt: 0.4.2
-grunt-audit: 0.0.2
-grunt-concat-sourcemap: 0.4.1
-grunt-contrib-concat: 0.3.0
-grunt-contrib-uglify: 0.3.2
-grunt-contrib-yuidoc: 0.5.1
-grunt-karma: 0.6.2
-karma: 0.10.9
-karma-chrome-launcher: 0.1.2
-karma-coffee-preprocessor: 0.1.3
+nodejs: v0.10.29
+chai: 1.9.1
+grunt: 0.4.5
+grunt-audit: 0.0.3
+grunt-concat-sourcemap: 0.4.3
+grunt-contrib-concat: 0.4.0
+grunt-contrib-uglify: 0.5.1
+grunt-karma: 0.8.3
+karma: 0.12.22
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
-karma-html2js-preprocessor: 0.1.0
-karma-ie-launcher: 0.1.1
-karma-jasmine: 0.1.5
-karma-mocha: 0.1.1
-karma-phantomjs-launcher: 0.1.2
-karma-requirejs: 0.2.1
+karma-ie-launcher: 0.1.5
+karma-mocha: 0.1.9
 karma-safari-launcher: 0.1.1
-karma-script-launcher: 0.1.0
-mocha: 1.17.1
-requirejs: 2.1.11
+mocha: 1.21.4
 
 REPO REVISIONS
 ==============
-CustomElements: 2df917e8b1fb1928651a71372ae901a400ddf726
-HTMLImports: d240c62fe5b784239f08f77eff40efb4aabf0105
-NodeBind: 9f0089946c312d9ac9ca45d06913fce507a8b185
-ShadowDOM: 86943c29aa8a10da214bc2f42e3067cf0f190279
-TemplateBinding: d9f4543dc06935824bfd43564c442b0897ce1c54
-WeakMap: 43ab1056a0d821af9b6028fc27ddf30db817c05a
-observe-js: e212e7473962067c099a3d1859595c2f8baa36d7
-platform-dev: 02a0f66b65c34585b4b986e6a3a73cc0d743683a
+CustomElements: 65bb151f33891864b28eee305bdf299653ef351c
+HTMLImports: 0d3133d19b35d899ef3e33fbd65ad62e0571d1d5
+NodeBind: f41e84f3deb2cad22eef89ded1072060f7b1b183
+ShadowDOM: 57232dc6d07dd921009679dfbab622b52174df80
+TemplateBinding: f15094216a6b3f64a6d6b0f017b6bd7576b8b44e
+WeakMap: 6662df5cb7146707238b08e7a65cf70056ae516a
+observe-js: ca7b6ba385006f200c7ec3537c7730710e428c60
+platform-dev: fe549bc7f05ec668bc496108958eaee0bd174a06
 
 BUILD HASHES
 ============
-build/platform.js: 9ca6c8137fefb7461693d8ec7bac2af8d5a4fd1a
\ No newline at end of file
+build/platform.js: e5a0b4192fb91750c708270b7267d81c972e5bdd
\ No newline at end of file
diff --git a/pkg/web_components/lib/dart_support.js b/pkg/web_components/lib/dart_support.js
index efa1301..7ce882c 100644
--- a/pkg/web_components/lib/dart_support.js
+++ b/pkg/web_components/lib/dart_support.js
@@ -7,7 +7,9 @@
   var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
   if (!ShadowDOMPolyfill) return;
 
-  if (navigator.userAgent.indexOf('(Dart)') !== -1) {
+  // TODO(sigmund): remove the userAgent check once 1.6 rolls as stable.
+  // See: dartbug.com/18463
+  if (navigator.dartEnabled || (navigator.userAgent.indexOf('(Dart)') !== -1)) {
     console.error("ShadowDOMPolyfill polyfill was loaded in Dartium. This " +
         "will not work. This indicates that Dartium's Chrome version is " +
         "not compatible with this version of web_components.");
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index 68b593d..c4407a2 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -95,7 +95,16 @@
             entry[1] : undefined;
       },
       delete: function(key) {
-        this.set(key, undefined);
+        var entry = key[this.name];
+        if (!entry) return false;
+        var hasValue = entry[0] === key;
+        entry[0] = entry[1] = undefined;
+        return hasValue;
+      },
+      has: function(key) {
+        var entry = key[this.name];
+        if (!entry) return false;
+        return entry[0] === key;
       }
     };
 
@@ -120,6 +129,8 @@
 (function(global) {
   'use strict';
 
+  var testingExposeCycleCount = global.testingExposeCycleCount;
+
   // Detect and do basic sanity checking on Object/Array.observe.
   function detectObjectObserve() {
     if (typeof Object.observe !== 'function' ||
@@ -170,6 +181,13 @@
       return false;
     }
 
+    // Firefox OS Apps do not allow eval. This feature detection is very hacky
+    // but even if some other platform adds support for this function this code
+    // will continue to work.
+    if (navigator.getDeviceStorage) {
+      return false;
+    }
+
     try {
       var f = new Function('', 'return true;');
       return f();
@@ -544,7 +562,7 @@
     while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
       cycles++;
     }
-    if (global.testingExposeCycleCount)
+    if (testingExposeCycleCount)
       global.dirtyCheckCycleCount = cycles;
 
     return cycles > 0;
@@ -943,7 +961,7 @@
         anyChanged = true;
     } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
 
-    if (global.testingExposeCycleCount)
+    if (testingExposeCycleCount)
       global.dirtyCheckCycleCount = cycles;
 
     runningMicrotaskCheckpoint = false;
@@ -1822,8 +1840,8 @@
   global.ObserverTransform = ObserverTransform;
 })(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
 
-// select ShadowDOM impl

-if (Platform.flags.shadow) {

+// select ShadowDOM impl
+if (Platform.flags.shadow) {
 
 // Copyright 2012 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
@@ -1845,6 +1863,13 @@
       return false;
     }
 
+    // Firefox OS Apps do not allow eval. This feature detection is very hacky
+    // but even if some other platform adds support for this function this code
+    // will continue to work.
+    if (navigator.getDeviceStorage) {
+      return false;
+    }
+
     try {
       var f = new Function('return true;');
       return f();
@@ -1956,23 +1981,31 @@
     return /^\w[a-zA-Z_0-9]*$/.test(name);
   }
 
+  // The name of the implementation property is intentionally hard to
+  // remember. Unfortunately, browsers are slower doing obj[expr] than
+  // obj.foo so we resort to repeat this ugly name. This ugly name is never
+  // used outside of this file though.
+
   function getGetter(name) {
     return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name) :
-        function() { return this.impl[name]; };
+        new Function('return this.__impl4cf1e782hg__.' + name) :
+        function() { return this.__impl4cf1e782hg__[name]; };
   }
 
   function getSetter(name) {
     return hasEval && isIdentifierName(name) ?
-        new Function('v', 'this.impl.' + name + ' = v') :
-        function(v) { this.impl[name] = v; };
+        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :
+        function(v) { this.__impl4cf1e782hg__[name] = v; };
   }
 
   function getMethod(name) {
     return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name +
-                     '.apply(this.impl, arguments)') :
-        function() { return this.impl[name].apply(this.impl, arguments); };
+        new Function('return this.__impl4cf1e782hg__.' + name +
+                     '.apply(this.__impl4cf1e782hg__, arguments)') :
+        function() {
+          return this.__impl4cf1e782hg__[name].apply(
+              this.__impl4cf1e782hg__, arguments);
+        };
   }
 
   function getDescriptor(source, name) {
@@ -2093,38 +2126,12 @@
     return GeneratedWrapper;
   }
 
-  var OriginalDOMImplementation = window.DOMImplementation;
-  var OriginalEventTarget = window.EventTarget;
-  var OriginalEvent = window.Event;
-  var OriginalNode = window.Node;
-  var OriginalWindow = window.Window;
-  var OriginalRange = window.Range;
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-
   function isWrapper(object) {
-    return object instanceof wrappers.EventTarget ||
-           object instanceof wrappers.Event ||
-           object instanceof wrappers.Range ||
-           object instanceof wrappers.DOMImplementation ||
-           object instanceof wrappers.CanvasRenderingContext2D ||
-           wrappers.WebGLRenderingContext &&
-               object instanceof wrappers.WebGLRenderingContext;
+    return object && object.__impl4cf1e782hg__;
   }
 
   function isNative(object) {
-    return OriginalEventTarget && object instanceof OriginalEventTarget ||
-           object instanceof OriginalNode ||
-           object instanceof OriginalEvent ||
-           object instanceof OriginalWindow ||
-           object instanceof OriginalRange ||
-           object instanceof OriginalDOMImplementation ||
-           object instanceof OriginalCanvasRenderingContext2D ||
-           OriginalWebGLRenderingContext &&
-               object instanceof OriginalWebGLRenderingContext ||
-           OriginalSVGElementInstance &&
-               object instanceof OriginalSVGElementInstance;
+    return !isWrapper(object);
   }
 
   /**
@@ -2138,8 +2145,8 @@
       return null;
 
     assert(isNative(impl));
-    return impl.polymerWrapper_ ||
-        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));
+    return impl.__wrapper8e3dd93a60__ ||
+        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));
   }
 
   /**
@@ -2151,7 +2158,16 @@
     if (wrapper === null)
       return null;
     assert(isWrapper(wrapper));
-    return wrapper.impl;
+    return wrapper.__impl4cf1e782hg__;
+  }
+
+  function unsafeUnwrap(wrapper) {
+    return wrapper.__impl4cf1e782hg__;
+  }
+
+  function setWrapper(impl, wrapper) {
+    wrapper.__impl4cf1e782hg__ = impl;
+    impl.__wrapper8e3dd93a60__ = wrapper;
   }
 
   /**
@@ -2183,7 +2199,7 @@
       return;
     assert(isNative(node));
     assert(wrapper === undefined || isWrapper(wrapper));
-    node.polymerWrapper_ = wrapper;
+    node.__wrapper8e3dd93a60__ = wrapper;
   }
 
   var getterDescriptor = {
@@ -2199,7 +2215,7 @@
 
   function defineWrapGetter(constructor, name) {
     defineGetter(constructor, name, function() {
-      return wrap(this.impl[name]);
+      return wrap(this.__impl4cf1e782hg__[name]);
     });
   }
 
@@ -2234,6 +2250,8 @@
   scope.registerObject = registerObject;
   scope.registerWrapper = register;
   scope.rewrap = rewrap;
+  scope.setWrapper = setWrapper;
+  scope.unsafeUnwrap = unsafeUnwrap;
   scope.unwrap = unwrap;
   scope.unwrapIfNeeded = unwrapIfNeeded;
   scope.wrap = wrap;
@@ -2549,6 +2567,8 @@
   }
 
   MutationObserver.prototype = {
+    constructor: MutationObserver,
+
     // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
     observe: function(target, options) {
       target = wrapIfNeeded(target);
@@ -2758,6 +2778,8 @@
   var getTreeScope = scope.getTreeScope;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
   var wrappers = scope.wrappers;
@@ -3212,9 +3234,10 @@
   function Event(type, options) {
     if (type instanceof OriginalEvent) {
       var impl = type;
-      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')
+      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {
         return new BeforeUnloadEvent(impl);
-      this.impl = impl;
+      }
+      setWrapper(impl, this);
     } else {
       return wrap(constructEvent(OriginalEvent, 'Event', type, options));
     }
@@ -3258,7 +3281,7 @@
     var OriginalEvent = window[name];
     var GenericEvent = function(type, options) {
       if (type instanceof OriginalEvent)
-        this.impl = type;
+        setWrapper(type, this);
       else
         return wrap(constructEvent(OriginalEvent, name, type, options));
     };
@@ -3389,10 +3412,10 @@
   BeforeUnloadEvent.prototype = Object.create(Event.prototype);
   mixin(BeforeUnloadEvent.prototype, {
     get returnValue() {
-      return this.impl.returnValue;
+      return unsafeUnwrap(this).returnValue;
     },
     set returnValue(v) {
-      this.impl.returnValue = v;
+      unsafeUnwrap(this).returnValue = v;
     }
   });
 
@@ -3429,7 +3452,7 @@
    * @constructor
    */
   function EventTarget(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
 
   // Node and Window have different internal type checks in WebKit so we cannot
@@ -3567,7 +3590,8 @@
   function elementFromPoint(self, document, x, y) {
     scope.renderAllPending();
 
-    var element = wrap(originalElementFromPoint.call(document.impl, x, y));
+    var element =
+        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
     if (!element)
       return null;
     var path = getEventPath(element, null);
@@ -3660,7 +3684,8 @@
   var UIEvent = scope.wrappers.UIEvent;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var wrap = scope.wrap;
 
   // TouchEvent is WebKit/Blink only.
@@ -3684,12 +3709,12 @@
   }
 
   function Touch(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
 
   Touch.prototype = {
     get target() {
-      return wrap(this.impl.target);
+      return wrap(unsafeUnwrap(this).target);
     }
   };
 
@@ -3713,7 +3738,7 @@
     'webkitForce'
   ].forEach(function(name) {
     descr.get = function() {
-      return this.impl[name];
+      return unsafeUnwrap(this)[name];
     };
     Object.defineProperty(Touch.prototype, name, descr);
   });
@@ -3746,15 +3771,15 @@
 
   mixin(TouchEvent.prototype, {
     get touches() {
-      return wrapTouchList(unwrap(this).touches);
+      return wrapTouchList(unsafeUnwrap(this).touches);
     },
 
     get targetTouches() {
-      return wrapTouchList(unwrap(this).targetTouches);
+      return wrapTouchList(unsafeUnwrap(this).targetTouches);
     },
 
     get changedTouches() {
-      return wrapTouchList(unwrap(this).changedTouches);
+      return wrapTouchList(unsafeUnwrap(this).changedTouches);
     },
 
     initTouchEvent: function() {
@@ -3781,6 +3806,7 @@
 (function(scope) {
   'use strict';
 
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var wrap = scope.wrap;
 
   var nonEnumDescriptor = {enumerable: false};
@@ -3813,7 +3839,8 @@
 
   function addWrapNodeListMethod(wrapperConstructor, name) {
     wrapperConstructor.prototype[name] = function() {
-      return wrapNodeList(this.impl[name].apply(this.impl, arguments));
+      return wrapNodeList(
+          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
     };
   }
 
@@ -3860,6 +3887,7 @@
   var registerTransientObservers = scope.registerTransientObservers;
   var registerWrapper = scope.registerWrapper;
   var setTreeScope = scope.setTreeScope;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
@@ -4093,9 +4121,9 @@
   function cloneNode(node, deep, opt_doc) {
     var clone;
     if (opt_doc)
-      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));
+      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));
     else
-      clone = wrap(originalCloneNode.call(node.impl, false));
+      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
 
     if (deep) {
       for (var child = node.firstChild; child; child = child.nextSibling) {
@@ -4238,7 +4266,7 @@
       if (useNative) {
         ensureSameOwnerDocument(this, childWrapper);
         clearChildNodes(this);
-        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);
+        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
       } else {
         if (!previousNode)
           this.firstChild_ = nodes[0];
@@ -4248,7 +4276,7 @@
             this.firstChild_ = this.firstChild;
         }
 
-        var parentNode = refNode ? refNode.parentNode : this.impl;
+        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
 
         // insertBefore refWrapper no matter what the parent is?
         if (parentNode) {
@@ -4319,7 +4347,7 @@
             childWrapper.parentNode_ = undefined;
       } else {
         clearChildNodes(this);
-        removeChildOriginalHelper(this.impl, childNode);
+        removeChildOriginalHelper(unsafeUnwrap(this), childNode);
       }
 
       if (!surpressMutations) {
@@ -4385,7 +4413,7 @@
       } else {
         ensureSameOwnerDocument(this, newChildWrapper);
         clearChildNodes(this);
-        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),
+        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),
                                   oldChildNode);
       }
 
@@ -4421,31 +4449,31 @@
     get parentNode() {
       // If the parentNode has not been overridden, use the original parentNode.
       return this.parentNode_ !== undefined ?
-          this.parentNode_ : wrap(this.impl.parentNode);
+          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
     },
 
     /** @type {Node} */
     get firstChild() {
       return this.firstChild_ !== undefined ?
-          this.firstChild_ : wrap(this.impl.firstChild);
+          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
     },
 
     /** @type {Node} */
     get lastChild() {
       return this.lastChild_ !== undefined ?
-          this.lastChild_ : wrap(this.impl.lastChild);
+          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
     },
 
     /** @type {Node} */
     get nextSibling() {
       return this.nextSibling_ !== undefined ?
-          this.nextSibling_ : wrap(this.impl.nextSibling);
+          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
     },
 
     /** @type {Node} */
     get previousSibling() {
       return this.previousSibling_ !== undefined ?
-          this.previousSibling_ : wrap(this.impl.previousSibling);
+          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
     },
 
     get parentElement() {
@@ -4457,7 +4485,7 @@
     },
 
     get textContent() {
-      // TODO(arv): This should fallback to this.impl.textContent if there
+      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there
       // are no shadow trees below or above the context node.
       var s = '';
       for (var child = this.firstChild; child; child = child.nextSibling) {
@@ -4473,12 +4501,12 @@
       if (this.invalidateShadowRenderer()) {
         removeAllChildNodes(this);
         if (textContent !== '') {
-          var textNode = this.impl.ownerDocument.createTextNode(textContent);
+          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
           this.appendChild(textNode);
         }
       } else {
         clearChildNodes(this);
-        this.impl.textContent = textContent;
+        unsafeUnwrap(this).textContent = textContent;
       }
 
       var addedNodes = snapshotNodeList(this.childNodes);
@@ -4513,7 +4541,7 @@
     compareDocumentPosition: function(otherNode) {
       // This only wraps, it therefore only operates on the composed DOM and not
       // the logical DOM.
-      return originalCompareDocumentPosition.call(this.impl,
+      return originalCompareDocumentPosition.call(unsafeUnwrap(this),
                                                   unwrapIfNeeded(otherNode));
     },
 
@@ -4584,6 +4612,44 @@
 
   var HTMLCollection = scope.wrappers.HTMLCollection;
   var NodeList = scope.wrappers.NodeList;
+  var getTreeScope = scope.getTreeScope;
+  var unsafeUnwrap = scope.unsafeUnwrap;
+  var wrap = scope.wrap;
+
+  var originalDocumentQuerySelector = document.querySelector;
+  var originalElementQuerySelector = document.documentElement.querySelector;
+
+  var originalDocumentQuerySelectorAll = document.querySelectorAll;
+  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
+
+  var originalDocumentGetElementsByTagName = document.getElementsByTagName;
+  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
+
+  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
+  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
+
+  var OriginalElement = window.Element;
+  var OriginalDocument = window.HTMLDocument || window.Document;
+
+  function filterNodeList(list, index, result, deep) {
+    var wrappedItem = null;
+    var root = null;
+    for (var i = 0, length = list.length; i < length; i++) {
+      wrappedItem = wrap(list[i]);
+      if (!deep && (root = getTreeScope(wrappedItem).root)) {
+        if (root instanceof scope.wrappers.ShadowRoot) {
+          continue;
+        }
+      }
+      result[index++] = wrappedItem;
+    }
+
+    return index;
+  }
+
+  function shimSelector(selector) {
+    return String(selector).replace(/\/deep\//g, ' ');
+  }
 
   function findOne(node, selector) {
     var m, el = node.firstElementChild;
@@ -4614,7 +4680,7 @@
     return true;
   }
 
-  function matchesLocalName(el, localName) {
+  function matchesLocalNameOnly(el, ns, localName) {
     return el.localName === localName;
   }
 
@@ -4626,40 +4692,155 @@
     return el.namespaceURI === ns && el.localName === localName;
   }
 
-  function findElements(node, result, p, arg0, arg1) {
+  function findElements(node, index, result, p, arg0, arg1) {
     var el = node.firstElementChild;
     while (el) {
       if (p(el, arg0, arg1))
-        result[result.length++] = el;
-      findElements(el, result, p, arg0, arg1);
+        result[index++] = el;
+      index = findElements(el, index, result, p, arg0, arg1);
       el = el.nextElementSibling;
     }
-    return result;
+    return index;
   }
 
   // find and findAll will only match Simple Selectors,
   // Structural Pseudo Classes are not guarenteed to be correct
   // http://www.w3.org/TR/css3-selectors/#simple-selectors
 
+  function querySelectorAllFiltered(p, index, result, selector, deep) {
+    var target = unsafeUnwrap(this);
+    var list;
+    var root = getTreeScope(this).root;
+    if (root instanceof scope.wrappers.ShadowRoot) {
+      // We are in the shadow tree and the logical tree is
+      // going to be disconnected so we do a manual tree traversal
+      return findElements(this, index, result, p, selector, null);
+    } else if (target instanceof OriginalElement) {
+      list = originalElementQuerySelectorAll.call(target, selector);
+    } else if (target instanceof OriginalDocument) {
+      list = originalDocumentQuerySelectorAll.call(target, selector);
+    } else {
+      // When we get a ShadowRoot the logical tree is going to be disconnected
+      // so we do a manual tree traversal
+      return findElements(this, index, result, p, selector, null);
+    }
+
+    return filterNodeList(list, index, result, deep);
+  }
+
   var SelectorsInterface = {
     querySelector: function(selector) {
-      return findOne(this, selector);
+      var shimmed = shimSelector(selector);
+      var deep = shimmed !== selector;
+      selector = shimmed;
+
+      var target = unsafeUnwrap(this);
+      var wrappedItem;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        // We are in the shadow tree and the logical tree is
+        // going to be disconnected so we do a manual tree traversal
+        return findOne(this, selector);
+      } else if (target instanceof OriginalElement) {
+        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
+      } else if (target instanceof OriginalDocument) {
+        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
+      } else {
+        // When we get a ShadowRoot the logical tree is going to be disconnected
+        // so we do a manual tree traversal
+        return findOne(this, selector);
+      }
+
+      if (!wrappedItem) {
+        // When the original query returns nothing
+        // we return nothing (to be consistent with the other wrapped calls)
+        return wrappedItem;
+      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
+        if (root instanceof scope.wrappers.ShadowRoot) {
+          // When the original query returns an element in the ShadowDOM
+          // we must do a manual tree traversal
+          return findOne(this, selector);
+        }
+      }
+
+      return wrappedItem;
     },
     querySelectorAll: function(selector) {
-      return findElements(this, new NodeList(), matchesSelector, selector);
+      var shimmed = shimSelector(selector);
+      var deep = shimmed !== selector;
+      selector = shimmed;
+
+      var result = new NodeList();
+
+      result.length = querySelectorAllFiltered.call(this,
+          matchesSelector,
+          0,
+          result,
+          selector,
+          deep);
+
+      return result;
     }
   };
 
+  function getElementsByTagNameFiltered(p, index, result, localName,
+                                        lowercase) {
+    var target = unsafeUnwrap(this);
+    var list;
+    var root = getTreeScope(this).root;
+    if (root instanceof scope.wrappers.ShadowRoot) {
+      // We are in the shadow tree and the logical tree is
+      // going to be disconnected so we do a manual tree traversal
+      return findElements(this, index, result, p, localName, lowercase);
+    } else if (target instanceof OriginalElement) {
+      list = originalElementGetElementsByTagName.call(target, localName,
+                                                      lowercase);
+    } else if (target instanceof OriginalDocument) {
+      list = originalDocumentGetElementsByTagName.call(target, localName,
+                                                       lowercase);
+    } else {
+      // When we get a ShadowRoot the logical tree is going to be disconnected
+      // so we do a manual tree traversal
+      return findElements(this, index, result, p, localName, lowercase);
+    }
+
+    return filterNodeList(list, index, result, false);
+  }
+
+  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
+    var target = unsafeUnwrap(this);
+    var list;
+    var root = getTreeScope(this).root;
+    if (root instanceof scope.wrappers.ShadowRoot) {
+      // We are in the shadow tree and the logical tree is
+      // going to be disconnected so we do a manual tree traversal
+      return findElements(this, index, result, p, ns, localName);
+    } else if (target instanceof OriginalElement) {
+      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
+    } else if (target instanceof OriginalDocument) {
+      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
+    } else {
+      // When we get a ShadowRoot the logical tree is going to be disconnected
+      // so we do a manual tree traversal
+      return findElements(this, index, result, p, ns, localName);
+    }
+
+    return filterNodeList(list, index, result, false);
+  }
+
   var GetElementsByInterface = {
     getElementsByTagName: function(localName) {
       var result = new HTMLCollection();
-      if (localName === '*')
-        return findElements(this, result, matchesEveryThing);
+      var match = localName === '*' ? matchesEveryThing : matchesTagName;
 
-      return findElements(this, result,
-          matchesTagName,
+      result.length = getElementsByTagNameFiltered.call(this,
+          match,
+          0,
+          result,
           localName,
           localName.toLowerCase());
+
+      return result;
     },
 
     getElementsByClassName: function(className) {
@@ -4669,19 +4850,22 @@
 
     getElementsByTagNameNS: function(ns, localName) {
       var result = new HTMLCollection();
+      var match = null;
 
-      if (ns === '') {
-        ns = null;
-      } else if (ns === '*') {
-        if (localName === '*')
-          return findElements(this, result, matchesEveryThing);
-        return findElements(this, result, matchesLocalName, localName);
+      if (ns === '*') {
+        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;
+      } else {
+        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;
       }
 
-      if (localName === '*')
-        return findElements(this, result, matchesNameSpace, ns);
+      result.length = getElementsByTagNameNSFiltered.call(this,
+          match,
+          0,
+          result,
+          ns || null,
+          localName);
 
-      return findElements(this, result, matchesLocalNameNS, ns, localName);
+      return result;
     }
   };
 
@@ -4778,6 +4962,7 @@
   var enqueueMutation = scope.enqueueMutation;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
 
   var OriginalCharacterData = window.CharacterData;
 
@@ -4793,14 +4978,14 @@
       this.data = value;
     },
     get data() {
-      return this.impl.data;
+      return unsafeUnwrap(this).data;
     },
     set data(value) {
-      var oldValue = this.impl.data;
+      var oldValue = unsafeUnwrap(this).data;
       enqueueMutation(this, 'characterData', {
         oldValue: oldValue
       });
-      this.impl.data = value;
+      unsafeUnwrap(this).data = value;
     }
   });
 
@@ -4862,40 +5047,44 @@
 (function(scope) {
   'use strict';
 
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
+
   function invalidateClass(el) {
     scope.invalidateRendererBasedOnAttribute(el, 'class');
   }
 
   function DOMTokenList(impl, ownerElement) {
-    this.impl = impl;
+    setWrapper(impl, this);
     this.ownerElement_ = ownerElement;
   }
 
   DOMTokenList.prototype = {
+    constructor: DOMTokenList,
     get length() {
-      return this.impl.length;
+      return unsafeUnwrap(this).length;
     },
     item: function(index) {
-      return this.impl.item(index);
+      return unsafeUnwrap(this).item(index);
     },
     contains: function(token) {
-      return this.impl.contains(token);
+      return unsafeUnwrap(this).contains(token);
     },
     add: function() {
-      this.impl.add.apply(this.impl, arguments);
+      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);
       invalidateClass(this.ownerElement_);
     },
     remove: function() {
-      this.impl.remove.apply(this.impl, arguments);
+      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);
       invalidateClass(this.ownerElement_);
     },
     toggle: function(token) {
-      var rv = this.impl.toggle.apply(this.impl, arguments);
+      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);
       invalidateClass(this.ownerElement_);
       return rv;
     },
     toString: function() {
-      return this.impl.toString();
+      return unsafeUnwrap(this).toString();
     }
   };
 
@@ -4920,7 +5109,7 @@
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
   var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var wrappers = scope.wrappers;
 
   var OriginalElement = window.Element;
@@ -4969,7 +5158,7 @@
   mixin(Element.prototype, {
     createShadowRoot: function() {
       var newShadowRoot = new wrappers.ShadowRoot(this);
-      this.impl.polymerShadowRoot_ = newShadowRoot;
+      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
 
       var renderer = scope.getRendererForHost(this);
       renderer.invalidate();
@@ -4978,40 +5167,40 @@
     },
 
     get shadowRoot() {
-      return this.impl.polymerShadowRoot_ || null;
+      return unsafeUnwrap(this).polymerShadowRoot_ || null;
     },
 
     // getDestinationInsertionPoints added in ShadowRenderer.js
 
     setAttribute: function(name, value) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.setAttribute(name, value);
+      var oldValue = unsafeUnwrap(this).getAttribute(name);
+      unsafeUnwrap(this).setAttribute(name, value);
       enqueAttributeChange(this, name, oldValue);
       invalidateRendererBasedOnAttribute(this, name);
     },
 
     removeAttribute: function(name) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.removeAttribute(name);
+      var oldValue = unsafeUnwrap(this).getAttribute(name);
+      unsafeUnwrap(this).removeAttribute(name);
       enqueAttributeChange(this, name, oldValue);
       invalidateRendererBasedOnAttribute(this, name);
     },
 
     matches: function(selector) {
-      return originalMatches.call(this.impl, selector);
+      return originalMatches.call(unsafeUnwrap(this), selector);
     },
 
     get classList() {
       var list = classListTable.get(this);
       if (!list) {
         classListTable.set(this,
-            list = new DOMTokenList(unwrap(this).classList, this));
+            list = new DOMTokenList(unsafeUnwrap(this).classList, this));
       }
       return list;
     },
 
     get className() {
-      return unwrap(this).className;
+      return unsafeUnwrap(this).className;
     },
 
     set className(v) {
@@ -5019,7 +5208,7 @@
     },
 
     get id() {
-      return unwrap(this).id;
+      return unsafeUnwrap(this).id;
     },
 
     set id(v) {
@@ -5068,6 +5257,7 @@
   var nodesWereRemoved = scope.nodesWereRemoved;
   var registerWrapper = scope.registerWrapper;
   var snapshotNodeList = scope.snapshotNodeList;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
   var wrappers = scope.wrappers;
@@ -5234,7 +5424,7 @@
                  this instanceof wrappers.HTMLTemplateElement) {
         setInnerHTML(this.content, value);
       } else {
-        this.impl.innerHTML = value;
+        unsafeUnwrap(this).innerHTML = value;
       }
 
       var addedNodes = snapshotNodeList(this.childNodes);
@@ -5285,6 +5475,17 @@
 
       var df = frag(contextElement, text);
       contextElement.insertBefore(df, refNode);
+    },
+
+    get hidden() {
+      return this.hasAttribute('hidden');
+    },
+    set hidden(v) {
+      if (v) {
+        this.setAttribute('hidden', '');
+      } else {
+        this.removeAttribute('hidden');
+      }
     }
   });
 
@@ -5303,7 +5504,7 @@
   function getter(name) {
     return function() {
       scope.renderAllPending();
-      return this.impl[name];
+      return unsafeUnwrap(this)[name];
     };
   }
 
@@ -5329,7 +5530,7 @@
       get: getter(name),
       set: function(v) {
         scope.renderAllPending();
-        this.impl[name] = v;
+        unsafeUnwrap(this)[name] = v;
       },
       configurable: true,
       enumerable: true
@@ -5345,7 +5546,7 @@
     Object.defineProperty(HTMLElement.prototype, name, {
       value: function() {
         scope.renderAllPending();
-        return this.impl[name].apply(this.impl, arguments);
+        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
       },
       configurable: true,
       enumerable: true
@@ -5379,6 +5580,7 @@
   var HTMLElement = scope.wrappers.HTMLElement;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var wrap = scope.wrap;
 
   var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
@@ -5390,7 +5592,7 @@
 
   mixin(HTMLCanvasElement.prototype, {
     getContext: function() {
-      var context = this.impl.getContext.apply(this.impl, arguments);
+      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
       return context && wrap(context);
     }
   });
@@ -5419,6 +5621,8 @@
   }
   HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
   mixin(HTMLContentElement.prototype, {
+    constructor: HTMLContentElement,
+
     get select() {
       return this.getAttribute('select');
     },
@@ -5539,6 +5743,7 @@
     HTMLElement.call(this, node);
   }
   HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
+  HTMLShadowElement.prototype.constructor = HTMLShadowElement;
 
   // getDistributedNodes is added in ShadowRenderer
 
@@ -5558,6 +5763,7 @@
   var HTMLElement = scope.wrappers.HTMLElement;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
 
@@ -5604,9 +5810,10 @@
   HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
 
   mixin(HTMLTemplateElement.prototype, {
+    constructor: HTMLTemplateElement,
     get content() {
       if (OriginalHTMLTemplateElement)
-        return wrap(this.impl.content);
+        return wrap(unsafeUnwrap(this).content);
       return contentTable.get(this);
     },
 
@@ -5632,6 +5839,8 @@
 
   var OriginalHTMLMediaElement = window.HTMLMediaElement;
 
+  if (!OriginalHTMLMediaElement) return;
+
   function HTMLMediaElement(node) {
     HTMLElement.call(this, node);
   }
@@ -5657,6 +5866,8 @@
 
   var OriginalHTMLAudioElement = window.HTMLAudioElement;
 
+  if (!OriginalHTMLAudioElement) return;
+
   function HTMLAudioElement(node) {
     HTMLMediaElement.call(this, node);
   }
@@ -5889,6 +6100,7 @@
   }
   HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
   mixin(HTMLTableSectionElement.prototype, {
+    constructor: HTMLTableSectionElement,
     get rows() {
       return wrapHTMLCollection(unwrap(this).rows);
     },
@@ -6059,6 +6271,7 @@
   var EventTarget = scope.wrappers.EventTarget;
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var wrap = scope.wrap;
 
   var OriginalSVGElementInstance = window.SVGElementInstance;
@@ -6073,17 +6286,17 @@
   mixin(SVGElementInstance.prototype, {
     /** @type {SVGElement} */
     get correspondingElement() {
-      return wrap(this.impl.correspondingElement);
+      return wrap(unsafeUnwrap(this).correspondingElement);
     },
 
     /** @type {SVGUseElement} */
     get correspondingUseElement() {
-      return wrap(this.impl.correspondingUseElement);
+      return wrap(unsafeUnwrap(this).correspondingUseElement);
     },
 
     /** @type {SVGElementInstance} */
     get parentNode() {
-      return wrap(this.impl.parentNode);
+      return wrap(unsafeUnwrap(this).parentNode);
     },
 
     /** @type {SVGElementInstanceList} */
@@ -6093,22 +6306,22 @@
 
     /** @type {SVGElementInstance} */
     get firstChild() {
-      return wrap(this.impl.firstChild);
+      return wrap(unsafeUnwrap(this).firstChild);
     },
 
     /** @type {SVGElementInstance} */
     get lastChild() {
-      return wrap(this.impl.lastChild);
+      return wrap(unsafeUnwrap(this).lastChild);
     },
 
     /** @type {SVGElementInstance} */
     get previousSibling() {
-      return wrap(this.impl.previousSibling);
+      return wrap(unsafeUnwrap(this).previousSibling);
     },
 
     /** @type {SVGElementInstance} */
     get nextSibling() {
-      return wrap(this.impl.nextSibling);
+      return wrap(unsafeUnwrap(this).nextSibling);
     }
   });
 
@@ -6126,6 +6339,8 @@
 
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
@@ -6133,22 +6348,22 @@
   var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
 
   function CanvasRenderingContext2D(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
 
   mixin(CanvasRenderingContext2D.prototype, {
     get canvas() {
-      return wrap(this.impl.canvas);
+      return wrap(unsafeUnwrap(this).canvas);
     },
 
     drawImage: function() {
       arguments[0] = unwrapIfNeeded(arguments[0]);
-      this.impl.drawImage.apply(this.impl, arguments);
+      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
     },
 
     createPattern: function() {
       arguments[0] = unwrap(arguments[0]);
-      return this.impl.createPattern.apply(this.impl, arguments);
+      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
     }
   });
 
@@ -6167,6 +6382,8 @@
 
   var mixin = scope.mixin;
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
 
@@ -6177,22 +6394,22 @@
     return;
 
   function WebGLRenderingContext(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
 
   mixin(WebGLRenderingContext.prototype, {
     get canvas() {
-      return wrap(this.impl.canvas);
+      return wrap(unsafeUnwrap(this).canvas);
     },
 
     texImage2D: function() {
       arguments[5] = unwrapIfNeeded(arguments[5]);
-      this.impl.texImage2D.apply(this.impl, arguments);
+      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
     },
 
     texSubImage2D: function() {
       arguments[6] = unwrapIfNeeded(arguments[6]);
-      this.impl.texSubImage2D.apply(this.impl, arguments);
+      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
     }
   });
 
@@ -6217,6 +6434,8 @@
   'use strict';
 
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
@@ -6224,78 +6443,78 @@
   var OriginalRange = window.Range;
 
   function Range(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
   Range.prototype = {
     get startContainer() {
-      return wrap(this.impl.startContainer);
+      return wrap(unsafeUnwrap(this).startContainer);
     },
     get endContainer() {
-      return wrap(this.impl.endContainer);
+      return wrap(unsafeUnwrap(this).endContainer);
     },
     get commonAncestorContainer() {
-      return wrap(this.impl.commonAncestorContainer);
+      return wrap(unsafeUnwrap(this).commonAncestorContainer);
     },
     setStart: function(refNode,offset) {
-      this.impl.setStart(unwrapIfNeeded(refNode), offset);
+      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
     },
     setEnd: function(refNode,offset) {
-      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
+      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
     },
     setStartBefore: function(refNode) {
-      this.impl.setStartBefore(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
     },
     setStartAfter: function(refNode) {
-      this.impl.setStartAfter(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
     },
     setEndBefore: function(refNode) {
-      this.impl.setEndBefore(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
     },
     setEndAfter: function(refNode) {
-      this.impl.setEndAfter(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
     },
     selectNode: function(refNode) {
-      this.impl.selectNode(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
     },
     selectNodeContents: function(refNode) {
-      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
+      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
     },
     compareBoundaryPoints: function(how, sourceRange) {
-      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
+      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
     },
     extractContents: function() {
-      return wrap(this.impl.extractContents());
+      return wrap(unsafeUnwrap(this).extractContents());
     },
     cloneContents: function() {
-      return wrap(this.impl.cloneContents());
+      return wrap(unsafeUnwrap(this).cloneContents());
     },
     insertNode: function(node) {
-      this.impl.insertNode(unwrapIfNeeded(node));
+      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
     },
     surroundContents: function(newParent) {
-      this.impl.surroundContents(unwrapIfNeeded(newParent));
+      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
     },
     cloneRange: function() {
-      return wrap(this.impl.cloneRange());
+      return wrap(unsafeUnwrap(this).cloneRange());
     },
     isPointInRange: function(node, offset) {
-      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
+      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
     },
     comparePoint: function(node, offset) {
-      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
+      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
     },
     intersectsNode: function(node) {
-      return this.impl.intersectsNode(unwrapIfNeeded(node));
+      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
     },
     toString: function() {
-      return this.impl.toString();
+      return unsafeUnwrap(this).toString();
     }
   };
 
   // IE9 does not have createContextualFragment.
   if (OriginalRange.prototype.createContextualFragment) {
     Range.prototype.createContextualFragment = function(html) {
-      return wrap(this.impl.createContextualFragment(html));
+      return wrap(unsafeUnwrap(this).createContextualFragment(html));
     };
   }
 
@@ -6345,6 +6564,7 @@
   var mixin = scope.mixin;
   var rewrap = scope.rewrap;
   var setInnerHTML = scope.setInnerHTML;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
 
   var shadowHostTable = new WeakMap();
@@ -6353,7 +6573,7 @@
   var spaceCharRe = /[ \t\n\r\f]/;
 
   function ShadowRoot(hostWrapper) {
-    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());
+    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
     DocumentFragment.call(this, node);
 
     // createDocumentFragment associates the node with a wrapper
@@ -6370,6 +6590,8 @@
   }
   ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
   mixin(ShadowRoot.prototype, {
+    constructor: ShadowRoot,
+
     get innerHTML() {
       return getInnerHTML(this);
     },
@@ -6421,6 +6643,7 @@
   var getTreeScope = scope.getTreeScope;
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
 
@@ -6891,7 +7114,7 @@
     },
 
     associateNode: function(node) {
-      node.impl.polymerShadowRenderer_ = this;
+      unsafeUnwrap(node).polymerShadowRenderer_ = this;
     }
   };
 
@@ -6945,7 +7168,8 @@
   //   ClassSelector
   //   IDSelector
   //   AttributeSelector
-  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;
+  //   negation
+  var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
 
   function matches(node, contentElement) {
     var select = contentElement.getAttribute('select');
@@ -7014,7 +7238,7 @@
    * This gets called when a node was added or removed to it.
    */
   Node.prototype.invalidateShadowRenderer = function(force) {
-    var renderer = this.impl.polymerShadowRenderer_;
+    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
     if (renderer) {
       renderer.invalidate();
       return true;
@@ -7045,7 +7269,7 @@
     var renderer;
     if (shadowRoot)
       renderer = getRendererForShadowRoot(shadowRoot);
-    this.impl.polymerShadowRenderer_ = renderer;
+    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
     if (renderer)
       renderer.invalidate();
   };
@@ -7127,6 +7351,8 @@
   'use strict';
 
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
@@ -7134,38 +7360,38 @@
   var OriginalSelection = window.Selection;
 
   function Selection(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
   Selection.prototype = {
     get anchorNode() {
-      return wrap(this.impl.anchorNode);
+      return wrap(unsafeUnwrap(this).anchorNode);
     },
     get focusNode() {
-      return wrap(this.impl.focusNode);
+      return wrap(unsafeUnwrap(this).focusNode);
     },
     addRange: function(range) {
-      this.impl.addRange(unwrap(range));
+      unsafeUnwrap(this).addRange(unwrap(range));
     },
     collapse: function(node, index) {
-      this.impl.collapse(unwrapIfNeeded(node), index);
+      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
     },
     containsNode: function(node, allowPartial) {
-      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);
+      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
     },
     extend: function(node, offset) {
-      this.impl.extend(unwrapIfNeeded(node), offset);
+      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
     },
     getRangeAt: function(index) {
-      return wrap(this.impl.getRangeAt(index));
+      return wrap(unsafeUnwrap(this).getRangeAt(index));
     },
     removeRange: function(range) {
-      this.impl.removeRange(unwrap(range));
+      unsafeUnwrap(this).removeRange(unwrap(range));
     },
     selectAllChildren: function(node) {
-      this.impl.selectAllChildren(unwrapIfNeeded(node));
+      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));
     },
     toString: function() {
-      return this.impl.toString();
+      return unsafeUnwrap(this).toString();
     }
   };
 
@@ -7210,6 +7436,8 @@
   var registerWrapper = scope.registerWrapper;
   var renderAllPending = scope.renderAllPending;
   var rewrap = scope.rewrap;
+  var setWrapper = scope.setWrapper;
+  var unsafeUnwrap = scope.unsafeUnwrap;
   var unwrap = scope.unwrap;
   var wrap = scope.wrap;
   var wrapEventTargetMethods = scope.wrapEventTargetMethods;
@@ -7236,7 +7464,7 @@
   function wrapMethod(name) {
     var original = document[name];
     Document.prototype[name] = function() {
-      return wrap(original.apply(this.impl, arguments));
+      return wrap(original.apply(unsafeUnwrap(this), arguments));
     };
   }
 
@@ -7255,7 +7483,7 @@
   var originalAdoptNode = document.adoptNode;
 
   function adoptNodeNoRemove(node, doc) {
-    originalAdoptNode.call(doc.impl, unwrap(node));
+    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
     adoptSubtree(node, doc);
   }
 
@@ -7288,7 +7516,7 @@
       return elementFromPoint(this, this, x, y);
     },
     importNode: function(node, deep) {
-      return cloneNode(node, deep, this.impl);
+      return cloneNode(node, deep, unsafeUnwrap(this));
     },
     getSelection: function() {
       renderAllPending();
@@ -7383,7 +7611,7 @@
             return document.createElement(tagName);
           }
         }
-        this.impl = node;
+        setWrapper(node, this);
       }
       CustomElementConstructor.prototype = prototype;
       CustomElementConstructor.prototype.constructor = CustomElementConstructor;
@@ -7480,20 +7708,20 @@
   ]);
 
   function DOMImplementation(impl) {
-    this.impl = impl;
+    setWrapper(impl, this);
   }
 
   function wrapImplMethod(constructor, name) {
     var original = document.implementation[name];
     constructor.prototype[name] = function() {
-      return wrap(original.apply(this.impl, arguments));
+      return wrap(original.apply(unsafeUnwrap(this), arguments));
     };
   }
 
   function forwardImplMethod(constructor, name) {
     var original = document.implementation[name];
     constructor.prototype[name] = function() {
-      return original.apply(this.impl, arguments);
+      return original.apply(unsafeUnwrap(this), arguments);
     };
   }
 
@@ -7537,6 +7765,7 @@
 
   var OriginalWindow = window.Window;
   var originalGetComputedStyle = window.getComputedStyle;
+  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
   var originalGetSelection = window.getSelection;
 
   function Window(impl) {
@@ -7548,6 +7777,14 @@
     return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
   };
 
+  // Mozilla proprietary extension.
+  if (originalGetDefaultComputedStyle) {
+    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
+      return wrap(this || window).getDefaultComputedStyle(
+          unwrapIfNeeded(el), pseudo);
+    };
+  }
+
   OriginalWindow.prototype.getSelection = function() {
     return wrap(this || window).getSelection();
   };
@@ -7583,6 +7820,15 @@
     }
   });
 
+  // Mozilla proprietary extension.
+  if (originalGetDefaultComputedStyle) {
+    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
+      renderAllPending();
+      return originalGetDefaultComputedStyle.call(unwrap(this),
+          unwrapIfNeeded(el),pseudo);
+    };
+  }
+
   registerWrapper(OriginalWindow, Window, window);
 
   scope.wrappers.Window = Window;
@@ -7626,12 +7872,19 @@
   'use strict';
 
   var registerWrapper = scope.registerWrapper;
+  var setWrapper = scope.setWrapper;
   var unwrap = scope.unwrap;
 
   var OriginalFormData = window.FormData;
 
   function FormData(formElement) {
-    this.impl = new OriginalFormData(formElement && unwrap(formElement));
+    var impl;
+    if (formElement instanceof OriginalFormData) {
+      impl = formElement;
+    } else {
+      impl = new OriginalFormData(formElement && unwrap(formElement));
+    }
+    setWrapper(impl, this);
   }
 
   registerWrapper(OriginalFormData, FormData, new OriginalFormData());
@@ -8395,13 +8648,13 @@
     cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
     // TODO(sorvell): remove either content or comment
     cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
-    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*['|"]([^'"]*)['|"][^}]*}([^{]*?){/gim,
+    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,  
     // TODO(sorvell): remove either content or comment
     cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,
+    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,
     // TODO(sorvell): remove either content or comment
     cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,
+    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,
     cssPseudoRe = /::(x-[^\s{,(]*)/gim,
     cssPartRe = /::part\(([^)]*)\)/gim,
     // note: :host pre-processed to -shadowcsshost.
@@ -8597,7 +8850,7 @@
           if (elt.parentNode === head) {
             head.replaceChild(style, elt);
           } else {
-            head.appendChild(style);
+            this.addElementToDocument(style);
           }
         }
         style.__importParsed = true;
@@ -9234,9 +9487,22 @@
     }
   };
 
+  // Copy over the static methods
+  var OriginalURL = scope.URL;
+  if (OriginalURL) {
+    jURL.createObjectURL = function(blob) {
+      // IE extension allows a second optional options argument.
+      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx
+      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
+    };
+    jURL.revokeObjectURL = function(url) {
+      OriginalURL.revokeObjectURL(url);
+    };
+  }
+
   scope.URL = jURL;
 
-})(window);
+})(this);
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -10464,17 +10730,195 @@
 })(this);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 window.HTMLImports = window.HTMLImports || {flags:{}};
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */(function(scope) {
 
+var hasNative = ('import' in document.createElement('link'));
+var useNative = hasNative;
+
+isIE = /Trident/.test(navigator.userAgent);
+
+// TODO(sorvell): SD polyfill intrusion
+var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
+var wrap = function(node) {
+  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
+};
+var mainDoc = wrap(document);
+    
+// NOTE: We cannot polyfill document.currentScript because it's not possible
+// both to override and maintain the ability to capture the native value;
+// therefore we choose to expose _currentScript both when native imports
+// and the polyfill are in use.
+var currentScriptDescriptor = {
+  get: function() {
+    var script = HTMLImports.currentScript || document.currentScript ||
+        // NOTE: only works when called in synchronously executing code.
+        // readyState should check if `loading` but IE10 is 
+        // interactive when scripts run so we cheat.
+        (document.readyState !== 'complete' ? 
+        document.scripts[document.scripts.length - 1] : null);
+    return wrap(script);
+  },
+  configurable: true
+};
+
+Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
+Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
+
+// call a callback when all HTMLImports in the document at call (or at least
+//  document ready) time have loaded.
+// 1. ensure the document is in a ready state (has dom), then 
+// 2. watch for loading of imports and call callback when done
+function whenImportsReady(callback, doc) {
+  doc = doc || mainDoc;
+  // if document is loading, wait and try again
+  whenDocumentReady(function() {
+    watchImportsLoad(callback, doc);
+  }, doc);
+}
+
+// call the callback when the document is in a ready state (has dom)
+var requiredReadyState = isIE ? 'complete' : 'interactive';
+var READY_EVENT = 'readystatechange';
+function isDocumentReady(doc) {
+  return (doc.readyState === 'complete' ||
+      doc.readyState === requiredReadyState);
+}
+
+// call <callback> when we ensure the document is in a ready state
+function whenDocumentReady(callback, doc) {
+  if (!isDocumentReady(doc)) {
+    var checkReady = function() {
+      if (doc.readyState === 'complete' || 
+          doc.readyState === requiredReadyState) {
+        doc.removeEventListener(READY_EVENT, checkReady);
+        whenDocumentReady(callback, doc);
+      }
+    }
+    doc.addEventListener(READY_EVENT, checkReady);
+  } else if (callback) {
+    callback();
+  }
+}
+
+// call <callback> when we ensure all imports have loaded
+function watchImportsLoad(callback, doc) {
+  var imports = doc.querySelectorAll('link[rel=import]');
+  var loaded = 0, l = imports.length;
+  function checkDone(d) { 
+    if (loaded == l) {
+      callback && callback();
+    }
+  }
+  function loadedImport(e) {
+    loaded++;
+    checkDone();
+  }
+  if (l) {
+    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
+      if (isImportLoaded(imp)) {
+        loadedImport.call(imp);
+      } else {
+        imp.addEventListener('load', loadedImport);
+        imp.addEventListener('error', loadedImport);
+      }
+    }
+  } else {
+    checkDone();
+  }
+}
+
+// NOTE: test for native imports loading is based on explicitly watching
+// all imports (see below).
+function isImportLoaded(link) {
+  return useNative ? link.__loaded : link.__importParsed;
+}
+
+// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
+// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
+// and should be removed when this bug is addressed.
+if (useNative) {
+  new MutationObserver(function(mxns) {
+    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
+      if (m.addedNodes) {
+        handleImports(m.addedNodes);
+      }
+    }
+  }).observe(document.head, {childList: true});
+
+  function handleImports(nodes) {
+    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+      if (isImport(n)) {
+        handleImport(n);  
+      }
+    }
+  }
+
+  function isImport(element) {
+    return element.localName === 'link' && element.rel === 'import';
+  }
+
+  function handleImport(element) {
+    var loaded = element.import;
+    if (loaded) {
+      markTargetLoaded({target: element});
+    } else {
+      element.addEventListener('load', markTargetLoaded);
+      element.addEventListener('error', markTargetLoaded);
+    }
+  }
+
+  function markTargetLoaded(event) {
+    event.target.__loaded = true;
+  }
+
+}
+
+// Fire the 'HTMLImportsLoaded' event when imports in document at load time 
+// have loaded. This event is required to simulate the script blocking 
+// behavior of native imports. A main document script that needs to be sure
+// imports have loaded should wait for this event.
+whenImportsReady(function() {
+  HTMLImports.ready = true;
+  HTMLImports.readyTime = new Date().getTime();
+  mainDoc.dispatchEvent(
+    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
+  );
+});
+
+// exports
+scope.useNative = useNative;
+scope.isImportLoaded = isImportLoaded;
+scope.whenReady = whenImportsReady;
+scope.isIE = isIE;
+
+// deprecated
+scope.whenImportsReady = whenImportsReady;
+
+})(window.HTMLImports);
+
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
 (function(scope) {
 
   // imports
@@ -10583,22 +11027,13 @@
     receive: function(url, elt, err, resource, redirectedUrl) {
       this.cache[url] = resource;
       var $p = this.pending[url];
-      if ( redirectedUrl && redirectedUrl !== url ) {
-        this.cache[redirectedUrl] = resource;
-        $p = $p.concat(this.pending[redirectedUrl]);
-      }
       for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
-        //if (!err) {
-          // If url was redirected, use the redirected location so paths are
-          // calculated relative to that.
-          this.onload(redirectedUrl || url, p, resource);
-        //}
+        // If url was redirected, use the redirected location so paths are
+        // calculated relative to that.
+        this.onload(url, p, resource, err, redirectedUrl);
         this.tail();
       }
       this.pending[url] = null;
-      if ( redirectedUrl && redirectedUrl !== url ) {
-        this.pending[redirectedUrl] = null;
-      }
     },
     tail: function() {
       --this.inflight;
@@ -10633,7 +11068,7 @@
           if (locationHeader) {
             var redirectedUrl = (locationHeader.substr( 0, 1 ) === "/")
               ? location.origin + locationHeader  // Location is a relative path
-              : redirectedUrl;                    // Full path
+              : locationHeader;                    // Full path
           }
           next.call(nextContext, !xhr.ok(request) && request,
               request.response || request.responseText, redirectedUrl);
@@ -10654,16 +11089,18 @@
 })(window.HTMLImports);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-
 (function(scope) {
 
 var IMPORT_LINK_TYPE = 'import';
 var flags = scope.flags;
-var isIe = /Trident/.test(navigator.userAgent);
+var isIE = scope.isIE;
 // TODO(sorvell): SD polyfill intrusion
 var mainDoc = window.ShadowDOMPolyfill ? 
     window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
@@ -10752,10 +11189,12 @@
     if (HTMLImports.__importsParsingHook) {
       HTMLImports.__importsParsingHook(elt);
     }
-    elt.import.__importParsed = true;
+    if (elt.import) {
+      elt.import.__importParsed = true;
+    }
     this.markParsingComplete(elt);
     // fire load event
-    if (elt.__resource) {
+    if (elt.__resource && !elt.__error) {
       elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
     } else {
       elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));
@@ -10791,7 +11230,23 @@
   },
   parseGeneric: function(elt) {
     this.trackElement(elt);
-    document.head.appendChild(elt);
+    this.addElementToDocument(elt);
+  },
+  rootImportForElement: function(elt) {
+    var n = elt;
+    while (n.ownerDocument.__importLink) {
+      n = n.ownerDocument.__importLink;
+    }
+    return n;
+  },
+  addElementToDocument: function(elt) {
+    var port = this.rootImportForElement(elt.__importElement || elt);
+    var l = port.__insertedElements = port.__insertedElements || 0;
+    var refNode = port.nextElementSibling;
+    for (var i=0; i < l; i++) {
+      refNode = refNode && refNode.nextElementSibling;
+    }
+    port.parentNode.insertBefore(elt, refNode);
   },
   // tracks when a loadable element has loaded
   trackElement: function(elt, callback) {
@@ -10808,7 +11263,7 @@
 
     // NOTE: IE does not fire "load" event for styles that have already loaded
     // This is in violation of the spec, so we try our hardest to work around it
-    if (isIe && elt.localName === 'style') {
+    if (isIE && elt.localName === 'style') {
       var fakeLoad = false;
       // If there's not @import in the textContent, assume it has loaded
       if (elt.textContent.indexOf('@import') == -1) {
@@ -10848,20 +11303,22 @@
       script.parentNode.removeChild(script);
       scope.currentScript = null;  
     });
-    document.head.appendChild(script);
+    this.addElementToDocument(script);
   },
   // determine the next element in the tree which should be parsed
   nextToParse: function() {
     return !this.parsingElement && this.nextToParseInDoc(mainDoc);
   },
   nextToParseInDoc: function(doc, link) {
-    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
-    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {
-      if (!this.isParsed(n)) {
-        if (this.hasResource(n)) {
-          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
-        } else {
-          return;
+    if (doc) {
+      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
+      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {
+        if (!this.isParsed(n)) {
+          if (this.hasResource(n)) {
+            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
+          } else {
+            return;
+          }
         }
       }
     }
@@ -10877,7 +11334,7 @@
     return node.__importParsed;
   },
   hasResource: function(node) {
-    if (nodeIsImport(node) && !node.import) {
+    if (nodeIsImport(node) && (node.import === undefined)) {
       return false;
     }
     return true;
@@ -10890,15 +11347,7 @@
 
 function generateScriptDataUrl(script) {
   var scriptContent = generateScriptContent(script);
-  var b64 = 'data:text/javascript';
-  // base64 may be smaller, but does not handle unicode characters
-  // attempt base64 first, fall back to escaped text
-  try {
-    b64 += (';base64,' + btoa(scriptContent));
-  } catch(e) {
-    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));
-  }
-  return b64;
+  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);
 }
 
 function generateScriptContent(script) {
@@ -10963,20 +11412,20 @@
 // exports
 scope.parser = importParser;
 scope.path = path;
-scope.isIE = isIe;
 
 })(HTMLImports);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
+ (function(scope) {
 
-(function(scope) {
-
-var hasNative = ('import' in document.createElement('link'));
-var useNative = hasNative;
+var useNative = scope.useNative;
 var flags = scope.flags;
 var IMPORT_LINK_TYPE = 'import';
 
@@ -11024,22 +11473,25 @@
       return doc === mainDoc ? this.documentPreloadSelectors :
           this.importsPreloadSelectors;
     },
-    loaded: function(url, elt, resource) {
+    loaded: function(url, elt, resource, err, redirectedUrl) {
       flags.load && console.log('loaded', url, elt);
       // store generic resource
       // TODO(sorvell): fails for nodes inside <template>.content
       // see https://code.google.com/p/chromium/issues/detail?id=249381.
       elt.__resource = resource;
+      elt.__error = err;
       if (isDocumentLink(elt)) {
         var doc = this.documents[url];
         // if we've never seen a document at this url
-        if (!doc) {
+        if (doc === undefined) {
           // generate an HTMLDocument from data
-          doc = makeDocument(resource, url);
-          doc.__importLink = elt;
-          // TODO(sorvell): we cannot use MO to detect parsed nodes because
-          // SD polyfill does not report these as mutations.
-          this.bootDocument(doc);
+          doc = err ? null : makeDocument(resource, redirectedUrl || url);
+          if (doc) {
+            doc.__importLink = elt;
+            // note, we cannot use MO to detect parsed nodes because
+            // SD polyfill does not report these as mutations.
+            this.bootDocument(doc);
+          }
           // cache document
           this.documents[url] = doc;
         }
@@ -11112,166 +11564,54 @@
     }
     return doc;
   }
+
+  // Polyfill document.baseURI for browsers without it.
+  if (!document.baseURI) {
+    var baseURIDescriptor = {
+      get: function() {
+        var base = document.querySelector('base');
+        return base ? base.href : window.location.href;
+      },
+      configurable: true
+    };
+
+    Object.defineProperty(document, 'baseURI', baseURIDescriptor);
+    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
+  }
+
+  // IE shim for CustomEvent
+  if (typeof window.CustomEvent !== 'function') {
+    window.CustomEvent = function(inType, dictionary) {
+       var e = document.createEvent('HTMLEvents');
+       e.initEvent(inType,
+          dictionary.bubbles === false ? false : true,
+          dictionary.cancelable === false ? false : true,
+          dictionary.detail);
+       return e;
+    };
+  }
+
 } else {
   // do nothing if using native imports
   var importer = {};
 }
 
-// NOTE: We cannot polyfill document.currentScript because it's not possible
-// both to override and maintain the ability to capture the native value;
-// therefore we choose to expose _currentScript both when native imports
-// and the polyfill are in use.
-var currentScriptDescriptor = {
-  get: function() {
-    return HTMLImports.currentScript || document.currentScript;
-  },
-  configurable: true
-};
-
-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
-Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
-
-// Polyfill document.baseURI for browsers without it.
-if (!document.baseURI) {
-  var baseURIDescriptor = {
-    get: function() {
-      return window.location.href;
-    },
-    configurable: true
-  };
-
-  Object.defineProperty(document, 'baseURI', baseURIDescriptor);
-  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
-}
-
-// call a callback when all HTMLImports in the document at call (or at least
-//  document ready) time have loaded.
-// 1. ensure the document is in a ready state (has dom), then 
-// 2. watch for loading of imports and call callback when done
-function whenImportsReady(callback, doc) {
-  doc = doc || mainDoc;
-  // if document is loading, wait and try again
-  whenDocumentReady(function() {
-    watchImportsLoad(callback, doc);
-  }, doc);
-}
-
-// call the callback when the document is in a ready state (has dom)
-var requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';
-var READY_EVENT = 'readystatechange';
-function isDocumentReady(doc) {
-  return (doc.readyState === 'complete' ||
-      doc.readyState === requiredReadyState);
-}
-
-// call <callback> when we ensure the document is in a ready state
-function whenDocumentReady(callback, doc) {
-  if (!isDocumentReady(doc)) {
-    var checkReady = function() {
-      if (doc.readyState === 'complete' || 
-          doc.readyState === requiredReadyState) {
-        doc.removeEventListener(READY_EVENT, checkReady);
-        whenDocumentReady(callback, doc);
-      }
-    }
-    doc.addEventListener(READY_EVENT, checkReady);
-  } else if (callback) {
-    callback();
-  }
-}
-
-// call <callback> when we ensure all imports have loaded
-function watchImportsLoad(callback, doc) {
-  var imports = doc.querySelectorAll('link[rel=import]');
-  var loaded = 0, l = imports.length;
-  function checkDone(d) { 
-    if (loaded == l) {
-      callback && callback();
-    }
-  }
-  function loadedImport(e) {
-    loaded++;
-    checkDone();
-  }
-  if (l) {
-    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
-      if (isImportLoaded(imp)) {
-        loadedImport.call(imp);
-      } else {
-        imp.addEventListener('load', loadedImport);
-        imp.addEventListener('error', loadedImport);
-      }
-    }
-  } else {
-    checkDone();
-  }
-}
-
-function isImportLoaded(link) {
-  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :
-      link.__importParsed;
-}
-
-// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
-// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
-// and should be removed when this bug is addressed.
-if (useNative) {
-  new MutationObserver(function(mxns) {
-    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
-      if (m.addedNodes) {
-        handleImports(m.addedNodes);
-      }
-    }
-  }).observe(document.head, {childList: true});
-
-  function handleImports(nodes) {
-    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-      if (isImport(n)) {
-        handleImport(n);  
-      }
-    }
-  }
-
-  function isImport(element) {
-    return element.localName === 'link' && element.rel === 'import';
-  }
-
-  function handleImport(element) {
-    var loaded = element.import;
-    if (loaded) {
-      markTargetLoaded({target: element});
-    } else {
-      element.addEventListener('load', markTargetLoaded);
-      element.addEventListener('error', markTargetLoaded);
-    }
-  }
-
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-
-}
-
 // exports
-scope.hasNative = hasNative;
-scope.useNative = useNative;
 scope.importer = importer;
 scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-scope.isImportLoaded = isImportLoaded;
 scope.importLoader = importLoader;
-scope.whenReady = whenImportsReady;
 
-// deprecated
-scope.whenImportsReady = whenImportsReady;
 
 })(window.HTMLImports);
 
- /*
-Copyright 2013 The Polymer Authors. All rights reserved.
-Use of this source code is governed by a BSD-style
-license that can be found in the LICENSE file.
-*/
-
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
 (function(scope){
 
 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
@@ -11337,43 +11677,21 @@
 })(HTMLImports);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 (function(){
 
 // bootstrap
 
-// IE shim for CustomEvent
-if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType, dictionary) {
-     var e = document.createEvent('HTMLEvents');
-     e.initEvent(inType,
-        dictionary.bubbles === false ? false : true,
-        dictionary.cancelable === false ? false : true,
-        dictionary.detail);
-     return e;
-  };
-}
-
 // TODO(sorvell): SD polyfill intrusion
 var doc = window.ShadowDOMPolyfill ? 
     window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
 
-// Fire the 'HTMLImportsLoaded' event when imports in document at load time 
-// have loaded. This event is required to simulate the script blocking 
-// behavior of native imports. A main document script that needs to be sure
-// imports have loaded should wait for this event.
-HTMLImports.whenImportsReady(function() {
-  HTMLImports.ready = true;
-  HTMLImports.readyTime = new Date().getTime();
-  doc.dispatchEvent(
-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
-  );
-});
-
-
 // no need to bootstrap the polyfill when native imports is available.
 if (!HTMLImports.useNative) {
   function bootstrap() {
@@ -11394,364 +11712,373 @@
 })();
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 window.CustomElements = window.CustomElements || {flags:{}};
- /*

-Copyright 2013 The Polymer Authors. All rights reserved.

-Use of this source code is governed by a BSD-style

-license that can be found in the LICENSE file.

-*/

-

-(function(scope){

-

-var logFlags = window.logFlags || {};

-var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';

-

-// walk the subtree rooted at node, applying 'find(element, data)' function

-// to each element

-// if 'find' returns true for 'element', do not search element's subtree

-function findAll(node, find, data) {

-  var e = node.firstElementChild;

-  if (!e) {

-    e = node.firstChild;

-    while (e && e.nodeType !== Node.ELEMENT_NODE) {

-      e = e.nextSibling;

-    }

-  }

-  while (e) {

-    if (find(e, data) !== true) {

-      findAll(e, find, data);

-    }

-    e = e.nextElementSibling;

-  }

-  return null;

-}

-

-// walk all shadowRoots on a given node.

-function forRoots(node, cb) {

-  var root = node.shadowRoot;

-  while(root) {

-    forSubtree(root, cb);

-    root = root.olderShadowRoot;

-  }

-}

-

-// walk the subtree rooted at node, including descent into shadow-roots,

-// applying 'cb' to each element

-function forSubtree(node, cb) {

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);

-  findAll(node, function(e) {

-    if (cb(e)) {

-      return true;

-    }

-    forRoots(e, cb);

-  });

-  forRoots(node, cb);

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();

-}

-

-// manage lifecycle on added node

-function added(node) {

-  if (upgrade(node)) {

-    insertedNode(node);

-    return true;

-  }

-  inserted(node);

-}

-

-// manage lifecycle on added node's subtree only

-function addedSubtree(node) {

-  forSubtree(node, function(e) {

-    if (added(e)) {

-      return true;

-    }

-  });

-}

-

-// manage lifecycle on added node and it's subtree

-function addedNode(node) {

-  return added(node) || addedSubtree(node);

-}

-

-// upgrade custom elements at node, if applicable

-function upgrade(node) {

-  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {

-    var type = node.getAttribute('is') || node.localName;

-    var definition = scope.registry[type];

-    if (definition) {

-      logFlags.dom && console.group('upgrade:', node.localName);

-      scope.upgrade(node);

-      logFlags.dom && console.groupEnd();

-      return true;

-    }

-  }

-}

-

-function insertedNode(node) {

-  inserted(node);

-  if (inDocument(node)) {

-    forSubtree(node, function(e) {

-      inserted(e);

-    });

-  }

-}

-

-// TODO(sorvell): on platforms without MutationObserver, mutations may not be

-// reliable and therefore attached/detached are not reliable.

-// To make these callbacks less likely to fail, we defer all inserts and removes

-// to give a chance for elements to be inserted into dom.

-// This ensures attachedCallback fires for elements that are created and

-// immediately added to dom.

-var hasPolyfillMutations = (!window.MutationObserver ||

-    (window.MutationObserver === window.JsMutationObserver));

-scope.hasPolyfillMutations = hasPolyfillMutations;

-

-var isPendingMutations = false;

-var pendingMutations = [];

-function deferMutation(fn) {

-  pendingMutations.push(fn);

-  if (!isPendingMutations) {

-    isPendingMutations = true;

-    var async = (window.Platform && window.Platform.endOfMicrotask) ||

-        setTimeout;

-    async(takeMutations);

-  }

-}

-

-function takeMutations() {

-  isPendingMutations = false;

-  var $p = pendingMutations;

-  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {

-    p();

-  }

-  pendingMutations = [];

-}

-

-function inserted(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _inserted(element);

-    });

-  } else {

-    _inserted(element);

-  }

-}

-

-// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this

-function _inserted(element) {

-  // TODO(sjmiles): it's possible we were inserted and removed in the space

-  // of one microtask, in which case we won't be 'inDocument' here

-  // But there are other cases where we are testing for inserted without

-  // specific knowledge of mutations, and must test 'inDocument' to determine

-  // whether to call inserted

-  // If we can factor these cases into separate code paths we can have

-  // better diagnostics.

-  // TODO(sjmiles): when logging, do work on all custom elements so we can

-  // track behavior even when callbacks not defined

-  //console.log('inserted: ', element.localName);

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('inserted:', element.localName);

-    if (inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) + 1;

-      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state

-      if (element.__inserted < 1) {

-        element.__inserted = 1;

-      }

-      // if we are 'over inserted', squelch the callback

-      if (element.__inserted > 1) {

-        logFlags.dom && console.warn('inserted:', element.localName,

-          'insert/remove count:', element.__inserted)

-      } else if (element.attachedCallback) {

-        logFlags.dom && console.log('inserted:', element.localName);

-        element.attachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-function removedNode(node) {

-  removed(node);

-  forSubtree(node, function(e) {

-    removed(e);

-  });

-}

-

-function removed(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _removed(element);

-    });

-  } else {

-    _removed(element);

-  }

-}

-

-function _removed(element) {

-  // TODO(sjmiles): temporary: do work on all custom elements so we can track

-  // behavior even when callbacks not defined

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('removed:', element.localName);

-    if (!inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) - 1;

-      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state

-      if (element.__inserted > 0) {

-        element.__inserted = 0;

-      }

-      // if we are 'over removed', squelch the callback

-      if (element.__inserted < 0) {

-        logFlags.dom && console.warn('removed:', element.localName,

-            'insert/remove count:', element.__inserted)

-      } else if (element.detachedCallback) {

-        element.detachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-// SD polyfill intrustion due mainly to the fact that 'document'

-// is not entirely wrapped

-function wrapIfNeeded(node) {

-  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)

-      : node;

-}

-

-function inDocument(element) {

-  var p = element;

-  var doc = wrapIfNeeded(document);

-  while (p) {

-    if (p == doc) {

-      return true;

-    }

-    p = p.parentNode || p.host;

-  }

-}

-

-function watchShadow(node) {

-  if (node.shadowRoot && !node.shadowRoot.__watched) {

-    logFlags.dom && console.log('watching shadow-root for: ', node.localName);

-    // watch all unwatched roots...

-    var root = node.shadowRoot;

-    while (root) {

-      watchRoot(root);

-      root = root.olderShadowRoot;

-    }

-  }

-}

-

-function watchRoot(root) {

-  if (!root.__watched) {

-    observe(root);

-    root.__watched = true;

-  }

-}

-

-function handler(mutations) {

-  //

-  if (logFlags.dom) {

-    var mx = mutations[0];

-    if (mx && mx.type === 'childList' && mx.addedNodes) {

-        if (mx.addedNodes) {

-          var d = mx.addedNodes[0];

-          while (d && d !== document && !d.host) {

-            d = d.parentNode;

-          }

-          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';

-          u = u.split('/?').shift().split('/').pop();

-        }

-    }

-    console.group('mutations (%d) [%s]', mutations.length, u || '');

-  }

-  //

-  mutations.forEach(function(mx) {

-    //logFlags.dom && console.group('mutation');

-    if (mx.type === 'childList') {

-      forEach(mx.addedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        // nodes added may need lifecycle management

-        addedNode(n);

-      });

-      // removed nodes may need lifecycle management

-      forEach(mx.removedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        removedNode(n);

-      });

-    }

-    //logFlags.dom && console.groupEnd();

-  });

-  logFlags.dom && console.groupEnd();

-};

-

-var observer = new MutationObserver(handler);

-

-function takeRecords() {

-  // TODO(sjmiles): ask Raf why we have to call handler ourselves

-  handler(observer.takeRecords());

-  takeMutations();

-}

-

-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);

-

-function observe(inRoot) {

-  observer.observe(inRoot, {childList: true, subtree: true});

-}

-

-function observeDocument(doc) {

-  observe(doc);

-}

-

-function upgradeDocument(doc) {

-  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());

-  addedNode(doc);

-  logFlags.dom && console.groupEnd();

-}

-

-function upgradeDocumentTree(doc) {

-  doc = wrapIfNeeded(doc);

-  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());

-  // upgrade contained imported documents

-  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');

-  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {

-    if (n.import && n.import.__parsed) {

-      upgradeDocumentTree(n.import);

-    }

-  }

-  upgradeDocument(doc);

-}

-

-// exports

-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;

-scope.watchShadow = watchShadow;

-scope.upgradeDocumentTree = upgradeDocumentTree;

-scope.upgradeAll = addedNode;

-scope.upgradeSubtree = addedSubtree;

-scope.insertedNode = insertedNode;

-

-scope.observeDocument = observeDocument;

-scope.upgradeDocument = upgradeDocument;

-

-scope.takeRecords = takeRecords;

-

-})(window.CustomElements);

+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope){
+
+var logFlags = window.logFlags || {};
+var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';
+
+// walk the subtree rooted at node, applying 'find(element, data)' function
+// to each element
+// if 'find' returns true for 'element', do not search element's subtree
+function findAll(node, find, data) {
+  var e = node.firstElementChild;
+  if (!e) {
+    e = node.firstChild;
+    while (e && e.nodeType !== Node.ELEMENT_NODE) {
+      e = e.nextSibling;
+    }
+  }
+  while (e) {
+    if (find(e, data) !== true) {
+      findAll(e, find, data);
+    }
+    e = e.nextElementSibling;
+  }
+  return null;
+}
+
+// walk all shadowRoots on a given node.
+function forRoots(node, cb) {
+  var root = node.shadowRoot;
+  while(root) {
+    forSubtree(root, cb);
+    root = root.olderShadowRoot;
+  }
+}
+
+// walk the subtree rooted at node, including descent into shadow-roots,
+// applying 'cb' to each element
+function forSubtree(node, cb) {
+  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);
+  findAll(node, function(e) {
+    if (cb(e)) {
+      return true;
+    }
+    forRoots(e, cb);
+  });
+  forRoots(node, cb);
+  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();
+}
+
+// manage lifecycle on added node
+function added(node) {
+  if (upgrade(node)) {
+    insertedNode(node);
+    return true;
+  }
+  inserted(node);
+}
+
+// manage lifecycle on added node's subtree only
+function addedSubtree(node) {
+  forSubtree(node, function(e) {
+    if (added(e)) {
+      return true;
+    }
+  });
+}
+
+// manage lifecycle on added node and it's subtree
+function addedNode(node) {
+  return added(node) || addedSubtree(node);
+}
+
+// upgrade custom elements at node, if applicable
+function upgrade(node) {
+  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
+    var type = node.getAttribute('is') || node.localName;
+    var definition = scope.registry[type];
+    if (definition) {
+      logFlags.dom && console.group('upgrade:', node.localName);
+      scope.upgrade(node);
+      logFlags.dom && console.groupEnd();
+      return true;
+    }
+  }
+}
+
+function insertedNode(node) {
+  inserted(node);
+  if (inDocument(node)) {
+    forSubtree(node, function(e) {
+      inserted(e);
+    });
+  }
+}
+
+// TODO(sorvell): on platforms without MutationObserver, mutations may not be
+// reliable and therefore attached/detached are not reliable.
+// To make these callbacks less likely to fail, we defer all inserts and removes
+// to give a chance for elements to be inserted into dom.
+// This ensures attachedCallback fires for elements that are created and
+// immediately added to dom.
+var hasPolyfillMutations = (!window.MutationObserver ||
+    (window.MutationObserver === window.JsMutationObserver));
+scope.hasPolyfillMutations = hasPolyfillMutations;
+
+var isPendingMutations = false;
+var pendingMutations = [];
+function deferMutation(fn) {
+  pendingMutations.push(fn);
+  if (!isPendingMutations) {
+    isPendingMutations = true;
+    var async = (window.Platform && window.Platform.endOfMicrotask) ||
+        setTimeout;
+    async(takeMutations);
+  }
+}
+
+function takeMutations() {
+  isPendingMutations = false;
+  var $p = pendingMutations;
+  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
+    p();
+  }
+  pendingMutations = [];
+}
+
+function inserted(element) {
+  if (hasPolyfillMutations) {
+    deferMutation(function() {
+      _inserted(element);
+    });
+  } else {
+    _inserted(element);
+  }
+}
+
+// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this
+function _inserted(element) {
+  // TODO(sjmiles): it's possible we were inserted and removed in the space
+  // of one microtask, in which case we won't be 'inDocument' here
+  // But there are other cases where we are testing for inserted without
+  // specific knowledge of mutations, and must test 'inDocument' to determine
+  // whether to call inserted
+  // If we can factor these cases into separate code paths we can have
+  // better diagnostics.
+  // TODO(sjmiles): when logging, do work on all custom elements so we can
+  // track behavior even when callbacks not defined
+  //console.log('inserted: ', element.localName);
+  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {
+    logFlags.dom && console.group('inserted:', element.localName);
+    if (inDocument(element)) {
+      element.__inserted = (element.__inserted || 0) + 1;
+      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state
+      if (element.__inserted < 1) {
+        element.__inserted = 1;
+      }
+      // if we are 'over inserted', squelch the callback
+      if (element.__inserted > 1) {
+        logFlags.dom && console.warn('inserted:', element.localName,
+          'insert/remove count:', element.__inserted)
+      } else if (element.attachedCallback) {
+        logFlags.dom && console.log('inserted:', element.localName);
+        element.attachedCallback();
+      }
+    }
+    logFlags.dom && console.groupEnd();
+  }
+}
+
+function removedNode(node) {
+  removed(node);
+  forSubtree(node, function(e) {
+    removed(e);
+  });
+}
+
+function removed(element) {
+  if (hasPolyfillMutations) {
+    deferMutation(function() {
+      _removed(element);
+    });
+  } else {
+    _removed(element);
+  }
+}
+
+function _removed(element) {
+  // TODO(sjmiles): temporary: do work on all custom elements so we can track
+  // behavior even when callbacks not defined
+  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {
+    logFlags.dom && console.group('removed:', element.localName);
+    if (!inDocument(element)) {
+      element.__inserted = (element.__inserted || 0) - 1;
+      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state
+      if (element.__inserted > 0) {
+        element.__inserted = 0;
+      }
+      // if we are 'over removed', squelch the callback
+      if (element.__inserted < 0) {
+        logFlags.dom && console.warn('removed:', element.localName,
+            'insert/remove count:', element.__inserted)
+      } else if (element.detachedCallback) {
+        element.detachedCallback();
+      }
+    }
+    logFlags.dom && console.groupEnd();
+  }
+}
+
+// SD polyfill intrustion due mainly to the fact that 'document'
+// is not entirely wrapped
+function wrapIfNeeded(node) {
+  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)
+      : node;
+}
+
+function inDocument(element) {
+  var p = element;
+  var doc = wrapIfNeeded(document);
+  while (p) {
+    if (p == doc) {
+      return true;
+    }
+    p = p.parentNode || p.host;
+  }
+}
+
+function watchShadow(node) {
+  if (node.shadowRoot && !node.shadowRoot.__watched) {
+    logFlags.dom && console.log('watching shadow-root for: ', node.localName);
+    // watch all unwatched roots...
+    var root = node.shadowRoot;
+    while (root) {
+      watchRoot(root);
+      root = root.olderShadowRoot;
+    }
+  }
+}
+
+function watchRoot(root) {
+  if (!root.__watched) {
+    observe(root);
+    root.__watched = true;
+  }
+}
+
+function handler(mutations) {
+  //
+  if (logFlags.dom) {
+    var mx = mutations[0];
+    if (mx && mx.type === 'childList' && mx.addedNodes) {
+        if (mx.addedNodes) {
+          var d = mx.addedNodes[0];
+          while (d && d !== document && !d.host) {
+            d = d.parentNode;
+          }
+          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';
+          u = u.split('/?').shift().split('/').pop();
+        }
+    }
+    console.group('mutations (%d) [%s]', mutations.length, u || '');
+  }
+  //
+  mutations.forEach(function(mx) {
+    //logFlags.dom && console.group('mutation');
+    if (mx.type === 'childList') {
+      forEach(mx.addedNodes, function(n) {
+        //logFlags.dom && console.log(n.localName);
+        if (!n.localName) {
+          return;
+        }
+        // nodes added may need lifecycle management
+        addedNode(n);
+      });
+      // removed nodes may need lifecycle management
+      forEach(mx.removedNodes, function(n) {
+        //logFlags.dom && console.log(n.localName);
+        if (!n.localName) {
+          return;
+        }
+        removedNode(n);
+      });
+    }
+    //logFlags.dom && console.groupEnd();
+  });
+  logFlags.dom && console.groupEnd();
+};
+
+var observer = new MutationObserver(handler);
+
+function takeRecords() {
+  // TODO(sjmiles): ask Raf why we have to call handler ourselves
+  handler(observer.takeRecords());
+  takeMutations();
+}
+
+var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+function observe(inRoot) {
+  observer.observe(inRoot, {childList: true, subtree: true});
+}
+
+function observeDocument(doc) {
+  observe(doc);
+}
+
+function upgradeDocument(doc) {
+  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());
+  addedNode(doc);
+  logFlags.dom && console.groupEnd();
+}
+
+function upgradeDocumentTree(doc) {
+  doc = wrapIfNeeded(doc);
+  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());
+  // upgrade contained imported documents
+  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');
+  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {
+    if (n.import && n.import.__parsed) {
+      upgradeDocumentTree(n.import);
+    }
+  }
+  upgradeDocument(doc);
+}
+
+// exports
+scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+scope.watchShadow = watchShadow;
+scope.upgradeDocumentTree = upgradeDocumentTree;
+scope.upgradeAll = addedNode;
+scope.upgradeSubtree = addedSubtree;
+scope.insertedNode = insertedNode;
+
+scope.observeDocument = observeDocument;
+scope.upgradeDocument = upgradeDocument;
+
+scope.takeRecords = takeRecords;
+
+})(window.CustomElements);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
 /**
- * Implements `document.register`
+ * Implements `document.registerElement`
  * @module CustomElements
 */
 
@@ -11983,8 +12310,6 @@
     if (definition.is) {
       element.setAttribute('is', definition.is);
     }
-    // remove 'unresolved' attr, which is a standin for :unresolved.
-    element.removeAttribute('unresolved');
     // make 'element' implement definition.prototype
     implement(element, definition);
     // flag as upgraded
@@ -12222,9 +12547,12 @@
 })(window.CustomElements);
 
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
 (function(scope) {
@@ -12286,9 +12614,12 @@
 
 })(window.CustomElements);
 /*
- * Copyright 2013 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 (function(scope){
 
@@ -12298,14 +12629,19 @@
   CustomElements.parser.parse(document);
   // one more pass before register is 'live'
   CustomElements.upgradeDocument(document);
-  // choose async
-  var async = window.Platform && Platform.endOfMicrotask ? 
-    Platform.endOfMicrotask :
-    setTimeout;
-  async(function() {
-    // set internal 'ready' flag, now document.registerElement will trigger 
-    // synchronous upgrades
-    CustomElements.ready = true;
+  // install upgrade hook if HTMLImports are available
+  if (window.HTMLImports) {
+    HTMLImports.__importsParsingHook = function(elt) {
+      CustomElements.parser.parse(elt.import);
+    }
+  }
+  // set internal 'ready' flag, now document.registerElement will trigger 
+  // synchronous upgrades
+  CustomElements.ready = true;
+  // async to ensure *native* custom elements upgrade prior to this
+  // DOMContentLoaded can fire before elements upgrade (e.g. when there's
+  // an external script)
+  setTimeout(function() {
     // capture blunt profiling data
     CustomElements.readyTime = Date.now();
     if (window.HTMLImports) {
@@ -12315,23 +12651,18 @@
     document.dispatchEvent(
       new CustomEvent('WebComponentsReady', {bubbles: true})
     );
-
-    // install upgrade hook if HTMLImports are available
-    if (window.HTMLImports) {
-      HTMLImports.__importsParsingHook = function(elt) {
-        CustomElements.parser.parse(elt.import);
-      }
-    }
   });
 }
 
 // CustomEvent shim for IE
 if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType) {
-    var e = document.createEvent('HTMLEvents');
-    e.initEvent(inType, true, true);
+  window.CustomEvent = function(inType, params) {
+    params = params || {};
+    var e = document.createEvent('CustomEvent');
+    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
     return e;
   };
+  window.CustomEvent.prototype = window.Event.prototype;
 }
 
 // When loading at readyState complete time (or via flag), boot custom elements
@@ -13496,7 +13827,7 @@
 
       this.refContent_ = undefined;
       this.iterator_.valueChanged();
-      this.iterator_.updateIteratedValue();
+      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
     },
 
     clear: function() {
@@ -13900,19 +14231,22 @@
       var deps = this.deps = {};
       var template = this.templateElement_;
 
+      var ifValue = true;
       if (directives.if) {
         deps.hasIf = true;
         deps.ifOneTime = directives.if.onlyOneTime;
         deps.ifValue = processBinding(IF, directives.if, template, model);
 
+        ifValue = deps.ifValue;
+
         // oneTime if & predicate is false. nothing else to do.
-        if (deps.ifOneTime && !deps.ifValue) {
-          this.updateIteratedValue();
+        if (deps.ifOneTime && !ifValue) {
+          this.valueChanged();
           return;
         }
 
         if (!deps.ifOneTime)
-          deps.ifValue.open(this.updateIteratedValue, this);
+          ifValue = ifValue.open(this.updateIfValue, this);
       }
 
       if (directives.repeat) {
@@ -13925,13 +14259,40 @@
         deps.value = processBinding(BIND, directives.bind, template, model);
       }
 
+      var value = deps.value;
       if (!deps.oneTime)
-        deps.value.open(this.updateIteratedValue, this);
+        value = value.open(this.updateIteratedValue, this);
 
-      this.updateIteratedValue();
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(value);
     },
 
-    updateIteratedValue: function() {
+    /**
+     * Gets the updated value of the bind/repeat. This can potentially call
+     * user code (if a bindingDelegate is set up) so we try to avoid it if we
+     * already have the value in hand (from Observer.open).
+     */
+    getUpdatedValue: function() {
+      var value = this.deps.value;
+      if (!this.deps.oneTime)
+        value = value.discardChanges();
+      return value;
+    },
+
+    updateIfValue: function(ifValue) {
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(this.getUpdatedValue());
+    },
+
+    updateIteratedValue: function(value) {
       if (this.deps.hasIf) {
         var ifValue = this.deps.ifValue;
         if (!this.deps.ifOneTime)
@@ -13942,9 +14303,10 @@
         }
       }
 
-      var value = this.deps.value;
-      if (!this.deps.oneTime)
-        value = value.discardChanges();
+      this.updateValue(value);
+    },
+
+    updateValue: function(value) {
       if (!this.deps.repeat)
         value = [value];
       var observe = this.deps.repeat &&
@@ -14234,4 +14596,4 @@
 })(window.Platform);
 
 
-//# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
+//# sourceMappingURL=platform.concat.js.map
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index 3c24cdf..ada5521 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -68,6 +68,7 @@
     "src/url.js",
     "../MutationObservers/MutationObserver.js",
     "../HTMLImports/src/scope.js",
+    "../HTMLImports/src/base.js",
     "../HTMLImports/src/Loader.js",
     "../HTMLImports/src/Parser.js",
     "../HTMLImports/src/HTMLImports.js",
@@ -86,64 +87,64 @@
     "src/patches-mdv.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrrDA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACn4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACv4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sD;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
-    "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
+    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
-    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n",
-    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n",
+    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n",
-    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    this.impl = new OriginalFormData(formElement && unwrap(formElement));\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*['|\"]([^'\"]*)['|\"][^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
     "} else {",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n",
     "}",
-    "/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n",
+    "/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n",
@@ -153,22 +154,23 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  var b64 = 'data:text/javascript';\n  // base64 may be smaller, but does not handle unicode characters\n  // attempt base64 first, fall back to escaped text\n  try {\n    b64 += (';base64,' + btoa(scriptContent));\n  } catch(e) {\n    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));\n  }\n  return b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\nscope.whenReady = whenImportsReady;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n",
-    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
-    " /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);",
-    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\n\nisIE = /Trident/.test(navigator.userAgent);\n\n// TODO(sorvell): SD polyfill intrusion\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar mainDoc = wrap(document);\n    \n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    var script = HTMLImports.currentScript || document.currentScript ||\n        // NOTE: only works when called in synchronously executing code.\n        // readyState should check if `loading` but IE10 is \n        // interactive when scripts run so we cheat.\n        (document.readyState !== 'complete' ? \n        document.scripts[document.scripts.length - 1] : null);\n    return wrap(script);\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\n// NOTE: test for native imports loading is based on explicitly watching\n// all imports (see below).\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded : link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nwhenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  mainDoc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.useNative = useNative;\nscope.isImportLoaded = isImportLoaded;\nscope.whenReady = whenImportsReady;\nscope.isIE = isIE;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n",
-    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"
   ]
 }
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index 1757531..1756091 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -7,11 +7,11 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.3.4-02a0f66
+// @version: 0.3.5-fe549bc
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}K(a,e,M(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
-}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,g)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof R),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=J(c):(d=c,c=L(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),U.call(this.impl,J(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:this.impl;j?U.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Y(this.impl,f);return O||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=J(d):(e=d,d=L(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),W.call(this.impl,J(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&W.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList
-}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!O.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(G(b)),h=a||new WeakMap,i=N.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var D=document.adoptNode,E=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);F.call(z(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(m.call(h(this)))},get document(){return j(h(this).document)}}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=new e(a&&d(a))}var c=a.registerWrapper,d=a.unwrap,e=window.FormData;c(e,b,new e),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*['|"]([^'"]*)['|"][^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['|"]([^'"]*)['|"][^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;
-break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=null)},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:c;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a),c="data:text/javascript";try{c+=";base64,"+btoa(b)}catch(e){c+=";charset=utf-8,"+encodeURIComponent(b)}return c}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&!a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(q)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v,a.whenReady=e,a.whenImportsReady=e}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");
-if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue())},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,this)}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
+window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r,o.push(this)}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented
+}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())
+},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){}},this),c},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):this.addElementToDocument(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.call(this,a)
+}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}}),a.mixin=b}(window.Platform),function(a){"use strict";function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){e(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a,b){function c(){g==h&&a&&a()}function d(){g++,c()}var e=b.querySelectorAll("link[rel=import]"),g=0,h=e.length;if(h)for(var i,j=0;h>j&&(i=e[j]);j++)f(i)?d.call(i):(i.addEventListener("load",d),i.addEventListener("error",d));else c()}function f(a){return l?a.__loaded:a.__importParsed}function g(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)h(b)&&i(b)}function h(a){return"link"===a.localName&&"import"===a.rel}function i(a){var b=a.import;b?j({target:a}):(a.addEventListener("load",j),a.addEventListener("error",j))}function j(a){a.target.__loaded=!0}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&g(b.addedNodes)}).observe(document.head,{childList:!0}),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=f,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;
+for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(window.Platform),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(window.Platform),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index b4dd299..7a91bf0 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.polymerWrapper_ ||\n        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.impl;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.polymerWrapper_ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.impl[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        this.impl = type;\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    this.impl = impl;\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return this.impl[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(this.impl[name].apply(this.impl, arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : this.impl;\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(this.impl, childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalName(el, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        this.impl.innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return this.impl[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        this.impl[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return this.impl[name].apply(this.impl, arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = this.impl.getContext.apply(this.impl, arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = this.impl.polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    this.impl.polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(doc.impl, unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        this.impl = node;\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    this.impl = new OriginalFormData(formElement && unwrap(formElement));\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*['|\"]([^'\"]*)['|\"][^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['|\"]([^'\"]*)['|\"][^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  var b64 = 'data:text/javascript';\n  // base64 may be smaller, but does not handle unicode characters\n  // attempt base64 first, fall back to escaped text\n  try {\n    b64 += (';base64,' + btoa(scriptContent));\n  } catch(e) {\n    b64 += (';charset=utf-8,' + encodeURIComponent(scriptContent));\n  }\n  return b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\nscope.whenReady = whenImportsReady;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, dictionary) {\n     var e = document.createEvent('HTMLEvents');\n     e.initEvent(inType,\n        dictionary.bubbles === false ? false : true,\n        dictionary.cancelable === false ? false : true,\n        dictionary.detail);\n     return e;\n  };\n}\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Implements `document.register`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n\n    // install upgrade hook if HTMLImports are available\n    if (window.HTMLImports) {\n      HTMLImports.__importsParsingHook = function(elt) {\n        CustomElements.parser.parse(elt.import);\n      }\n    }\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue();\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/base.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback(observer) {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction mixin(inObj/*, inProps, inMoreProps, ...*/) {\n  var obj = inObj || {};\n  for (var i = 1; i < arguments.length; i++) {\n    var p = arguments[i];\n    try {\n      for (var n in p) {\n        copyProperty(n, p, obj);\n      }\n    } catch(x) {\n    }\n  }\n  return obj;\n}\n\n// copy property inName from inSource object to inTarget object\nfunction copyProperty(inName, inSource, inTarget) {\n  var pd = getPropertyDescriptor(inSource, inName);\n  Object.defineProperty(inTarget, inName, pd);\n}\n\n// get property descriptor for inName on inObject, even if\n// inName exists on some link in inObject's prototype chain\nfunction getPropertyDescriptor(inObject, inName) {\n  if (inObject) {\n    var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n  }\n}\n\n// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\n\nisIE = /Trident/.test(navigator.userAgent);\n\n// TODO(sorvell): SD polyfill intrusion\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\nvar wrap = function(node) {\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\n};\nvar mainDoc = wrap(document);\n    \n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    var script = HTMLImports.currentScript || document.currentScript ||\n        // NOTE: only works when called in synchronously executing code.\n        // readyState should check if `loading` but IE10 is \n        // interactive when scripts run so we cheat.\n        (document.readyState !== 'complete' ? \n        document.scripts[document.scripts.length - 1] : null);\n    return wrap(script);\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\n// NOTE: test for native imports loading is based on explicitly watching\n// all imports (see below).\nfunction isImportLoaded(link) {\n  return useNative ? link.__loaded : link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nwhenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  mainDoc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\n// exports\nscope.useNative = useNative;\nscope.isImportLoaded = isImportLoaded;\nscope.whenReady = whenImportsReady;\nscope.isIE = isIE;\n\n// deprecated\nscope.whenImportsReady = whenImportsReady;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index cf4a1ee..0161a93 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.5.0
+version: 0.6.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index afb8a0e..5362b60 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -4,7 +4,7 @@
 homepage: http://www.dartlang.org
 description: A parser for YAML.
 dependencies:
-  collection: ">=0.9.2 <0.10.0"
+  collection: ">=0.9.2 <2.0.0"
   path: ">=1.2.0 <2.0.0"
   string_scanner: ">=0.1.0 <0.2.0"
   source_span: ">=1.0.0 <2.0.0"
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index f4598a5..80e4558 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -24,7 +24,7 @@
 extern bool trace_debug_protocol;
 
 intptr_t DebuggerConnectionHandler::listener_fd_ = -1;
-dart::Monitor* DebuggerConnectionHandler::handler_lock_ = new dart::Monitor();
+Monitor* DebuggerConnectionHandler::handler_lock_ = new Monitor();
 
 // TODO(asiva): Remove this once we have support for multiple debugger
 // connections. For now we just store the single debugger connection
@@ -346,8 +346,8 @@
     return;
   }
   while (!IsConnected()) {
-    dart::Monitor::WaitResult res = ml.Wait();
-    ASSERT(res == dart::Monitor::kNotified);
+    Monitor::WaitResult res = ml.Wait();
+    ASSERT(res == Monitor::kNotified);
   }
 }
 
@@ -395,7 +395,7 @@
     intptr_t remaining = msg->length();
     intptr_t sent = 0;
     const intptr_t max_piece_len = 122;  // Pretty arbitrary, not a power of 2.
-    dart::Monitor sleep;
+    Monitor sleep;
     while (remaining > 0) {
       intptr_t piece_len = remaining;
       if (piece_len > max_piece_len) {
diff --git a/runtime/bin/dbg_connection.h b/runtime/bin/dbg_connection.h
index 08f3cf0..d7941f0 100644
--- a/runtime/bin/dbg_connection.h
+++ b/runtime/bin/dbg_connection.h
@@ -103,7 +103,7 @@
   // mutex/condition variable used by isolates when writing back to the
   // debugger. This is also used to ensure that the isolate waits for
   // a debugger to be attached when that is requested on the command line.
-  static dart::Monitor* handler_lock_;
+  static Monitor* handler_lock_;
 
   static bool IsListening() {
     return listener_fd_ != -1;
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index f57c297..77c7a20 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -107,7 +107,7 @@
 void DebuggerConnectionImpl::StartHandler(int port_number) {
   ASSERT(DebuggerConnectionHandler::listener_fd_ != -1);
   SetupPollQueue();
-  int result = dart::Thread::Start(&DebuggerConnectionImpl::Handler, 0);
+  int result = Thread::Start(&DebuggerConnectionImpl::Handler, 0);
   if (result != 0) {
     FATAL1("Failed to start debugger connection handler thread: %d\n", result);
   }
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index d37c752..a55557d 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -106,7 +106,7 @@
 void DebuggerConnectionImpl::StartHandler(int port_number) {
   ASSERT(DebuggerConnectionHandler::listener_fd_ != -1);
   SetupPollQueue();
-  int result = dart::Thread::Start(&DebuggerConnectionImpl::Handler, 0);
+  int result = Thread::Start(&DebuggerConnectionImpl::Handler, 0);
   if (result != 0) {
     FATAL1("Failed to start debugger connection handler thread: %d\n", result);
   }
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index 4065d0b..4da21cd 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -169,7 +169,7 @@
 void DebuggerConnectionImpl::StartHandler(int port_number) {
   ASSERT(DebuggerConnectionHandler::listener_fd_ != -1);
   SetupPollQueue();
-  int result = dart::Thread::Start(&DebuggerConnectionImpl::Handler, 0);
+  int result = Thread::Start(&DebuggerConnectionImpl::Handler, 0);
   if (result != 0) {
     FATAL1("Failed to start debugger connection handler thread: %d\n", result);
   }
diff --git a/runtime/bin/dbg_connection_win.cc b/runtime/bin/dbg_connection_win.cc
index 15c63a3..fee02e6c 100644
--- a/runtime/bin/dbg_connection_win.cc
+++ b/runtime/bin/dbg_connection_win.cc
@@ -28,7 +28,7 @@
 
 void DebuggerConnectionImpl::StartHandler(int port_number) {
   ASSERT(DebuggerConnectionHandler::listener_fd_ != -1);
-  int result = dart::Thread::Start(&DebuggerConnectionImpl::ThreadEntry, 0);
+  int result = Thread::Start(&DebuggerConnectionImpl::ThreadEntry, 0);
   if (result != 0) {
     FATAL1("Failed to start debugger connection handler thread: %d\n", result);
   }
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index 0d259ee..8d22bb4 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -1106,8 +1106,8 @@
     }
 
     // Wait for more debug or vm service messages.
-    dart::Monitor::WaitResult res = ml.Wait();
-    ASSERT(res == dart::Monitor::kNotified);
+    Monitor::WaitResult res = ml.Wait();
+    ASSERT(res == Monitor::kNotified);
   }
   Dart_SetMessageNotifyCallback(NULL);
   is_interrupted_ = false;
@@ -1207,7 +1207,7 @@
 
 
 DbgMsgQueue* DbgMsgQueueList::list_ = NULL;
-dart::Mutex* DbgMsgQueueList::msg_queue_list_lock_ = new dart::Mutex();
+Mutex* DbgMsgQueueList::msg_queue_list_lock_ = new Mutex();
 
 
 void DbgMsgQueueList::Initialize() {
diff --git a/runtime/bin/dbg_message.h b/runtime/bin/dbg_message.h
index 262093f..bce9106 100644
--- a/runtime/bin/dbg_message.h
+++ b/runtime/bin/dbg_message.h
@@ -207,7 +207,7 @@
 
   // The isolate waits on this condition variable when it needs to process
   // debug messages.
-  dart::Monitor msg_queue_lock_;
+  Monitor msg_queue_lock_;
 
   DISALLOW_COPY_AND_ASSIGN(DbgMsgQueue);
 };
@@ -270,7 +270,7 @@
   static DbgMsgQueue* GetIsolateMsgQueueLocked(Dart_IsolateId isolate_id);
 
   static DbgMsgQueue* list_;
-  static dart::Mutex* msg_queue_list_lock_;
+  static Mutex* msg_queue_list_lock_;
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(DbgMsgQueueList);
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 5d3e6ef..b1a4b66 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -322,7 +322,7 @@
 
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = dart::Thread::Start(&EventHandlerImplementation::Poll,
+  int result = Thread::Start(&EventHandlerImplementation::Poll,
                                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 4310324..0701810 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -334,7 +334,7 @@
 
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = dart::Thread::Start(&EventHandlerImplementation::Poll,
+  int result = Thread::Start(&EventHandlerImplementation::Poll,
                                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index fafc6bc..ede500f 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -395,7 +395,7 @@
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
   int result =
-      dart::Thread::Start(&EventHandlerImplementation::EventHandlerEntry,
+      Thread::Start(&EventHandlerImplementation::EventHandlerEntry,
                           reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 9299920..803da35 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -292,7 +292,7 @@
   } else {
     // Completing asynchronously through thread.
     pending_read_ = buffer;
-    int result = dart::Thread::Start(ReadFileThread,
+    int result = Thread::Start(ReadFileThread,
                                      reinterpret_cast<uword>(this));
     if (result != 0) {
       FATAL1("Failed to start read file thread %d", result);
@@ -747,7 +747,7 @@
   }
   if (!write_thread_exists_) {
     write_thread_exists_ = true;
-    int result = dart::Thread::Start(WriteFileThread,
+    int result = Thread::Start(WriteFileThread,
                                      reinterpret_cast<uword>(this));
     if (result != 0) {
       FATAL1("Failed to start write file thread %d", result);
@@ -1351,7 +1351,7 @@
 
 
 void EventHandlerImplementation::Start(EventHandler* handler) {
-  int result = dart::Thread::Start(EventHandlerEntry,
+  int result = Thread::Start(EventHandlerEntry,
                                    reinterpret_cast<uword>(handler));
   if (result != 0) {
     FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index 0dd3bb6..8a45b10 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -335,7 +335,7 @@
   DWORD thread_wrote_;
   bool write_thread_exists_;
   bool write_thread_running_;
-  dart::Monitor* write_monitor_;
+  Monitor* write_monitor_;
 };
 
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 1a3f264..637e1c0 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -15,6 +15,7 @@
 #include "bin/dartutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
+#include "bin/thread.h"
 
 #include "platform/globals.h"
 
@@ -495,6 +496,7 @@
     return 255;
   }
 
+  Thread::InitOnce();
   DartUtils::SetOriginalWorkingDirectory();
 
   Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
diff --git a/runtime/bin/lockers.h b/runtime/bin/lockers.h
index a424934..87e44e8 100644
--- a/runtime/bin/lockers.h
+++ b/runtime/bin/lockers.h
@@ -14,7 +14,7 @@
 
 class MutexLocker  {
  public:
-  explicit MutexLocker(dart::Mutex* mutex) : mutex_(mutex) {
+  explicit MutexLocker(Mutex* mutex) : mutex_(mutex) {
     ASSERT(mutex != NULL);
     mutex_->Lock();
   }
@@ -24,7 +24,7 @@
   }
 
  private:
-  dart::Mutex* const mutex_;
+  Mutex* const mutex_;
 
   DISALLOW_COPY_AND_ASSIGN(MutexLocker);
 };
@@ -32,7 +32,7 @@
 
 class MonitorLocker {
  public:
-  explicit MonitorLocker(dart::Monitor* monitor) : monitor_(monitor) {
+  explicit MonitorLocker(Monitor* monitor) : monitor_(monitor) {
     ASSERT(monitor != NULL);
     monitor_->Enter();
   }
@@ -41,7 +41,7 @@
     monitor_->Exit();
   }
 
-  dart::Monitor::WaitResult Wait(int64_t millis = dart::Monitor::kNoTimeout) {
+  Monitor::WaitResult Wait(int64_t millis = Monitor::kNoTimeout) {
     return monitor_->Wait(millis);
   }
 
@@ -54,7 +54,7 @@
   }
 
  private:
-  dart::Monitor* const monitor_;
+  Monitor* const monitor_;
 
   DISALLOW_COPY_AND_ASSIGN(MonitorLocker);
 };
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index f12ca2a..b9bc365 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -20,6 +20,7 @@
 #include "bin/log.h"
 #include "bin/platform.h"
 #include "bin/process.h"
+#include "bin/thread.h"
 #include "bin/vmservice_impl.h"
 #include "platform/globals.h"
 #include "platform/hashmap.h"
@@ -986,6 +987,8 @@
     }
   }
 
+  Thread::InitOnce();
+
   if (!DartUtils::SetOriginalWorkingDirectory()) {
     OSError err;
     fprintf(stderr, "Error determining current directory: %s\n", err.message());
@@ -1122,29 +1125,17 @@
 
       // Call _startIsolate in the isolate library to enable dispatching the
       // initial startup message.
-      Dart_Handle isolate_args[2];
-      isolate_args[0] = main_closure;
-      isolate_args[1] = Dart_True();
+      const intptr_t kNumIsolateArgs = 2;
+      Dart_Handle isolate_args[kNumIsolateArgs];
+      isolate_args[0] = main_closure;                         // entryPoint
+      isolate_args[1] = CreateRuntimeOptions(&dart_options);  // args
 
       Dart_Handle isolate_lib = Dart_LookupLibrary(
           Dart_NewStringFromCString("dart:isolate"));
       result = Dart_Invoke(isolate_lib,
-                           Dart_NewStringFromCString("_startIsolate"),
-                           2, isolate_args);
-
-      // Setup the arguments in the initial startup message and leave the
-      // replyTo and message fields empty.
-      Dart_Handle initial_startup_msg = Dart_NewList(3);
-      result = Dart_ListSetAt(initial_startup_msg, 1,
-                              CreateRuntimeOptions(&dart_options));
+                           Dart_NewStringFromCString("_startMainIsolate"),
+                           kNumIsolateArgs, isolate_args);
       DartExitOnError(result);
-      Dart_Port main_port = Dart_GetMainPortId();
-      bool posted = Dart_Post(main_port, initial_startup_msg);
-      if (!posted) {
-        ErrorExit(kErrorExitCode,
-                  "Failed posting startup message to main "
-                  "isolate control port.");
-      }
 
       // Keep handling messages until the last active receive port is closed.
       result = Dart_RunLoop();
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index a17ec16..fecb5aa 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -17,7 +17,7 @@
 static const int kProcessIdNativeField = 0;
 
 int Process::global_exit_code_ = 0;
-dart::Mutex* Process::global_exit_code_mutex_ = new dart::Mutex();
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
 
 // Extract an array of C strings from a list of Dart strings.
 static char** ExtractCStringList(Dart_Handle strings,
diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index dbd95a8..b2fb60f 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -130,7 +130,7 @@
 
  private:
   static int global_exit_code_;
-  static dart::Mutex* global_exit_code_mutex_;
+  static Mutex* global_exit_code_mutex_;
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(Process);
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 76cf060..32e4982 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -105,12 +105,12 @@
   static ProcessInfo* active_processes_;
   // Mutex protecting all accesses to the linked list of active
   // processes.
-  static dart::Mutex* mutex_;
+  static Mutex* mutex_;
 };
 
 
 ProcessInfo* ProcessInfoList::active_processes_ = NULL;
-dart::Mutex* ProcessInfoList::mutex_ = new dart::Mutex();
+Mutex* ProcessInfoList::mutex_ = new Mutex();
 
 
 // The exit code handler sets up a separate thread which waits for child
@@ -133,7 +133,7 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = dart::Thread::Start(ExitCodeHandlerEntry, 0);
+    int result = Thread::Start(ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -160,7 +160,7 @@
     monitor_->Notify();
 
     while (!terminate_done_) {
-      monitor_->Wait(dart::Monitor::kNoTimeout);
+      monitor_->Wait(Monitor::kNoTimeout);
     }
   }
 
@@ -174,7 +174,7 @@
       {
         MonitorLocker locker(monitor_);
         while (running_ && process_count_ == 0) {
-          monitor_->Wait(dart::Monitor::kNoTimeout);
+          monitor_->Wait(Monitor::kNoTimeout);
         }
         if (!running_) {
           terminate_done_ = true;
@@ -220,14 +220,14 @@
   static bool terminate_done_;
   static int process_count_;
   static bool running_;
-  static dart::Monitor* monitor_;
+  static Monitor* monitor_;
 };
 
 
 bool ExitCodeHandler::running_ = false;
 int ExitCodeHandler::process_count_ = 0;
 bool ExitCodeHandler::terminate_done_ = false;
-dart::Monitor* ExitCodeHandler::monitor_ = new dart::Monitor();
+Monitor* ExitCodeHandler::monitor_ = new Monitor();
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index dfb5604..e7bcd80 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -104,12 +104,12 @@
   static ProcessInfo* active_processes_;
   // Mutex protecting all accesses to the linked list of active
   // processes.
-  static dart::Mutex* mutex_;
+  static Mutex* mutex_;
 };
 
 
 ProcessInfo* ProcessInfoList::active_processes_ = NULL;
-dart::Mutex* ProcessInfoList::mutex_ = new dart::Mutex();
+Mutex* ProcessInfoList::mutex_ = new Mutex();
 
 
 // The exit code handler sets up a separate thread which waits for child
@@ -132,7 +132,7 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = dart::Thread::Start(ExitCodeHandlerEntry, 0);
+    int result = Thread::Start(ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -159,7 +159,7 @@
     monitor_->Notify();
 
     while (!terminate_done_) {
-      monitor_->Wait(dart::Monitor::kNoTimeout);
+      monitor_->Wait(Monitor::kNoTimeout);
     }
   }
 
@@ -173,7 +173,7 @@
       {
         MonitorLocker locker(monitor_);
         while (running_ && process_count_ == 0) {
-          monitor_->Wait(dart::Monitor::kNoTimeout);
+          monitor_->Wait(Monitor::kNoTimeout);
         }
         if (!running_) {
           terminate_done_ = true;
@@ -219,14 +219,14 @@
   static bool terminate_done_;
   static int process_count_;
   static bool running_;
-  static dart::Monitor* monitor_;
+  static Monitor* monitor_;
 };
 
 
 bool ExitCodeHandler::running_ = false;
 int ExitCodeHandler::process_count_ = 0;
 bool ExitCodeHandler::terminate_done_ = false;
-dart::Monitor* ExitCodeHandler::monitor_ = new dart::Monitor();
+Monitor* ExitCodeHandler::monitor_ = new Monitor();
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 44236a9..9734522 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -105,12 +105,12 @@
   static ProcessInfo* active_processes_;
   // Mutex protecting all accesses to the linked list of active
   // processes.
-  static dart::Mutex* mutex_;
+  static Mutex* mutex_;
 };
 
 
 ProcessInfo* ProcessInfoList::active_processes_ = NULL;
-dart::Mutex* ProcessInfoList::mutex_ = new dart::Mutex();
+Mutex* ProcessInfoList::mutex_ = new Mutex();
 
 
 // The exit code handler sets up a separate thread which waits for child
@@ -133,7 +133,7 @@
     }
 
     // Start thread that handles process exits when wait returns.
-    int result = dart::Thread::Start(ExitCodeHandlerEntry, 0);
+    int result = Thread::Start(ExitCodeHandlerEntry, 0);
     if (result != 0) {
       FATAL1("Failed to start exit code handler worker thread %d", result);
     }
@@ -160,7 +160,7 @@
     monitor_->Notify();
 
     while (!terminate_done_) {
-      monitor_->Wait(dart::Monitor::kNoTimeout);
+      monitor_->Wait(Monitor::kNoTimeout);
     }
   }
 
@@ -174,7 +174,7 @@
       {
         MonitorLocker locker(monitor_);
         while (running_ && process_count_ == 0) {
-          monitor_->Wait(dart::Monitor::kNoTimeout);
+          monitor_->Wait(Monitor::kNoTimeout);
         }
         if (!running_) {
           terminate_done_ = true;
@@ -220,14 +220,14 @@
   static bool terminate_done_;
   static int process_count_;
   static bool running_;
-  static dart::Monitor* monitor_;
+  static Monitor* monitor_;
 };
 
 
 bool ExitCodeHandler::running_ = false;
 int ExitCodeHandler::process_count_ = 0;
 bool ExitCodeHandler::terminate_done_ = false;
-dart::Monitor* ExitCodeHandler::monitor_ = new dart::Monitor();
+Monitor* ExitCodeHandler::monitor_ = new Monitor();
 
 
 static void SetChildOsErrorMessage(char** os_error_message) {
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 570eee1..860eee0 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -189,12 +189,12 @@
   static ProcessInfo* active_processes_;
   // Mutex protecting all accesses to the linked list of active
   // processes.
-  static dart::Mutex* mutex_;
+  static Mutex* mutex_;
 };
 
 
 ProcessInfo* ProcessInfoList::active_processes_ = NULL;
-dart::Mutex* ProcessInfoList::mutex_ = new dart::Mutex();
+Mutex* ProcessInfoList::mutex_ = new Mutex();
 
 
 // Types of pipes to create.
@@ -332,7 +332,7 @@
 
 static bool EnsureInitialized() {
   static bool load_attempted = false;
-  static dart::Mutex* mutex = new dart::Mutex();
+  static Mutex* mutex = new Mutex();
   HMODULE kernel32_module = GetModuleHandleW(L"kernel32.dll");
   if (!load_attempted) {
     MutexLocker locker(mutex);
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index e20d9d0..74848e2 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -38,7 +38,7 @@
 
 bool SSLFilter::library_initialized_ = false;
 // To protect library initialization.
-dart::Mutex* SSLFilter::mutex_ = new dart::Mutex();
+Mutex* SSLFilter::mutex_ = new Mutex();
 // The password is needed when creating secure server sockets.  It can
 // be null if only secure client sockets are used.
 const char* SSLFilter::password_ = NULL;
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index df1eb7d..ba8eb4f 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -93,7 +93,7 @@
   static const int kMemioBufferSize = 20 * KB;
   static bool library_initialized_;
   static const char* password_;
-  static dart::Mutex* mutex_;  // To protect library initialization.
+  static Mutex* mutex_;  // To protect library initialization.
 
   uint8_t* buffers_[kNumBuffers];
   int buffer_size_;
diff --git a/runtime/bin/thread.h b/runtime/bin/thread.h
index 4d19979..eb99e10 100644
--- a/runtime/bin/thread.h
+++ b/runtime/bin/thread.h
@@ -21,6 +21,7 @@
 #endif
 
 namespace dart {
+namespace bin {
 
 class Thread {
  public:
@@ -46,6 +47,8 @@
   static intptr_t ThreadIdToIntPtr(ThreadId id);
   static bool Compare(ThreadId a, ThreadId b);
   static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
+
+  static void InitOnce();
 };
 
 
@@ -95,6 +98,7 @@
 };
 
 
+}  // namespace bin
 }  // namespace dart
 
 
diff --git a/runtime/bin/thread_android.cc b/runtime/bin/thread_android.cc
index eefdaac..62143ef 100644
--- a/runtime/bin/thread_android.cc
+++ b/runtime/bin/thread_android.cc
@@ -13,6 +13,7 @@
 #include "platform/assert.h"
 
 namespace dart {
+namespace bin {
 
 #define VALIDATE_PTHREAD_RESULT(result) \
   if (result != 0) { \
@@ -176,6 +177,11 @@
 }
 
 
+void Thread::InitOnce() {
+  // Nothing to be done.
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -321,6 +327,7 @@
   VALIDATE_PTHREAD_RESULT(result);
 }
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
diff --git a/runtime/bin/thread_android.h b/runtime/bin/thread_android.h
index 96b10e0..2551c01 100644
--- a/runtime/bin/thread_android.h
+++ b/runtime/bin/thread_android.h
@@ -15,6 +15,7 @@
 #include "platform/globals.h"
 
 namespace dart {
+namespace bin {
 
 typedef pthread_key_t ThreadLocalKey;
 typedef pthread_t ThreadId;
@@ -70,6 +71,7 @@
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
 };
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // BIN_THREAD_ANDROID_H_
diff --git a/runtime/bin/thread_linux.cc b/runtime/bin/thread_linux.cc
index ca1c556..eaa4f2a 100644
--- a/runtime/bin/thread_linux.cc
+++ b/runtime/bin/thread_linux.cc
@@ -14,6 +14,7 @@
 #include "platform/assert.h"
 
 namespace dart {
+namespace bin {
 
 #define VALIDATE_PTHREAD_RESULT(result) \
   if (result != 0) { \
@@ -177,6 +178,11 @@
 }
 
 
+void Thread::InitOnce() {
+  // Nothing to be done.
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -325,6 +331,7 @@
   VALIDATE_PTHREAD_RESULT(result);
 }
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
diff --git a/runtime/bin/thread_linux.h b/runtime/bin/thread_linux.h
index fc2bcc5..9f4093c 100644
--- a/runtime/bin/thread_linux.h
+++ b/runtime/bin/thread_linux.h
@@ -15,6 +15,7 @@
 #include "platform/globals.h"
 
 namespace dart {
+namespace bin {
 
 typedef pthread_key_t ThreadLocalKey;
 typedef pthread_t ThreadId;
@@ -70,6 +71,7 @@
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
 };
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // BIN_THREAD_LINUX_H_
diff --git a/runtime/bin/thread_macos.cc b/runtime/bin/thread_macos.cc
index a698fbb..52ac76c 100644
--- a/runtime/bin/thread_macos.cc
+++ b/runtime/bin/thread_macos.cc
@@ -21,6 +21,7 @@
 #include "platform/assert.h"
 
 namespace dart {
+namespace bin {
 
 #define VALIDATE_PTHREAD_RESULT(result)         \
   if (result != 0) { \
@@ -182,6 +183,11 @@
 }
 
 
+void Thread::InitOnce() {
+  // Nothing to be done.
+}
+
+
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
@@ -330,6 +336,7 @@
   VALIDATE_PTHREAD_RESULT(result);
 }
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
diff --git a/runtime/bin/thread_macos.h b/runtime/bin/thread_macos.h
index 5bbacab..a074896 100644
--- a/runtime/bin/thread_macos.h
+++ b/runtime/bin/thread_macos.h
@@ -15,6 +15,7 @@
 #include "platform/globals.h"
 
 namespace dart {
+namespace bin {
 
 typedef pthread_key_t ThreadLocalKey;
 typedef pthread_t ThreadId;
@@ -70,6 +71,7 @@
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
 };
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // BIN_THREAD_MACOS_H_
diff --git a/runtime/bin/thread_win.cc b/runtime/bin/thread_win.cc
index f1486c1..a69f82c 100644
--- a/runtime/bin/thread_win.cc
+++ b/runtime/bin/thread_win.cc
@@ -12,6 +12,7 @@
 #include "platform/assert.h"
 
 namespace dart {
+namespace bin {
 
 class ThreadStartData {
  public:
@@ -164,6 +165,12 @@
 }
 
 
+void Thread::InitOnce() {
+  MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
+  MonitorData::GetMonitorWaitDataForThread();
+}
+
+
 Mutex::Mutex() {
   // Allocate unnamed semaphore with initial count 1 and max count 1.
   data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL);
@@ -434,6 +441,7 @@
   data_.SignalAndRemoveAllWaiters();
 }
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
diff --git a/runtime/bin/thread_win.h b/runtime/bin/thread_win.h
index 9ee0fc4..e500b16 100644
--- a/runtime/bin/thread_win.h
+++ b/runtime/bin/thread_win.h
@@ -13,6 +13,7 @@
 #include "platform/globals.h"
 
 namespace dart {
+namespace bin {
 
 typedef DWORD ThreadLocalKey;
 typedef DWORD ThreadId;
@@ -73,7 +74,7 @@
 
   friend class Monitor;
   friend class MonitorData;
-  friend class OS;
+  friend class Thread;
 
 
   DISALLOW_COPY_AND_ASSIGN(MonitorWaitData);
@@ -109,13 +110,14 @@
   MonitorWaitData* waiters_tail_;
 
   friend class Monitor;
-  friend class OS;
+  friend class Thread;
   friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
 };
 
+}  // namespace bin
 }  // namespace dart
 
 #endif  // BIN_THREAD_WIN_H_
diff --git a/runtime/bin/vmservice/observatory/HACKING.txt b/runtime/bin/vmservice/observatory/HACKING.txt
index a279e2e..eb6e9cd 100644
--- a/runtime/bin/vmservice/observatory/HACKING.txt
+++ b/runtime/bin/vmservice/observatory/HACKING.txt
@@ -8,7 +8,7 @@
 you are also making changes to the backend). While you're working on your
 feature follow the steps:
 
-1. Open runtime/bin/vmservice/client in the Dart Editor
+1. Open runtime/bin/vmservice/observatory in the Dart Editor
 2. Run pub upgrade
 3. Run dart --observe script.dart
 4. Run index.html in Dartium
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html b/runtime/bin/vmservice/observatory/deployed/web/index.html
index 6d50ef8..2f72a5e 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html
@@ -648,6 +648,9 @@
 <polymer-element name="service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="any-service-ref" extends="observatory-element">
+</polymer-element>
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
@@ -917,30 +920,31 @@
       }
     </style>
     <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
+      <template if="{{ isError(ref) }}">
+         <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isUnexpected(ref.serviceType) }}">
+      <template if="{{ isUnexpected(ref) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNull(ref.serviceType) }}">
+      <template if="{{ isPsuedoNull(ref) }}">
         <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
+      <template if="{{ (isString(ref) ||
+                        isBool(ref) ||
+                        isNull(ref) ||
+                        isInt(ref)) ||
+                        isDouble(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ (isType(ref.serviceType)) }}">
+      <template if="{{ (isType(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+      <template if="{{ isInstance(ref) &amp;&amp;
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
@@ -948,7 +952,7 @@
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+      <template if="{{ isInstance(ref) &amp;&amp;
                        ref['closureFunc'] == null}}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
@@ -967,7 +971,7 @@
         </curly-block>
       </template>
 
-      <template if="{{ isList(ref.serviceType) }}">
+      <template if="{{ isList(ref) }}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -986,6 +990,7 @@
   </template>
 </polymer-element>
 
+
 <polymer-element name="action-link">
   <template>
     <style>
@@ -2157,7 +2162,7 @@
 .break-wrap {
   word-wrap: break-word;
 }
-</style><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</style><span><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 
@@ -2921,19 +2926,19 @@
   word-wrap: break-word;
 }
 </style>
-    <div>
+    <span>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
       <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp;
+      <template if="{{ (ref['declaredType'].name == 'dynamic' &amp;&amp;
                         !ref['final'] &amp;&amp; !ref['const']) }}">
         var
       </template>
-      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-    </div>
+    </span>
   </template>
 </polymer-element>
 
@@ -4188,19 +4193,19 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls.superClass != null }}">
+        <template if="{{ cls.superclass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls.superclass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls.subClasses.length > 0 }}">
+        <template if="{{ cls.subclasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls.subClasses }}">
+              <template repeat="{{ subclass in cls.subclasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
@@ -5577,7 +5582,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -5587,14 +5592,14 @@
         <template if="{{ field['static'] }}">static</template>
         <template if="{{ field['final'] }}">final</template>
         <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp;
+        <template if="{{ (field['declaredType'].name == 'dynamic' &amp;&amp;
                          !field['final'] &amp;&amp; !field['const']) }}">
           var
         </template>
-        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
-          {{ field['declared_type']['user_name'] }}
+        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
+          {{ field['declaredType'].name }}
         </template>
-        {{ field['user_name'] }}
+        {{ field.name }}
       </h1>
       <div class="memberList">
         <div class="memberItem">
@@ -5618,19 +5623,19 @@
           <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guard_class'] == 'dynamic' }}">
+              <template if="{{ field['guardClass'] == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guard_class'] == 'unknown' }}">
+              <template if="{{ field['guardClass'] == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guard_class'] != 'unknown' &amp;&amp;
-                            field['guard_class'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-                <template if="{{ field['guard_nullable'] }}">
+              <template if="{{ field['guardClass'] != 'unknown' &amp;&amp;
+                            field['guardClass'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
+                <template if="{{ field['guardNullable'] }}">
                   — null observed
                 </template>
-                <template if="{{ !field['guard_nullable'] }}">
+                <template if="{{ !field['guardNullable'] }}">
                   — null not observed
                 </template>
               </template>
@@ -5662,6 +5667,7 @@
 
 
 
+
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
@@ -13969,6 +13975,290 @@
 
 
 
+
+
+
+
+
+
+<polymer-element name="inbound-reference" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  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-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.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;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <div>
+      from <any-service-ref ref="{{ source }}"></any-service-ref>
+      <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
+      <template if="{{ slotIsField }}">via <field-ref ref="{{ slot }}"></field-ref></template>
+
+      <curly-block callback="{{ expander() }}">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">
+              <template repeat="{{ reference in inboundReferences] }}">
+                <inbound-reference ref="{{ reference }}"></inbound-reference>
+              </template>
+            </div>
+          </div>
+        </div>
+      </curly-block>
+    </div>
+  </template>
+</polymer-element>
+
+
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <style>
@@ -14291,12 +14581,12 @@
                 <div class="memberItem">
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
-                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <any-service-ref ref="{{ element['value'] }}"></any-service-ref>
                     <template if="{{ element['parentField'] != null }}">
-                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref> of
                     </template>
                     <template if="{{ element['parentListIndex'] != null }}">
-                      at list index {{ element['parentListIndex'] }} of
+                      in [{{ element['parentListIndex'] }}] of
                     </template>
                   </div>
                   </div>
@@ -14309,6 +14599,20 @@
               </template>
             </div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">inbound references</div>
+            <div class="memberValue">
+              <template if="{{ inboundReferences == null }}">
+                <eval-link callback="{{ fetchInboundReferences }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ inboundReferences != null }}">
+                <template repeat="{{ reference in inboundReferences['references'] }}">
+                  <inbound-reference ref="{{ reference }}"></inbound-reference>
+                </template>
+              </template>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html._data b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
index 6b743d9..325a2ed 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
index 9f157ff..1d10041 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
@@ -119,11 +119,11 @@
 if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
 g[0].$reflectionName=b2
 g[0].$metadataIndex=a8+1
-if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.wh("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.wh("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
-return e?function(f){if(h===null)h=H.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(this,b,c,false,[],d)
+if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+return e?function(f){if(h===null)h=H.qmC(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qmC(this,b,c,false,[],d)
 return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
-return d?function(){if(h===void 0)h=H.wh(this,b,c,true,[],e).prototype
+return d?function(){if(h===void 0)h=H.qmC(this,b,c,true,[],e).prototype
 return h}:y(b,c,e,f)}var z=0
 var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
 if(!init.libraries)init.libraries=[]
@@ -150,14 +150,14 @@
 var j=[]
 var i=[]
 processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
+x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
+"^":"a;tT>"}}],["","",,J,{
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0:function(a){var z,y,x,w
+aN: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
@@ -193,31 +193,32 @@
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"$0","gAY",0,0,71],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,72],
+bu:[function(a){return H.a5(a)},"$0","gCR",0,0,73],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,74],
 gbx:function(a){return new H.cu(H.wO(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gAY",0,0,71],
+bu:[function(a){return String(a)},"$0","gCR",0,0,73],
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isa2:true},
 CDU:{
 "^":"Gv;",
 n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gAY",0,0,71],
+bu:[function(a){return"null"},"$0","gCR",0,0,73],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,72]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gkh",2,0,null,74]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.lU}},
+gbx:function(a){return C.Fn}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
-"^":"Ue1;"},
+"^":"Ue1;",
+bu:[function(a){return String(a)},"$0","gCR",0,0,73]},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -230,20 +231,20 @@
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
-oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
 H.IC(a,b,c)},
 Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
-Nk:function(a,b){H.Wt(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+uk:function(a,b){H.Wt(a,b)},
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(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.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -251,19 +252,20 @@
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
 y[x]=w}return y.join(b)},
-eR:function(a,b){return H.c1(a,b,null,null)},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.c1(a,b,c,null)},
+Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
+H.xF(a,b,c)
+return H.c1(a,b,c,H.u3(z,0))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
+oq:function(a,b,c){var z
 if(!!a.fixed$length)H.vh(P.f("removeRange"))
 z=a.length
 if(b<0||b>z)throw H.b(P.TE(b,0,z))
@@ -272,18 +274,18 @@
 this.sB(a,z-(c-b))},
 Vr:function(a,b){return H.CkK(a,b)},
 GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},
+H.ig(a,b)},
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
-Gs:function(a,b){var z
+tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.u3(a,0)])
 else{z=H.VM(a.slice(),[H.u3(a,0)])
@@ -312,12 +314,7 @@
 $asWO:null,
 $isyN:true,
 $isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -331,15 +328,15 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
+gzr:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
 return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-UD:function(a){if(a<0)return-Math.round(-a)
+zQ:function(a){return this.yu(this.RE(a))},
+RE:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:[function(a,b){var z,y
 if(typeof b!=="number")H.vh(P.u(b))
@@ -347,11 +344,11 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,73],
+return y},"$1","gVz",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"$0","gAY",0,0,71],
+else return""+a},"$0","gCR",0,0,73],
 giO:function(a){return a&0x1FFFFFFF},
 J:function(a){return-a},
 g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -372,19 +369,21 @@
 Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
 else{if(typeof b!=="number")H.vh(P.u(b))
 return this.yu(a/b)}},
-cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
+BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
 O:function(a,b){if(b<0)throw H.b(P.u(b))
 return b>31?0:a<<b>>>0},
-KI:function(a,b){return b>31?0:a<<b>>>0},
+iK:function(a,b){return b>31?0:a<<b>>>0},
 m:function(a,b){var z
 if(b<0)throw H.b(P.u(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
-GG:function(a,b){var z
+wG:function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
+PK:function(a,b){if(b<0)throw H.b(P.u(b))
+return b>31?0:a>>>b},
 i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a&b)>>>0},
 w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -399,16 +398,16 @@
 return a>=b},
 gbx:function(a){return C.yT},
 $isFK:true,
-static:{"^":"SAz,N6l"}},
+static:{"^":"SAz,HS"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isVf:true,
 $isFK:true,
 $isKN:true},
-Yn:{
+VA7:{
 "^":"P;",
-gbx:function(a){return C.aN},
+gbx:function(a){return C.Df},
 $isVf:true,
 $isFK:true},
 O:{
@@ -417,7 +416,9 @@
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
 return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
+dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+return H.ZT(a,b,c)},
+dd:function(a,b){return this.dm(a,b,0)},
 wL:function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -439,21 +440,22 @@
 h8:function(a,b,c){return H.ys(a,b,c)},
 Fr:function(a,b){if(b==null)H.vh(P.u(null))
 if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
+else if(!!J.x(b).$isVR)return a.split(b.Yr)
 else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-lV:function(a,b,c){var z
+Ys:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.lV(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+nC:function(a,b){return this.Ys(a,b,0)},
+Nj:function(a,b,c){var z
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
+z=J.Wx(b)
+if(z.C(b,0))throw H.b(P.N(b))
+if(z.D(b,c))throw H.b(P.N(b))
+if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -476,16 +478,16 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-gYC:function(a){return new J.mN(a)},
+gNq:function(a){return new J.mN(a)},
 XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(P.u(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
 z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
+if(!!z.$isVR){y=b.UZ(a,c)
+return y==null?-1:y.pX.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -496,7 +498,7 @@
 eM:function(a,b,c){if(b==null)H.vh(P.u(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 return H.m2(a,b,c)},
-Gs:function(a,b){return this.eM(a,b,0)},
+tg:function(a,b){return this.eM(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:function(a,b){var z
@@ -504,7 +506,7 @@
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gAY",0,0,71],
+bu:[function(a){return a},"$0","gCR",0,0,73],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -528,10 +530,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 mN:{
-"^":"w2Y;iN",
-gB:function(a){return this.iN.length},
+"^":"w2Y;Bx",
+gB:function(a){return this.Bx.length},
 t:function(a,b){var z,y
-z=this.iN
+z=this.Bx
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -541,13 +543,13 @@
 $asark:function(){return[P.KN]},
 $aseD:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
-$asQV:function(){return[P.KN]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+$asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
 return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
+cv:function(){--init.globalState.Xz.kv},
+Ke:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -556,32 +558,32 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.pq(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
+y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y.N8(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)
 v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+u=new H.aX(y,x,w,new I(),v,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
-u.O9(0,v)
+u.ac(0,v)
 init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
+x=H.KT(y,[y]).Zg(a)
+if(x)u.vV(0,new H.mP(z,a))
+else{y=H.KT(y,[y,y]).Zg(a)
 if(y)u.vV(0,new H.Fx(z,a))
 else u.vV(0,a)}init.globalState.Xz.bL()},
 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 os=="object"&&"system" in os)return H.mfx()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.fU()
+if(init.globalState.EF===!0)return H.mfx()
 return},
-fU:function(){var z,y
+mfx: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"))
@@ -589,7 +591,7 @@
 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)+"\""))},
-uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=H.b0(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
@@ -604,135 +606,93 @@
 q=P.L5(null,null,null,P.KN,H.yo)
 p=P.Ls(null,null,null,P.KN)
 o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+n=new H.aX(y,q,p,new I(),o,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
-n.O9(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.xn(w,v,u,t,s,r),"worker-start"))
+n.ac(0,o)
+init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.MA(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.jl3(m),new H.bLz(m))
-break
+case"spawn-worker":break
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
+case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.yb(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","dM",4,0,null,0,1],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+yb:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.t0(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)
+self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
+z=new H.oP(w,null)
 throw H.b(P.eG(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.Vr(b,".dart"))b=J.WB(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gTw(z).ml(new H.yk(y))
-x=new H.VU(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.WK(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.uK,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.H5(z,a,e,f,g),"nonworker start"))},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
+$.Mr=$.Mr+("_"+y)
 y=z.D5
 x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.oz(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
+w=z.Qy
+J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
+x=new H.zX(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-b0:function(a){if(init.globalState.ji===!0)return new H.mb(null).ug(a)
+if(init.globalState.ji===!0){z=new H.RS(0,new H.qH())
+z.dZ=new H.m3(null)
+return z.h7(a)}else{z=new H.fL(new H.qH())
+z.dZ=new H.m3(null)
+return z.h7(a)}},
+b0:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
-PK:{
-"^":"Xs:74;a,b",
+mP:{
+"^":"Xs:76;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 Fx:{
-"^":"Xs:74;a,c",
+"^":"Xs:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-pq:{
-"^":"a;Hg,NO,Y7,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Ou()==null
-y=$.Fv()
-x=z&&$.FX()===!0
+O2:{
+"^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
+N8:function(a){var z,y,x
+z=self.window==null
+y=self.Worker
+x=z&&!!self.postMessage
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
 this.ji=y
-this.da=z&&!x
+this.Ws=z&&!x
 y=H.IY
 x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Pt(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=P.L5(null,null,null,P.KN,H.aX)
+x.Eo(null,y)
+this.Xz=new H.ae(x,0)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.In()
+if(this.EF===!0){z=new H.JH()
 this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.uK,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
+self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
+self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
+static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,lH,En<,D5<,um,PX,xF?,UF<,C9<,lJ,CN,M2,MA,pa,ir",
-oz:function(a,b){if(!this.um.n(0,a))return
+"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,C9<,lJ,QC,fB,P0,pa,xc",
+V0:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
+this.CX()},
 NR:function(a){var z,y,x,w,v,u
 if(!this.UF)return
 z=this.lJ
@@ -740,79 +700,78 @@
 if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
-w=y.av
-v=y.v5
+w=y.QN
+v=y.dr
 u=v.length
 w=(w-1&u-1)>>>0
-y.av=w
+y.QN=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.zX)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
+if(w===y.Bq)y.OO();++y.Wf}this.UF=!1}this.CX()},
+Ma:function(a){var z=this.QC
 if(z==null){z=[]
-this.CN=z}if(J.wo(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
+this.QC=z}if(J.kE(z,a))return
+this.QC.push(a)},
+IB:function(a){var z=this.QC
 if(z==null)return
 J.V1(z,a)},
 JZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 ZC:function(a,b){var z,y
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.MA
+if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
 if(y){J.H4(a,null)
 return}y=new H.NYh(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
+if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
+return}z=this.fB
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
-this.M2=z}z.NZ(0,y)},
-bc:function(a,b){var z,y
+z.Eo(null,null)
+this.fB=z}z.B7(0,y)},
+w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.MA
+if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
 if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
+z.Rk.B7(0,new H.IY(this,y,"kill"))
+return}z=this.fB
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
-this.M2=z}z.NZ(0,this.gIm())},
+z.Eo(null,null)
+this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
-z=this.ir
+z=this.xc
 if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
-z=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
+if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
 y.fixed$length=init
 y[0]=J.AG(a)
 y[1]=b==null?null:J.AG(b)
-for(z=H.VM(new P.zQ(z,z.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
+for(z=H.VM(new P.zQ(z,z.HU,null,null),[null]),z.Qx=z.vY.HH;z.G();)J.H4(z.fD,y)},
 vV:[function(a,b){var z,y,x,w,v,u
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-this.MA=!0
+this.P0=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.XO(v,null)
+w=new H.oP(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.MA=!1
+if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,75,76],
+if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
-case"add-ondone":this.iK(z.t(a,1))
+case"add-ondone":this.Ma(z.t(a,1))
 break
 case"remove-ondone":this.IB(z.t(a,1))
 break
@@ -820,111 +779,85 @@
 break
 case"ping":this.ZC(z.t(a,1),z.t(a,2))
 break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
+case"kill":this.w1(z.t(a,1),z.t(a,2))
 break
-case"getErrors":this.ir.h(0,z.t(a,1))
+case"getErrors":this.xc.h(0,z.t(a,1))
 break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
+case"stopErrors":this.xc.Rz(0,z.t(a,1))
 break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
+hV:function(a){return this.A4.t(0,a)},
+ac:function(a,b){var z=this.A4
+if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.lH.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
+CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
-z=this.M2
+z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.pr()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
 z.V1(0)
-this.lH.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-this.ir.V1(0)
-z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
+this.fW.V1(0)
+init.globalState.i2.Rz(0,this.jO)
+this.xc.V1(0)
+z=this.QC
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
+this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
-"^":"Xs:18;a",
+"^":"Xs:17;a",
 $0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-cC:{
-"^":"a;Rk>,GL",
-MK:function(){var z=this.Rk
-if(z.av===z.zX)return
+ae:{
+"^":"a;Rk>,kv",
+mj:function(){var z=this.Rk
+if(z.QN===z.Bq)return
 return z.AR()},
-xB:function(){var z,y,x
-z=this.MK()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(0,init.globalState.Nr.jO)&&init.globalState.da===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
+d5:function(){var z,y,x
+z=this.mj()
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
+if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-Wu:function(){if($.Ou()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
+nT:function(){if(self.window!=null)new H.Rm(this).$0()
+else for(;this.d5(););},
 bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.Wu()
-else try{this.Wu()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.nT()
+else try{this.nT()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.rj
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"Xs:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+"^":"Xs:17;a",
+$0:[function(){if(!this.a.d5())return
+P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gpE",0,0,17],
 $isIY:true},
-In:{
+JH:{
 "^":"a;"},
-xn:{
-"^":"Xs:74;a,b,c,d,e,f",
+MA:{
+"^":"Xs:76;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-jl3:{
-"^":"Xs:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-bLz:{
-"^":"Xs:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,78,"call"],
-$isEH:true},
-yk:{
-"^":"Xs:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-WK:{
-"^":"Xs:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,79,"call"],
-$isEH:true},
-H5:{
-"^":"Xs:74;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Xs:18;a,b,c,d,e",
+zX:{
+"^":"Xs:17;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
 y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
+x=H.KT(y,[y,y]).Zg(z)
 if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
+else{y=H.KT(y,[y]).Zg(z)
 if(y)z.$1(this.b)
 else z.$0()}}},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -932,231 +865,217 @@
 "^":"a;",
 $ispW:true,
 $ishq:true},
-VU:{
-"^":"Iy4;JE,tv",
+Kg:{
+"^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
+y=this.AJ
+x=init.globalState.i2.t(0,y)
 if(x==null)return
-w=this.JE
-if(w.gKS())return
+w=this.kx
+if(w.geL())return
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.t0(b)
 if(x.gD5()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isVU&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isVU:true,
+return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.Rr(this.kx)},
+$isKg:true,
 $ispW:true,
 $ishq:true},
 Ua:{
-"^":"Xs:74;a,b,c",
+"^":"Xs:76;a,b,c",
 $0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.b0(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
+z=this.b.kx
+if(!z.geL()){if(this.c){y=this.a
+y.a=H.b0(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
-"^":"Iy4;ZU,bv,tv",
+"^":"Iy4;Bi,ma,AJ",
 wR:function(a,b){var z,y
 z=H.t0(P.EF(["command","message","port",this,"msg",b],null,null))
 if(init.globalState.EF===!0){init.globalState.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
+self.postMessage(z)}else{y=init.globalState.XC.t(0,this.Bi)
 if(y!=null)y.postMessage(z)}},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
+return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
-x=this.bv
+z=J.Eh(this.Bi,16)
+y=J.Eh(this.AJ,8)
+x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
 $ispW:true,
 $ishq:true},
 yo:{
-"^":"a;qK>,jON,KS<",
-wy:function(a){return this.jON.$1(a)},
-pr:function(){this.KS=!0
-this.jON=null},
+"^":"a;a7>,Oy,eL<",
+mY:function(a){return this.Oy.$1(a)},
+BG:function(){this.eL=!0
+this.Oy=null},
 xO:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.jON=null
+if(this.eL)return
+this.eL=!0
+this.Oy=null
 z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.lH.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.wy(b)},
+y=this.a7
+z.A4.Rz(0,y)
+z.fW.Rz(0,y)
+z.CX()},
+yU:function(a,b){if(this.eL)return
+this.mY(b)},
 $isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"wS;vl,tU",
-KR:function(a,b,c,d){var z=this.tU
-z.toString
-return H.VM(new P.u2(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-xO:[function(a){this.vl.xO(0)
-this.tU.xO(0)},"$0","gQF",0,0,18],
-TL:function(a){var z=P.ji(this.gQF(this),null,null,null,!0,null)
-this.tU=z
-this.vl.jON=z.ght(z)},
-$aswS:function(){return[null]},
-$iswS:true},
-NA:{
-"^":"hz;Ao,mR",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
+static:{"^":"kz"}},
+RS:{
+"^":"hz;uP,dZ",
+DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
+if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
+yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isVU)return new H.VU(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
+"^":"ooy;dZ",
+DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
+if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-mb:{
-"^":"fPc;RZ",
-vB:function(a){var z,y,x,w,v,u
+EU:{
+"^":"fPc;Bw",
+Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
 w=z.t(a,3)
-if(J.xC(y,init.globalState.NO)){v=init.globalState.iR.t(0,x)
+if(J.xC(y,init.globalState.NO)){v=init.globalState.i2.t(0,x)
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+return new H.Kg(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
-"^":"a;u5",
+"^":"a;At",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.u5.push(b)
+u:function(a,b,c){this.At.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.u5=[]},
-no:function(){var z,y,x
-for(z=this.u5.length,y=0;y<z;++y){x=this.u5
+CH:function(a){this.At=[]},
+F4:function(){var z,y,x
+for(z=this.At.length,y=0;y<z;++y){x=this.At
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.u5=null}},
-cx:{
+x[y].__MessageTraverser__attached_info__=null}this.At=null}},
+qH:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
 CH:function(a){},
-no:function(){}},
-BB:{
+F4:function(){}},
+HU5:{
 "^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.nl(a)
-this.mR.CH(0)
+h7:function(a){var z
+if(H.vM(a))return this.Wp(a)
+this.dZ.CH(0)
 z=null
-try{z=this.Q9(a)}finally{this.mR.no()}return z},
-Q9:function(a){var z
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.nl(a)
+try{z=this.I2(a)}finally{this.dZ.F4()}return z},
+I2:function(a){var z
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
 if(!!z.$isT8)return this.TI(a)
 if(!!z.$ispW)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.YZ(a)},
-YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+return this.N1(a)},
+N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
-"^":"BB;",
-nl:function(a){return a},
+"^":"HU5;",
+Wp:function(a){return a},
 wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
 x=y.gB(a)
 z=Array(x)
 z.fixed$length=init
-this.mR.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
+this.dZ.u(0,a,z)
+for(w=0;w<x;++w)z[w]=this.I2(y.t(a,w))
 return z},
 TI:function(a){var z,y
 z={}
-y=this.mR.t(0,a)
+y=this.dZ.t(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.mR.u(0,a,y)
+this.dZ.u(0,a,y)
 J.Me(a,new H.RK(z,this))
 return z.a},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 RK:{
-"^":"Xs:80;a,b",
-$2:function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},
+"^":"Xs:81;a,b",
+$2:[function(a,b){var z=this.b
+J.kW(this.a.a,z.I2(a),z.I2(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
 hz:{
-"^":"BB;",
-nl:function(a){return a},
+"^":"HU5;",
+Wp:function(a){return a},
 wb:function(a){var z,y
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["list",y,this.mE(a)]},
+y=this.uP++
+this.dZ.u(0,a,y)
+return["list",y,this.IP(a)]},
 TI:function(a){var z,y,x
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
+y=this.uP++
+this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.mE(J.Nd(x.gvc(a))),this.mE(J.Nd(x.gUQ(a)))]},
-mE:function(a){var z,y,x,w,v
+return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
+IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.Q9(z.t(a,w))
+for(w=0;w<y;++w){v=this.I2(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-return this.er(a)},
-er:function(a){var z,y
+QS:function(a){if(H.ZR(a))return a
+this.Bw=P.YM(null,null,null,null,null)
+return this.H6(a)},
+H6:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
-return this.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.vB(a)
+return this.Bw.t(0,y)
+case"list":return this.vo(a)
+case"map":return this.p1(a)
+case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
+default:return this.fp(a)}},
+vo:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
-this.RZ.u(0,y,x)
+this.Bw.u(0,y,x)
 z=J.U6(x)
 w=z.gB(x)
 if(typeof w!=="number")return H.s(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.er(z.t(x,v)))
+for(;v<w;++v)z.u(x,v,this.H6(z.t(x,v)))
 return x},
-GD:function(a){var z,y,x,w,v,u,t,s
+p1:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
 x=y.t(a,1)
-this.RZ.u(0,x,z)
+this.Bw.u(0,x,z)
 w=y.t(a,2)
 v=y.t(a,3)
 y=J.U6(w)
@@ -1164,45 +1083,53 @@
 if(typeof u!=="number")return H.s(u)
 t=J.U6(v)
 s=0
-for(;s<u;++s)z.u(0,this.er(y.t(w,s)),this.er(t.t(v,s)))
+for(;s<u;++s)z.u(0,this.H6(y.t(w,s)),this.H6(t.t(v,s)))
 return z},
-PR:function(a){throw H.b("Unexpected serialized object")}},
+fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
+"^":"a;bf,TD,Iw",
+Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.Iw==null)return
 H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
+var z=this.Iw
+if(this.bf)self.clearTimeout(z)
+else self.clearInterval(z)
+this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
+this.Iw=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
 else z=!1
-if(z){this.p9=1
+if(z){this.Iw=1
 z=init.globalState.Xz
 y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+z.Rk.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
+this.TD=!0}else if(self.setTimeout!=null){++init.globalState.Xz.kv
+this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+z.WI(a,b)
 return z}}},
 Av:{
-"^":"Xs:18;a,b",
-$0:[function(){this.a.p9=null
+"^":"Xs:17;a,b",
+$0:[function(){this.a.Iw=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 vt:{
-"^":"Xs:18;c,d",
-$0:[function(){this.c.p9=null
+"^":"Xs:17;c,d",
+$0:[function(){this.c.Iw=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;qK>",
+DH:{
+"^":"Xs:76;a,b",
+$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kuS:{
+"^":"a;a7>",
 giO:function(a){var z,y,x
-z=this.qK
+z=this.a7
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1215,11 +1142,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
+if(!!J.x(b).$iskuS){z=this.a7
+y=b.a7
 return z==null?y==null:z===y}return!1},
-$isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iskuS:true,
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1235,7 +1162,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1276,34 +1203,45 @@
 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)+"'"},
-mD:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
+Qn:[function(){return Date.now()},"$0","EY",0,0,4],
+Xe:function(){var z,y
+if($.xG!=null)return
+$.xG=1000
+$.hG=H.EY()
+if(typeof window=="undefined")return
+z=window
+if(z==null)return
+y=z.performance
+if(y==null)return
+if(typeof y.now!="function")return
+$.xG=1000000
+$.hG=new H.ww(y)},
 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},
-XZ:function(a){var z,y,x
+Cq:function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.lo
+for(;y.G();){x=y.Ff
 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))
+else if(x<=1114111){z.push(55296+(C.jn.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+eT:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
 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.XZ(a)}return H.RF(a)},
+if(y>65535)return H.Cq(a)}return H.RF(a)},
 mx: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))},
+return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
 fu: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))
@@ -1313,15 +1251,15 @@
 if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
 z=J.Hn(b,1)
 y=h?Date.UTC(a,z,c,d,e,f,g):new Date(a,z,c,d,e,f,g).valueOf()
-if(isNaN(y)||y<-8640000000000000||y>8640000000000000)throw H.b(P.u(null))
+if(isNaN(y)||y<-8640000000000000||y>8640000000000000)return
 x=J.Wx(a)
 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)
+o2:function(a){if(a.date===void 0)a.date=new Date(a.rq)
 return a.date},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
 wV: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},
@@ -1366,7 +1304,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",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
 z=new H.Hk(a)
@@ -1377,7 +1315,7 @@
 y=a.message
 if("number" in a&&typeof a.number=="number"){x=a.number
 w=x&65535
-if((C.jn.GG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
+if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
 u=$.Up()
@@ -1420,7 +1358,7 @@
 else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1489,7 +1427,7 @@
 rm:function(a,b,c,d){var z,y
 z=H.uj
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1517,7 +1455,7 @@
 t=$.OK
 $.OK=J.WB(t,1)
 return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
+qmC:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
 return H.HA(a,b,c,!!d,e,f)},
 aE:function(a,b){var z=J.U6(b)
@@ -1530,16 +1468,17 @@
 ag:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 GO:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Hs(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
+rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 IL: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)
+W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
 return z==null?null:z[b]},
@@ -1552,11 +1491,11 @@
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.vM+=", "
+else z.IN+=", "
 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)+">"},
+z.IN+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
@@ -1575,7 +1514,7 @@
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
 return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+oZ:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
 IU:function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
@@ -1646,10 +1585,10 @@
 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)},
-UB:function(a){var z=$.NF
+CE:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 bl:function(a){return H.eQ(a)},
-iwd:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Am:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1708,7 +1647,7 @@
 z["+"+v]=s
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
+z=C.GM()
 z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
@@ -1720,21 +1659,21 @@
 $.TX=new H.VX(u)
 $.x7=new H.rh(t)},
 ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
+ZT:function(a,b,c){var z,y,x,w,v
 z=H.VM([],[P.ns])
 y=b.length
 x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
+for(;!0;){w=C.xB.XU(b,a,c)
+if(w===-1)break
+z.push(new H.Vo(w,b,a))
+v=w+x
+if(v===y)break
+else c=w===v?c+1:v}return z},
 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
+y=b.Yr
 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
 if(b==="")if(a==="")return c
@@ -1742,50 +1681,50 @@
 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,"$$$$"))},
+w=z.IN+=w
+z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
 gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-Rz:function(a,b){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+K2:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.K2()},
+Rz:function(a,b){return this.K2()},
+V1:function(a){return this.K2()},
+FV:function(a,b){return this.K2()},
 $isT8:true,
 $asT8:null},
-Px:{
-"^":"ysD;B>,eZ,tc",
-x4:function(a,b){if(typeof b!=="string")return!1
+LPe:{
+"^":"ysD;B>,M2,md",
+NZ:function(a,b){if(typeof b!=="string")return!1
 if("__proto__"===b)return!1
-return this.eZ.hasOwnProperty(b)},
-t:function(a,b){if(!this.x4(0,b))return
-return this.TZ(b)},
-TZ:function(a){return this.eZ[a]},
+return this.M2.hasOwnProperty(b)},
+t:function(a,b){if(!this.NZ(0,b))return
+return this.Uf(b)},
+Uf:function(a){return this.M2[a]},
 aN:function(a,b){var z,y,x
-z=this.tc
+z=this.md
 for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
+b.$2(x,this.Uf(x))}},
 gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
-gUQ:function(a){return H.fR(this.tc,new H.hY(this),H.u3(this,0),H.u3(this,1))},
+gUQ:function(a){return H.fR(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,81,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
 dZ:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
+"^":"mW;Nt",
+gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
+"^":"a;r9,yl,Jt,TX,Y2,zn",
+gWa:function(){return this.r9},
+gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
+if(this.Jt===1)return C.dn
+z=this.TX
+y=z.length-this.Y2.length
 if(y===0)return C.dn
 x=[]
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
@@ -1793,10 +1732,10 @@
 x.fixed$length=!0
 return x},
 gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.IN,null)
-z=this.FX
+if(this.Jt!==0)return P.Fl(P.IN,null)
+z=this.Y2
 y=z.length
-x=this.rq
+x=this.TX
 w=x.length-y
 if(y===0)return P.Fl(P.IN,null)
 v=P.L5(null,null,null,P.IN,null)
@@ -1805,7 +1744,7 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.tx(t),x[s])}return v},
-static:{"^":"hAw,eHF,Y8"}},
+static:{"^":"hAw,eHF,oJ"}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
 XL:function(a){var z=this.Rn[a+this.hG+3]
@@ -1829,9 +1768,8 @@
 x=P.Fl(P.qU,P.KN)
 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(x)
-y=P.F(y,!0,H.ip(y,"mW",0))
-H.rd(y,null)
+y=x.gvc(x).br(0)
+H.ig(y,null)
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
@@ -1844,7 +1782,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Xs:5;a,b,c",
+"^":"Xs:3;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1852,6 +1790,10 @@
 if(y>=z.length)return H.e(z,y)
 z[y]=x},
 $isEH:true},
+ww:{
+"^":"Xs:76;a",
+$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
+$isEH:true},
 Cj:{
 "^":"Xs:82;a,b,c",
 $2:function(a,b){var z=this.a
@@ -1862,24 +1804,24 @@
 u8:{
 "^":"Xs:82;a,b",
 $2:function(a,b){var z=this.b
-if(z.x4(0,a))z.u(0,a,b)
+if(z.NZ(0,a))z.u(0,a,b)
 else this.a.a=!0},
 $isEH:true},
 Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
+"^":"a;zj,TX,v7,Wb,Xr,lT",
 qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
+z=new RegExp(this.zj).exec(a)
 if(z==null)return
 y={}
-x=this.rq
+x=this.TX
 if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
+x=this.v7
 if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
+x=this.Wb
 if(x!==-1)y.expr=z[x+1]
-x=this.Ga
+x=this.Xr
 if(x!==-1)y.method=z[x+1]
-x=this.cR
+x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
 static:{"^":"lm,k1,Re,fN,qi,cz,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
@@ -1894,20 +1836,20 @@
 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)}}},
 W0:{
-"^":"XS;K9,Ga",
-bu:[function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,71],
+"^":"XS;yy,Xr",
+bu:[function(a){var z=this.Xr
+if(z==null)return"NullError: "+H.d(this.yy)
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,73],
 $isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;K9,Ga,cR",
+"^":"XS;yy,Xr,lT",
 bu:[function(a){var z,y
-z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,71],
+z=this.Xr
+if(z==null)return"NoSuchMethodError: "+H.d(this.yy)
+y=this.lT
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.yy)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.yy)+")"},"$0","gCR",0,0,73],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1916,64 +1858,64 @@
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;K9",
-bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
+"^":"XS;yy",
+bu:[function(a){var z=this.yy
+return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
 Hk:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-XO:{
-"^":"a;lA,ui",
+oP:{
+"^":"a;Np,j0",
 bu:[function(a){var z,y
-z=this.ui
+z=this.j0
 if(z!=null)return z
-z=this.lA
+z=this.Np
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
-this.ui=z
-return z},"$0","gAY",0,0,71]},
+this.j0=z
+return z},"$0","gCR",0,0,73]},
 dr:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Xs:74;b,c",
+"^":"Xs:76;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Xs:74;d,e,f",
+"^":"Xs:76;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Xs:74;UI,bK,Gq,Rm",
+"^":"Xs:76;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Xs:74;w3,HZ,mG,xC,cj",
+"^":"Xs:76;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Xs:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gAY",0,0,71],
+bu:[function(a){return"Closure"},"$0","gCR",0,0,73],
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
 "^":"Xs;"},
 v:{
-"^":"Bp;nw,jm,cR,RA",
+"^":"Bp;tx,J6,lT,JL",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
+return this.tx===b.tx&&this.J6===b.J6&&this.lT===b.lT},
 giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
+z=this.lT
+if(z==null)y=H.eQ(this.tx)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
+return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+static:{"^":"bf,P4",uj:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
 if(z==null){z=H.B3("self")
 $.bf=z}return z},B3:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -1984,20 +1926,20 @@
 if(z[v]===a)return v}}}},
 Pe:{
 "^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 bb:{
 "^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{Yi:function(a){return new H.bb(a)}}},
+bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
+"^":"lbp;dw,Iq,is,vL",
+Zg:function(a){var z=this.LC(a)
 return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(a)
+LC:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
 z={func:"dynafunc"}
@@ -2009,7 +1951,7 @@
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
 if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
+y=this.vL
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
@@ -2023,12 +1965,12 @@
 if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
 for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.p6
+x+=H.d(u)}x+="]"}else{z=this.vL
 if(z!=null){x=(w?x+", ":x)+"{"
 t=H.kU(z)
 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))},"$0","gAY",0,0,71],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gCR",0,0,73],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -2036,17 +1978,17 @@
 return z}}},
 hJ:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gAY",0,0,71],
+bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $ishJ:true},
-tu:{
+Hs:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
+bu:[function(a){return this.oc},"$0","gCR",0,0,73]},
 KEA:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
@@ -2056,25 +1998,25 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
 this.Et=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gAY",0,0,71]},
+bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
 cu:{
-"^":"a;LU,ke",
+"^":"a;VX,UX",
 bu:[function(a){var z,y
-z=this.ke
+z=this.UX
 if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},"$0","gAY",0,0,71],
-giO:function(a){return J.v1(this.LU)},
+y=this.VX.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+this.UX=y
+return y},"$0","gCR",0,0,73],
+giO:function(a){return J.v1(this.VX)},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
+return!!J.x(b).$iscu&&J.xC(this.VX,b.VX)},
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
@@ -2082,39 +2024,41 @@
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
-"^":"Xs:5;c",
+"^":"Xs:3;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;zO,Ej,BT,Ua",
-gF4:function(){var z=this.BT
+"^":"a;zO,Yr,HN,mV",
+gHc:function(){var z=this.HN
 if(z!=null)return z
-z=this.Ej
+z=this.Yr
 z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
+this.HN=z
 return z},
-gAT:function(){var z=this.Ua
+gIa:function(){var z=this.mV
 if(z!=null)return z
-z=this.Ej
+z=this.Yr
 z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.Ua=z
+this.mV=z
 return z},
 ik:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
+z=this.Yr.exec(a)
 if(z==null)return
 return H.yx(this,z)},
-zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Ej.test(a)},
-dd:function(a,b){return new H.KW(this,b)},
-yk:function(a,b){var z,y
-z=this.gF4()
+B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
+return this.Yr.test(a)},
+dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+return new H.KW(this,b,c)},
+dd:function(a,b){return this.dm(a,b,0)},
+UZ:function(a,b){var z,y
+z=this.gHc()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
 return H.yx(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
+Oj:function(a,b){var z,y,x,w
+z=this.gIa()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
@@ -2129,10 +2073,10 @@
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
+return this.Oj(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSE:true,
+$iswL:true,
 static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2140,404 +2084,406 @@
 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,null,null))}}},
 EK:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
+"^":"a;zO,pX",
+t:function(a,b){var z=this.pX
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-VO:function(a,b){},
+fw:function(a,b){},
 $isns:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
-z.VO(a,b)
+z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;rN,Vl",
-gA:function(a){return new H.Pb(this.rN,this.Vl,null)},
+"^":"mW;ve,vF,wQ",
+gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
 $asmW:function(){return[P.ns]},
 $asQV:function(){return[P.ns]}},
 Pb:{
-"^":"a;xz,Vl,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.Vl==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
+"^":"a;UW,vF,Ij,Jz",
+gl:function(){return this.Jz},
+G:function(){var z,y,x,w,v
+z=this.vF
+if(z==null)return!1
+y=this.Ij
+if(y<=z.length){x=this.UW.UZ(z,y)
+if(x!=null){this.Jz=x
+z=x.pX
 y=z.index
 if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.Vl,x)
-this.Wh=z
-if(z==null){this.Vl=null
-return!1}return!0}},
+w=J.q8(z[0])
+if(typeof w!=="number")return H.s(w)
+v=y+w
+this.Ij=z.index===v?v+1:v
+return!0}}this.Jz=null
+this.vF=null
+return!1}},
 Vo:{
 "^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+$isns:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;fi,dB,KW,DX,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
+"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gO9:function(a){return a.IF},
+sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
+gFR:function(a){return a.Qw},
 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)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-gih:function(a){return a.DX},
-sih:function(a,b){a.DX=this.ct(a,C.mJ,a.DX,b)},
-Ut:[function(a,b,c,d){var z=a.fi
+sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
+gph:function(a){return a.cw},
+sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
+pp:[function(a,b,c,d){var z=a.IF
 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,84,46,47,85],
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.DX=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.IF=!1
+a.Qw=null
+a.cw="action"
+a.oX=null
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Df.ZL(a)
-C.Df.XI(a)
+a.n9=x
+a.wy=w
+C.Gx.LX(a)
+C.Gx.XI(a)
 return a}}},
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Si(),"google"),"visualization")
+z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
-Xk:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,12,13],
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.kV(z)},
+return C.xr.iQ(z)},
 n8:function(a){if(a==null)return P.Vu(null,null,null)
-return W.Og("/crdptargets/"+P.jW(C.yD,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
-dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
+return W.qw("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
+dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-avE:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","IZ",2,0,15],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
 P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
+z=C.CD.yu(C.CD.RE(a*1000))
+y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
+x=C.jn.BU(z,60000)
 z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
+w=C.jn.BU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-As:[function(a){var z=J.Wx(a)
+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.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","pg",2,0,15,16],
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
 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)
+z=J.Dv(J.vX(a,1000))
+y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(z,60000),1000)
+x=C.jn.BU(z,60000)
+w=C.jn.BU(C.jn.Y(z,60000),1000)
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;OJ,Ef,Z6,Eh,m2<,bn,GI,Pv,cC,AP,fn",
-gwv:function(a){return this.Eh},
+"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
+gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
-if(J.xC(this.Eh,b))return
-if(this.Eh!=null){J.Z8(this.cC)
-J.tw(this.Eh)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gO7())
+if(J.xC(this.Nv,b))return
+if(this.Nv!=null){J.Z8(this.cC)
+J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gAQ())
 z=J.RE(b)
-z.giG(b).ml(this.gkq())
+z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gbf())
-J.Sr(z.gRk(b)).yI(this.gI2())
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
+J.Sr(z.gRk(b)).yI(this.gR7())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.gXa())}this.Eh=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-AQ:function(a){var z,y
+qB:function(a){var z,y
 $.Kh=this
-z=this.OJ
+z=this.wc
 z.push(new G.t9(this,null,null,null,null))
-z.push(new G.v5(this,null,null,null,null))
+z.push(new G.ki(this,null,null,null,null))
 z.push(new G.Sy(this,null,null,null,null))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(z.gbQ()),y.Sg),[H.u3(y,0)]).Zz()
-z.Cy()},
-x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
-Vu:[function(a){var z=J.RE(a)
+z.By=this
+y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.aF(z.gnt()),y.el),[H.u3(y,0)]).DN()
+z.VA()},
+pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
+BI:[function(a){var z=J.RE(a)
 switch(z.gfG(a)){case"IsolateCreated":break
-case"IsolateShutdown":this.x3(z.god(a))
+case"IsolateShutdown":this.pZ(z.god(a))
 break
 case"BreakpointResolved":z.god(a).Xb()
 break
-case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.x3(z.god(a))
+case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
 J.bi(this.cC,a)
 break
-default:N.QM("").YX("Unrecognized event type: "+H.d(z.gfG(a)))
-break}},"$1","gI2",2,0,86,2],
-yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,87,24],
-kI:[function(a){this.Pv=a
+default:N.QM("").YX("Unrecognized event: "+H.d(a))
+break}},"$1","gR7",2,0,86,87],
+kj:[function(a){this.Pv=a
+this.aX("error/",null)},"$1","gtb",2,0,88,23],
+m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,88,89],
-og:function(a,b){var z,y,x,w,v,u
+else this.aX("error/",null)},"$1","geO",2,0,89,90],
+aX:function(a,b){var z,y,x,w,v,u
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
 if(y.n(x,"on")){if($.ax==null)$.ax=Z.NY()}else if(y.n(x,"off")){y=$.ax
-if(y!=null){y.RV.ed()
+if(y!=null){y.RV.Gv()
 $.ax=null}}}y=$.ax
-if(y!=null){y.Nu.CH(0)
-J.Z8(y.Rk)}y=this.GI
-if(y!=null)J.CA(y,$.ax)
-for(y=this.OJ,w=0;w<y.length;++w){v=y[w]
-if(v.VU(a)){this.GP(v)
+if(y!=null){y.NP.CH(0)
+J.Z8(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.ax)
+for(y=this.wc,w=0;w<y.length;++w){v=y[w]
+if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
 if(v.gnz(v)&&!J.xC(u,y)){u=new T.qI(v,C.Zg,u,y)
 u.$builtinTypeInfo=[null]
 v.nq(v,u)}v.fz=y
-v.qY(a)
+v.Q0(a)
 return}}throw H.b(P.a9())},
-GP:function(a){var z,y,x,w
-if(J.xC(this.Ef,a))return
-if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
-this.Ef.oV()
-J.r4(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ci()}catch(y){x=H.Ru(y)
+yN:function(a){var z,y,x,w
+if(J.xC(this.fN,a))return
+if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
+this.fN.oV()
+J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
+try{a.ak()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
-this.GI=w
-J.CA(w,$.ax)
-x.appendChild(this.GI)
+this.HJ=w
+J.La(w,$.ax)
+x.appendChild(this.HJ)
 x=a
-w=this.Ef
+w=this.fN
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Ef=x},
-ab:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gO7",2,0,90,91],
-fu:[function(a){if(!J.xC(this.Eh,a))return
+this.nq(this,w)}this.fN=x},
+rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gAQ",2,0,91,92],
+T0:[function(a){if(!J.xC(this.Nv,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,90,91],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.AQ(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+this.qB(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.AQ(!0)},
+this.qB(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"Xs:92;",
+"^":"Xs:93;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
-"^":"Xs:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,93,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 Kf:{
-"^":"a;KJ",
-goH:function(){return this.KJ.nQ("getNumberOfColumns")},
-gvp:function(a){return this.KJ.nQ("getNumberOfRows")},
-Ai:function(){var z=this.KJ
+"^":"a;Yb",
+goH:function(){return this.Yb.nQ("getNumberOfColumns")},
+gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.KJ.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-qu:{
+this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
+yD:{
 "^":"a;vR,bG",
-W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.KJ,z])}},
+Am:function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(this.ec.Eh==null)b=this.wa("/vm-connect/")
-z=this.c5
+if(this.By.Nv==null)b=this.wa("/vm-connect/")
+z=this.BE
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
-this.c5=b}this.lU(b)},
-lU:function(a){var z,y,x
+this.BE=b}this.UJ(b)},
+UJ:function(a){var z,y,x
 if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
 if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.Gs(a,"---")){z=a.split("---")
+if(C.xB.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
 if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
+this.By.aX(a,x)},
 Cz:function(a,b,c){var z,y,x
-z=J.Vs(c).MW.getAttribute("href")
+z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gpL(a)
+x=y.gEV(a)
 if(typeof x!=="number")return x.D()
 if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
 this.bo(0,z)
 y.e6(a)}},
 ng:{
-"^":"yVe;MP,ec,c5,ro,dUC,U3",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
+"^":"yVe;Zz,By,BE,ro,XY,cU",
+VA:function(){var z=H.d(window.location.hash)
+if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,94,14],
+this.UJ(window.location.hash)},
+fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
-gKw:function(a){return this.fz},
-sKw:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
+gl6:function(a){return this.fz},
+sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
 $isOS:true},
 by:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){if(J.xC(a,""))return
-this.i6.Eh.cv(a).ml(new G.mo(this)).OA(new G.pa())},
+Q0:function(a){if(J.xC(a,""))return
+this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
-mo:{
-"^":"Xs:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,95,"call"],
+GL:{
+"^":"Xs:12;a",
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-pa:{
-"^":"Xs:13;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+mo:{
+"^":"Xs:12;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.ha())},
+Q0:function(a){a=J.ZZ(a,11)
+this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Za:{
-"^":"Xs:13;a",
+Hb:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,96,"call"],
+if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ha:{
-"^":"Xs:13;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+ZaW:{
+"^":"Xs:12;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Sy:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){var z,y
+Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
 z.Ll=J.Q5(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
-v5:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+ki:{
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){},
+Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.Xk(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
-"^":"Xs:5;",
+"^":"Xs:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.kV(a)
+z=C.xr.iQ(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,97,"call"],
+y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,98,"call"],
 $isEH:true},
 XN:{
-"^":"Xs:13;",
-$1:[function(a){},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,bq>,TY,ro,dUC,U3",
-BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.MG(a)
+"^":"d3;wo,bq>,TY,ro,XY,cU",
+k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
+TP:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
 return z},
-MG:function(a){var z,y
+Xk:function(a){var z,y
 z={}
 z.a=null
 y=this.bq
-y.aN(y,new G.La(z,a))
+y.aN(y,new G.pJO(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
 z=this.bq
-if(z.Gs(z,b))return
+if(z.tg(z,b))return
 z.h(0,b)
-this.XT()
-this.XT()
-y=this.wu.IU+".history"
+this.TV()
+this.TV()
+y=this.wo.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
 z=this.bq
 z.Rz(0,b)
-this.XT()
-this.XT()
-y=this.wu.IU+".history"
+this.TV()
+this.TV()
+y=this.wo.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-XT:function(){var z=this.bq
+TV:function(){var z=this.bq
 z.GT(z,new G.jQ())},
-UJ:function(){var z,y,x,w,v
+A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.Xk(this.wu.IU+".history")
+y=G.DUC(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2545,85 +2491,87 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
-this.XT()},
-Ff:function(){this.UJ()
-var z=this.TP(this.BZ())
+this.TV()},
+lK:function(){this.A7()
+var z=this.TP(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
-La:{
-"^":"Xs:13;a,b",
+pJO:{
+"^":"Xs:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"Xs:98;",
+"^":"Xs:99;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
 gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
+goE:function(a){return this.Lk},
+soE:function(a,b){var z=J.xC(this.Lk,b)
+this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.o8()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
+this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
+this.cO()}}},
+r8:function(){this.soE(0,this.Lk!==!0)
+return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-kf:{
-"^":"Pi;vp>,AP,fn",
-mA:function(a){var z,y
+ih:{
+"^":"Pi;vp>,Vg,fn",
+G7:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
-a.C4(0)
+a.Pz(0)
 y.FV(z,a.ks)},
-qU:function(a){var z,y,x
+lo:function(a){var z,y,x
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.oF(z,y.Mw(z,x)+1,J.Mx(x))
-else this.FS(x)},
-FS:function(a){var z,y,x,w,v
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
+else this.nm(x)},
+nm:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gks(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
-v=w.Mw(z,a)+1
-w.UZ(z,v,v+y)}},
+v=w.OY(z,a)+1
+w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,17]}},
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
-Vz0:{
+Vz:{
 "^":"Pi;oH<,vp>,zz<",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
+gT3:function(){return this.Rj},
+sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
+wA:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.UQ(J.hI(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gCS",4,0,99],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,99],
+oa:[function(a,b){var z=this.wA(a,this.pT)
+return J.FW(this.wA(b,this.pT),z)},"$2","gMG",4,0,100],
+ws:[function(a,b){return J.FW(this.wA(a,this.pT),this.wA(b,this.pT))},"$2","gTF",4,0,100],
 Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
+H.Xe()
+$.Ji=$.xG
+new P.VV(null,null).wE(0)
 z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gPd()
-H.rd(z,y)}},
+if(this.Rj){y=this.gMG()
+H.ig(z,y)}else{y=this.gTF()
+H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
 Id:function(a,b){var z=this.vp
@@ -2636,2042 +2584,2102 @@
 z=this.oH
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
-YU:[function(a){var z
+ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,100]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+z=J.ZC(z[a])
+return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
-Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.WQ,new E.e46(),C.fV,new E.e47(),C.jU,new E.e48(),C.OO,new E.e49(),C.Mc,new E.e50(),C.FP,new E.e51(),C.kF,new E.e52(),C.UD,new E.e53(),C.Aq,new E.e54(),C.DS,new E.e55(),C.C9,new E.e56(),C.VF,new E.e57(),C.uU,new E.e58(),C.YJ,new E.e59(),C.eF,new E.e60(),C.oI,new E.e61(),C.ST,new E.e62(),C.QH,new E.e63(),C.qX,new E.e64(),C.rE,new E.e65(),C.nf,new E.e66(),C.EI,new E.e67(),C.JB,new E.e68(),C.RY,new E.e69(),C.d4,new E.e70(),C.cF,new E.e71(),C.SI,new E.e72(),C.zS,new E.e73(),C.YA,new E.e74(),C.Ge,new E.e75(),C.A7,new E.e76(),C.He,new E.e77(),C.im,new E.e78(),C.Ss,new E.e79(),C.k6,new E.e80(),C.oj,new E.e81(),C.PJ,new E.e82(),C.q2,new E.e83(),C.d2,new E.e84(),C.kN,new E.e85(),C.fn,new E.e86(),C.yB,new E.e87(),C.eJ,new E.e88(),C.iG,new E.e89(),C.Py,new E.e90(),C.pC,new E.e91(),C.uu,new E.e92(),C.qs,new E.e93(),C.XH,new E.e94(),C.tJ,new E.e95(),C.F8,new E.e96(),C.C1,new E.e97(),C.Nr,new E.e98(),C.nL,new E.e99(),C.a0,new E.e100(),C.Yg,new E.e101(),C.bR,new E.e102(),C.ai,new E.e103(),C.ob,new E.e104(),C.MY,new E.e105(),C.Iv,new E.e106(),C.Wg,new E.e107(),C.tD,new E.e108(),C.QS,new E.e109(),C.nZ,new E.e110(),C.Of,new E.e111(),C.Vl,new E.e112(),C.pY,new E.e113(),C.XL,new E.e114(),C.LA,new E.e115(),C.AT,new E.e116(),C.Lk,new E.e117(),C.dK,new E.e118(),C.xf,new E.e119(),C.rB,new E.e120(),C.bz,new E.e121(),C.Jx,new E.e122(),C.b5,new E.e123(),C.z6,new E.e124(),C.SY,new E.e125(),C.Lc,new E.e126(),C.hf,new E.e127(),C.uk,new E.e128(),C.Zi,new E.e129(),C.TN,new E.e130(),C.GI,new E.e131(),C.Wn,new E.e132(),C.ur,new E.e133(),C.VN,new E.e134(),C.EV,new E.e135(),C.VI,new E.e136(),C.eh,new E.e137(),C.SA,new E.e138(),C.uG,new E.e139(),C.kV,new E.e140(),C.vp,new E.e141(),C.cc,new E.e142(),C.DY,new E.e143(),C.Lx,new E.e144(),C.M3,new E.e145(),C.wT,new E.e146(),C.JK,new E.e147(),C.SR,new E.e148(),C.t6,new E.e149(),C.rP,new E.e150(),C.pX,new E.e151(),C.VD,new E.e152(),C.NN,new E.e153(),C.UX,new E.e154(),C.YS,new E.e155(),C.pu,new E.e156(),C.BJ,new E.e157(),C.c6,new E.e158(),C.td,new E.e159(),C.Gn,new E.e160(),C.zO,new E.e161(),C.vg,new E.e162(),C.YV,new E.e163(),C.If,new E.e164(),C.Ys,new E.e165(),C.zm,new E.e166(),C.nX,new E.e167(),C.xP,new E.e168(),C.XM,new E.e169(),C.Ic,new E.e170(),C.yG,new E.e171(),C.uI,new E.e172(),C.O9,new E.e173(),C.ba,new E.e174(),C.tW,new E.e175(),C.CG,new E.e176(),C.Jf,new E.e177(),C.Wj,new E.e178(),C.vb,new E.e179(),C.UL,new E.e180(),C.AY,new E.e181(),C.QK,new E.e182(),C.AO,new E.e183(),C.Xd,new E.e184(),C.I7,new E.e185(),C.kY,new E.e186(),C.Wm,new E.e187(),C.GR,new E.e188(),C.KX,new E.e189(),C.ja,new E.e190(),C.Dj,new E.e191(),C.ir,new E.e192(),C.dx,new E.e193(),C.ni,new E.e194(),C.X2,new E.e195(),C.F3,new E.e196(),C.UY,new E.e197(),C.Aa,new E.e198(),C.nY,new E.e199(),C.tg,new E.e200(),C.HD,new E.e201(),C.iU,new E.e202(),C.eN,new E.e203(),C.ue,new E.e204(),C.nh,new E.e205(),C.L2,new E.e206(),C.Gs,new E.e207(),C.bE,new E.e208(),C.YD,new E.e209(),C.PX,new E.e210(),C.N8,new E.e211(),C.EA,new E.e212(),C.oW,new E.e213(),C.hd,new E.e214(),C.pH,new E.e215(),C.Ve,new E.e216(),C.jM,new E.e217(),C.W5,new E.e218(),C.uX,new E.e219(),C.nt,new E.e220(),C.IT,new E.e221(),C.li,new E.e222(),C.PM,new E.e223(),C.ks,new E.e224(),C.Om,new E.e225(),C.iC,new E.e226(),C.k5,new E.e227(),C.Nv,new E.e228(),C.Cw,new E.e229(),C.TW,new E.e230(),C.xS,new E.e231(),C.ft,new E.e232(),C.QF,new E.e233(),C.mi,new E.e234(),C.zz,new E.e235(),C.eO,new E.e236(),C.hO,new E.e237(),C.ei,new E.e238(),C.HK,new E.e239(),C.je,new E.e240(),C.Ef,new E.e241(),C.QL,new E.e242(),C.RH,new E.e243(),C.SP,new E.e244(),C.Q1,new E.e245(),C.ID,new E.e246(),C.dA,new E.e247(),C.bc,new E.e248(),C.kw,new E.e249(),C.nE,new E.e250(),C.ep,new E.e251(),C.J2,new E.e252(),C.zU,new E.e253(),C.OU,new E.e254(),C.bn,new E.e255(),C.mh,new E.e256(),C.Fh,new E.e257(),C.yv,new E.e258(),C.LP,new E.e259(),C.jh,new E.e260(),C.fj,new E.e261(),C.xw,new E.e262(),C.zn,new E.e263(),C.RJ,new E.e264(),C.Tc,new E.e265(),C.YE,new E.e266(),C.Uy,new E.e267()],null,null)
-y=P.EF([C.aP,new E.e268(),C.cg,new E.e269(),C.Zg,new E.e270(),C.S4,new E.e271(),C.AV,new E.e272(),C.bk,new E.e273(),C.lH,new E.e274(),C.am,new E.e275(),C.oE,new E.e276(),C.kG,new E.e277(),C.XA,new E.e278(),C.i4,new E.e279(),C.mJ,new E.e280(),C.yL,new E.e281(),C.bJ,new E.e282(),C.kI,new E.e283(),C.vY,new E.e284(),C.VK,new E.e285(),C.aH,new E.e286(),C.GP,new E.e287(),C.vs,new E.e288(),C.Gr,new E.e289(),C.Fe,new E.e290(),C.tP,new E.e291(),C.yh,new E.e292(),C.Zb,new E.e293(),C.p8,new E.e294(),C.ld,new E.e295(),C.ne,new E.e296(),C.B0,new E.e297(),C.mr,new E.e298(),C.YT,new E.e299(),C.WQ,new E.e300(),C.jU,new E.e301(),C.OO,new E.e302(),C.Mc,new E.e303(),C.QH,new E.e304(),C.rE,new E.e305(),C.nf,new E.e306(),C.Ge,new E.e307(),C.A7,new E.e308(),C.He,new E.e309(),C.oj,new E.e310(),C.d2,new E.e311(),C.fn,new E.e312(),C.yB,new E.e313(),C.Py,new E.e314(),C.uu,new E.e315(),C.qs,new E.e316(),C.rB,new E.e317(),C.hf,new E.e318(),C.uk,new E.e319(),C.Zi,new E.e320(),C.TN,new E.e321(),C.ur,new E.e322(),C.EV,new E.e323(),C.VI,new E.e324(),C.eh,new E.e325(),C.SA,new E.e326(),C.uG,new E.e327(),C.kV,new E.e328(),C.vp,new E.e329(),C.SR,new E.e330(),C.t6,new E.e331(),C.UX,new E.e332(),C.YS,new E.e333(),C.c6,new E.e334(),C.td,new E.e335(),C.zO,new E.e336(),C.YV,new E.e337(),C.If,new E.e338(),C.Ys,new E.e339(),C.nX,new E.e340(),C.XM,new E.e341(),C.Ic,new E.e342(),C.O9,new E.e343(),C.tW,new E.e344(),C.Wj,new E.e345(),C.vb,new E.e346(),C.QK,new E.e347(),C.Xd,new E.e348(),C.kY,new E.e349(),C.GR,new E.e350(),C.KX,new E.e351(),C.ja,new E.e352(),C.Dj,new E.e353(),C.X2,new E.e354(),C.UY,new E.e355(),C.Aa,new E.e356(),C.nY,new E.e357(),C.tg,new E.e358(),C.HD,new E.e359(),C.iU,new E.e360(),C.eN,new E.e361(),C.Gs,new E.e362(),C.bE,new E.e363(),C.YD,new E.e364(),C.PX,new E.e365(),C.pH,new E.e366(),C.Ve,new E.e367(),C.jM,new E.e368(),C.uX,new E.e369(),C.nt,new E.e370(),C.IT,new E.e371(),C.PM,new E.e372(),C.ks,new E.e373(),C.Om,new E.e374(),C.iC,new E.e375(),C.Nv,new E.e376(),C.Cw,new E.e377(),C.TW,new E.e378(),C.ft,new E.e379(),C.mi,new E.e380(),C.zz,new E.e381(),C.dA,new E.e382(),C.kw,new E.e383(),C.nE,new E.e384(),C.zU,new E.e385(),C.OU,new E.e386(),C.RJ,new E.e387(),C.YE,new E.e388()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,P.Fl(null,null),C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.b6,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.b6,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.b6,C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+De:[function(){var z,y,x
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.cJ,new E.e46(),C.WQ,new E.e47(),C.fV,new E.e48(),C.jU,new E.e49(),C.OO,new E.e50(),C.Mc,new E.e51(),C.FP,new E.e52(),C.kF,new E.e53(),C.UD,new E.e54(),C.Aq,new E.e55(),C.DS,new E.e56(),C.C9,new E.e57(),C.VF,new E.e58(),C.uU,new E.e59(),C.YJ,new E.e60(),C.eF,new E.e61(),C.oI,new E.e62(),C.ST,new E.e63(),C.QH,new E.e64(),C.qX,new E.e65(),C.rE,new E.e66(),C.nf,new E.e67(),C.EI,new E.e68(),C.JB,new E.e69(),C.RY,new E.e70(),C.d4,new E.e71(),C.cF,new E.e72(),C.SI,new E.e73(),C.zS,new E.e74(),C.YA,new E.e75(),C.Ge,new E.e76(),C.A7,new E.e77(),C.He,new E.e78(),C.im,new E.e79(),C.Ss,new E.e80(),C.k6,new E.e81(),C.oj,new E.e82(),C.PJ,new E.e83(),C.q2,new E.e84(),C.d2,new E.e85(),C.kN,new E.e86(),C.uO,new E.e87(),C.fn,new E.e88(),C.yB,new E.e89(),C.eJ,new E.e90(),C.iG,new E.e91(),C.Py,new E.e92(),C.pC,new E.e93(),C.uu,new E.e94(),C.qs,new E.e95(),C.XH,new E.e96(),C.tJ,new E.e97(),C.F8,new E.e98(),C.C1,new E.e99(),C.Nr,new E.e100(),C.nL,new E.e101(),C.a0,new E.e102(),C.Yg,new E.e103(),C.bR,new E.e104(),C.ai,new E.e105(),C.ob,new E.e106(),C.MY,new E.e107(),C.Iv,new E.e108(),C.Wg,new E.e109(),C.tD,new E.e110(),C.QS,new E.e111(),C.nZ,new E.e112(),C.Of,new E.e113(),C.Vl,new E.e114(),C.pY,new E.e115(),C.XL,new E.e116(),C.LA,new E.e117(),C.nQ,new E.e118(),C.AT,new E.e119(),C.Lk,new E.e120(),C.dK,new E.e121(),C.xf,new E.e122(),C.rB,new E.e123(),C.bz,new E.e124(),C.Jx,new E.e125(),C.b5,new E.e126(),C.z6,new E.e127(),C.SY,new E.e128(),C.Lc,new E.e129(),C.hf,new E.e130(),C.uk,new E.e131(),C.Zi,new E.e132(),C.TN,new E.e133(),C.GI,new E.e134(),C.Wn,new E.e135(),C.ur,new E.e136(),C.VN,new E.e137(),C.EV,new E.e138(),C.VI,new E.e139(),C.eh,new E.e140(),C.SA,new E.e141(),C.uG,new E.e142(),C.kV,new E.e143(),C.vp,new E.e144(),C.cc,new E.e145(),C.DY,new E.e146(),C.Lx,new E.e147(),C.M3,new E.e148(),C.wT,new E.e149(),C.JK,new E.e150(),C.SR,new E.e151(),C.t6,new E.e152(),C.rP,new E.e153(),C.pX,new E.e154(),C.VD,new E.e155(),C.NN,new E.e156(),C.UX,new E.e157(),C.YS,new E.e158(),C.pu,new E.e159(),C.BJ,new E.e160(),C.c6,new E.e161(),C.td,new E.e162(),C.Gn,new E.e163(),C.zO,new E.e164(),C.vg,new E.e165(),C.YV,new E.e166(),C.If,new E.e167(),C.Ys,new E.e168(),C.zm,new E.e169(),C.nX,new E.e170(),C.xP,new E.e171(),C.XM,new E.e172(),C.Ic,new E.e173(),C.yG,new E.e174(),C.uI,new E.e175(),C.O9,new E.e176(),C.ba,new E.e177(),C.tW,new E.e178(),C.CG,new E.e179(),C.Jf,new E.e180(),C.Wj,new E.e181(),C.vb,new E.e182(),C.UL,new E.e183(),C.AY,new E.e184(),C.QK,new E.e185(),C.AO,new E.e186(),C.Xd,new E.e187(),C.I7,new E.e188(),C.kY,new E.e189(),C.Wm,new E.e190(),C.vK,new E.e191(),C.GR,new E.e192(),C.KX,new E.e193(),C.ja,new E.e194(),C.Dj,new E.e195(),C.ir,new E.e196(),C.dx,new E.e197(),C.ni,new E.e198(),C.X2,new E.e199(),C.F3,new E.e200(),C.UY,new E.e201(),C.Aa,new E.e202(),C.nY,new E.e203(),C.tg,new E.e204(),C.HD,new E.e205(),C.iU,new E.e206(),C.eN,new E.e207(),C.ue,new E.e208(),C.nh,new E.e209(),C.L2,new E.e210(),C.Gs,new E.e211(),C.bE,new E.e212(),C.YD,new E.e213(),C.PX,new E.e214(),C.N8,new E.e215(),C.EA,new E.e216(),C.oW,new E.e217(),C.hd,new E.e218(),C.Jd,new E.e219(),C.Y4,new E.e220(),C.Si,new E.e221(),C.pH,new E.e222(),C.Ve,new E.e223(),C.jM,new E.e224(),C.rd,new E.e225(),C.W5,new E.e226(),C.uX,new E.e227(),C.nt,new E.e228(),C.IT,new E.e229(),C.li,new E.e230(),C.PM,new E.e231(),C.ks,new E.e232(),C.Om,new E.e233(),C.iC,new E.e234(),C.Nv,new E.e235(),C.Wo,new E.e236(),C.FZ,new E.e237(),C.TW,new E.e238(),C.xS,new E.e239(),C.ft,new E.e240(),C.QF,new E.e241(),C.mi,new E.e242(),C.zz,new E.e243(),C.eO,new E.e244(),C.hO,new E.e245(),C.ei,new E.e246(),C.HK,new E.e247(),C.je,new E.e248(),C.Ef,new E.e249(),C.QL,new E.e250(),C.RH,new E.e251(),C.SP,new E.e252(),C.Q1,new E.e253(),C.ID,new E.e254(),C.dA,new E.e255(),C.bc,new E.e256(),C.kw,new E.e257(),C.nE,new E.e258(),C.ep,new E.e259(),C.J2,new E.e260(),C.zU,new E.e261(),C.OU,new E.e262(),C.bn,new E.e263(),C.mh,new E.e264(),C.Fh,new E.e265(),C.yv,new E.e266(),C.LP,new E.e267(),C.jh,new E.e268(),C.fj,new E.e269(),C.xw,new E.e270(),C.zn,new E.e271(),C.RJ,new E.e272(),C.Tc,new E.e273(),C.YE,new E.e274(),C.Uy,new E.e275()],null,null)
+y=P.EF([C.aP,new E.e276(),C.cg,new E.e277(),C.Zg,new E.e278(),C.S4,new E.e279(),C.AV,new E.e280(),C.bk,new E.e281(),C.lH,new E.e282(),C.am,new E.e283(),C.oE,new E.e284(),C.kG,new E.e285(),C.XA,new E.e286(),C.i4,new E.e287(),C.mJ,new E.e288(),C.yL,new E.e289(),C.bJ,new E.e290(),C.kI,new E.e291(),C.vY,new E.e292(),C.VK,new E.e293(),C.aH,new E.e294(),C.GP,new E.e295(),C.vs,new E.e296(),C.Gr,new E.e297(),C.Fe,new E.e298(),C.tP,new E.e299(),C.yh,new E.e300(),C.Zb,new E.e301(),C.p8,new E.e302(),C.ld,new E.e303(),C.ne,new E.e304(),C.B0,new E.e305(),C.mr,new E.e306(),C.YT,new E.e307(),C.cJ,new E.e308(),C.WQ,new E.e309(),C.jU,new E.e310(),C.OO,new E.e311(),C.Mc,new E.e312(),C.QH,new E.e313(),C.rE,new E.e314(),C.nf,new E.e315(),C.Ge,new E.e316(),C.A7,new E.e317(),C.He,new E.e318(),C.oj,new E.e319(),C.d2,new E.e320(),C.uO,new E.e321(),C.fn,new E.e322(),C.yB,new E.e323(),C.Py,new E.e324(),C.uu,new E.e325(),C.qs,new E.e326(),C.rB,new E.e327(),C.hf,new E.e328(),C.uk,new E.e329(),C.Zi,new E.e330(),C.TN,new E.e331(),C.ur,new E.e332(),C.EV,new E.e333(),C.VI,new E.e334(),C.eh,new E.e335(),C.SA,new E.e336(),C.uG,new E.e337(),C.kV,new E.e338(),C.vp,new E.e339(),C.SR,new E.e340(),C.t6,new E.e341(),C.UX,new E.e342(),C.YS,new E.e343(),C.c6,new E.e344(),C.td,new E.e345(),C.zO,new E.e346(),C.YV,new E.e347(),C.If,new E.e348(),C.Ys,new E.e349(),C.nX,new E.e350(),C.XM,new E.e351(),C.Ic,new E.e352(),C.O9,new E.e353(),C.tW,new E.e354(),C.Wj,new E.e355(),C.vb,new E.e356(),C.QK,new E.e357(),C.Xd,new E.e358(),C.kY,new E.e359(),C.vK,new E.e360(),C.GR,new E.e361(),C.KX,new E.e362(),C.ja,new E.e363(),C.Dj,new E.e364(),C.X2,new E.e365(),C.UY,new E.e366(),C.Aa,new E.e367(),C.nY,new E.e368(),C.tg,new E.e369(),C.HD,new E.e370(),C.iU,new E.e371(),C.eN,new E.e372(),C.Gs,new E.e373(),C.bE,new E.e374(),C.YD,new E.e375(),C.PX,new E.e376(),C.Jd,new E.e377(),C.pH,new E.e378(),C.Ve,new E.e379(),C.jM,new E.e380(),C.rd,new E.e381(),C.uX,new E.e382(),C.nt,new E.e383(),C.IT,new E.e384(),C.PM,new E.e385(),C.ks,new E.e386(),C.Om,new E.e387(),C.iC,new E.e388(),C.Nv,new E.e389(),C.FZ,new E.e390(),C.TW,new E.e391(),C.ft,new E.e392(),C.mi,new E.e393(),C.zz,new E.e394(),C.dA,new E.e395(),C.kw,new E.e396(),C.nE,new E.e397(),C.zU,new E.e398(),C.OU,new E.e399(),C.RJ,new E.e400(),C.YE,new E.e401()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.al,C.Wz,C.il,C.k5,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.uC,P.EF([C.uO,C.KK],null,null),C.Wz,P.Fl(null,null),C.k5,P.EF([C.uO,C.JT,C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.b6,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.b6,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.b6,C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.nQ,"isPsuedoNull",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
-$.M6=[new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470()]
+$.M6=[new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485()]
 $.UG=!0
-F.E2()},"$0","rk",0,0,18],
+F.E2()},"$0","KU",0,0,17],
 em:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gYu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QA:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ln(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.FS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Cv:{
-"^":"Xs:13;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
-"^":"Xs:13;",
-$1:[function(a){return J.pP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
-"^":"Xs:13;",
-$1:[function(a){return a.gA3()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gA3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Or:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 YL:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqr()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqr()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
-"^":"Xs:13;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oa:{
-"^":"Xs:13;",
-$1:[function(a){return J.nG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
-"^":"Xs:13;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lbd:{
-"^":"Xs:13;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
-"^":"Xs:13;",
-$1:[function(a){return J.WT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.WT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
-"^":"Xs:13;",
-$1:[function(a){return a.gCs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 edy:{
-"^":"Xs:13;",
-$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
-"^":"Xs:13;",
-$1:[function(a){return J.n9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.n9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
-"^":"Xs:13;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 YLa:{
-"^":"Xs:13;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
-"^":"Xs:13;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
-"^":"Xs:13;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
-"^":"Xs:13;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
-"^":"Xs:13;",
-$1:[function(a){return J.Uf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
-"^":"Xs:13;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e3:{
-"^":"Xs:13;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e4:{
-"^":"Xs:13;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
-"^":"Xs:13;",
-$1:[function(a){return J.on(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.on(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
-"^":"Xs:13;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e7:{
-"^":"Xs:13;",
-$1:[function(a){return J.SM(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.SM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e8:{
-"^":"Xs:13;",
-$1:[function(a){return a.goH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.goH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
-"^":"Xs:13;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
-"^":"Xs:13;",
-$1:[function(a){return J.ev(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ev(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
-"^":"Xs:13;",
-$1:[function(a){return J.xe(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.xe(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e12:{
-"^":"Xs:13;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e13:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
-"^":"Xs:13;",
-$1:[function(a){return a.gl()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e15:{
-"^":"Xs:13;",
-$1:[function(a){return J.h6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.h6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e16:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e17:{
-"^":"Xs:13;",
-$1:[function(a){return J.P3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Cg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
-"^":"Xs:13;",
-$1:[function(a){return J.W3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
-"^":"Xs:13;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e20:{
-"^":"Xs:13;",
-$1:[function(a){return a.gP9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e21:{
-"^":"Xs:13;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
-"^":"Xs:13;",
-$1:[function(a){return J.mP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e23:{
-"^":"Xs:13;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e24:{
-"^":"Xs:13;",
-$1:[function(a){return J.vi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e25:{
-"^":"Xs:13;",
-$1:[function(a){return J.nq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e26:{
-"^":"Xs:13;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
-"^":"Xs:13;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
-"^":"Xs:13;",
-$1:[function(a){return J.lk(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e29:{
-"^":"Xs:13;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e30:{
-"^":"Xs:13;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
-"^":"Xs:13;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
-"^":"Xs:13;",
-$1:[function(a){return J.is(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
-"^":"Xs:13;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e34:{
-"^":"Xs:13;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e36:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ky(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ky(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
-"^":"Xs:13;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
-"^":"Xs:13;",
-$1:[function(a){return J.kE(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e39:{
-"^":"Xs:13;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e40:{
-"^":"Xs:13;",
-$1:[function(a){return J.Mz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Mz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e41:{
-"^":"Xs:13;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e42:{
-"^":"Xs:13;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
-"^":"Xs:13;",
-$1:[function(a){return J.yn(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
-"^":"Xs:13;",
-$1:[function(a){return a.gx5()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e46:{
-"^":"Xs:13;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e47:{
-"^":"Xs:13;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e48:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
-"^":"Xs:13;",
-$1:[function(a){return J.ra(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e50:{
-"^":"Xs:13;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
-"^":"Xs:13;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
-"^":"Xs:13;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e54:{
-"^":"Xs:13;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
-"^":"Xs:13;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
-"^":"Xs:13;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e58:{
-"^":"Xs:13;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
-"^":"Xs:13;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
-"^":"Xs:13;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
-"^":"Xs:13;",
-$1:[function(a){return a.gJz()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
-"^":"Xs:13;",
-$1:[function(a){return J.PY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e63:{
-"^":"Xs:13;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e64:{
-"^":"Xs:13;",
-$1:[function(a){return J.m8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e65:{
-"^":"Xs:13;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
-"^":"Xs:13;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
-"^":"Xs:13;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
-"^":"Xs:13;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e69:{
-"^":"Xs:13;",
-$1:[function(a){return J.MB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e70:{
-"^":"Xs:13;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e71:{
-"^":"Xs:13;",
-$1:[function(a){return J.DB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGf()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e74:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
-"^":"Xs:13;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e76:{
-"^":"Xs:13;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e77:{
-"^":"Xs:13;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e78:{
-"^":"Xs:13;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e79:{
-"^":"Xs:13;",
-$1:[function(a){return a.gu9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
-"^":"Xs:13;",
-$1:[function(a){return J.aW(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
-"^":"Xs:13;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.z4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e82:{
-"^":"Xs:13;",
-$1:[function(a){return a.gL4()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e83:{
-"^":"Xs:13;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e84:{
-"^":"Xs:13;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
-"^":"Xs:13;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e86:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e87:{
-"^":"Xs:13;",
-$1:[function(a){return J.AR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e88:{
-"^":"Xs:13;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
-"^":"Xs:13;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e90:{
-"^":"Xs:13;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e91:{
-"^":"Xs:13;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e92:{
-"^":"Xs:13;",
-$1:[function(a){return J.UU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e93:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e95:{
-"^":"Xs:13;",
-$1:[function(a){return J.Xi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e96:{
-"^":"Xs:13;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e97:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.RM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e98:{
-"^":"Xs:13;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e99:{
-"^":"Xs:13;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e100:{
-"^":"Xs:13;",
-$1:[function(a){return a.gni()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
-"^":"Xs:13;",
-$1:[function(a){return J.wz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gni()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
-"^":"Xs:13;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e104:{
-"^":"Xs:13;",
-$1:[function(a){return J.ls(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.wz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e105:{
-"^":"Xs:13;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e106:{
-"^":"Xs:13;",
-$1:[function(a){return J.iy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e107:{
-"^":"Xs:13;",
-$1:[function(a){return J.SZ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e108:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e109:{
-"^":"Xs:13;",
-$1:[function(a){return J.DR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.k9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e110:{
-"^":"Xs:13;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e111:{
-"^":"Xs:13;",
-$1:[function(a){return J.cU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
-"^":"Xs:13;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e113:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYG()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e114:{
-"^":"Xs:13;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
-"^":"Xs:13;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
-"^":"Xs:13;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e117:{
-"^":"Xs:13;",
-$1:[function(a){return J.j0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
-"^":"Xs:13;",
-$1:[function(a){return J.ZN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Bo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e119:{
-"^":"Xs:13;",
-$1:[function(a){return J.fD(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e120:{
-"^":"Xs:13;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e121:{
-"^":"Xs:13;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
-"^":"Xs:13;",
-$1:[function(a){return a.giR()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fD(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e124:{
-"^":"Xs:13;",
-$1:[function(a){return J.A6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e125:{
-"^":"Xs:13;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e126:{
-"^":"Xs:13;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
-"^":"Xs:13;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e128:{
-"^":"Xs:13;",
-$1:[function(a){return J.uY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e129:{
-"^":"Xs:13;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e130:{
-"^":"Xs:13;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e131:{
-"^":"Xs:13;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e132:{
-"^":"Xs:13;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e133:{
-"^":"Xs:13;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e134:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e135:{
-"^":"Xs:13;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e136:{
-"^":"Xs:13;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e137:{
-"^":"Xs:13;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e138:{
-"^":"Xs:13;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
-"^":"Xs:13;",
-$1:[function(a){return J.fy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e141:{
-"^":"Xs:13;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e143:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMN()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
-"^":"Xs:13;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e145:{
-"^":"Xs:13;",
-$1:[function(a){return a.gmd()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
-"^":"Xs:13;",
-$1:[function(a){return a.geH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
-"^":"Xs:13;",
-$1:[function(a){return J.yc(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e148:{
-"^":"Xs:13;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e150:{
-"^":"Xs:13;",
-$1:[function(a){return J.ih(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e151:{
-"^":"Xs:13;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
-"^":"Xs:13;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
-"^":"Xs:13;",
-$1:[function(a){return J.Lh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
-"^":"Xs:13;",
-$1:[function(a){return J.rK(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e155:{
-"^":"Xs:13;",
-$1:[function(a){return J.O6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e156:{
-"^":"Xs:13;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e157:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.rK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e158:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e159:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e160:{
-"^":"Xs:13;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e161:{
-"^":"Xs:13;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e162:{
-"^":"Xs:13;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e163:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
-"^":"Xs:13;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e165:{
-"^":"Xs:13;",
-$1:[function(a){return J.ee(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
-"^":"Xs:13;",
-$1:[function(a){return J.JG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e167:{
-"^":"Xs:13;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
-"^":"Xs:13;",
-$1:[function(a){return J.z1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
-"^":"Xs:13;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
-"^":"Xs:13;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e171:{
-"^":"Xs:13;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e172:{
-"^":"Xs:13;",
-$1:[function(a){return a.gcD()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
-"^":"Xs:13;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
-"^":"Xs:13;",
-$1:[function(a){return J.tC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e175:{
-"^":"Xs:13;",
-$1:[function(a){return J.PB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e176:{
-"^":"Xs:13;",
-$1:[function(a){return J.xd(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
-"^":"Xs:13;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e178:{
-"^":"Xs:13;",
-$1:[function(a){return J.Qa(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
-"^":"Xs:13;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
-"^":"Xs:13;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e181:{
-"^":"Xs:13;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e182:{
-"^":"Xs:13;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e184:{
-"^":"Xs:13;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e185:{
-"^":"Xs:13;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e186:{
-"^":"Xs:13;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e187:{
-"^":"Xs:13;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
-"^":"Xs:13;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e189:{
-"^":"Xs:13;",
-$1:[function(a){return J.jY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
-"^":"Xs:13;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Bq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e191:{
-"^":"Xs:13;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e192:{
-"^":"Xs:13;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e193:{
-"^":"Xs:13;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e194:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e195:{
-"^":"Xs:13;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e196:{
-"^":"Xs:13;",
-$1:[function(a){return J.k7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e197:{
-"^":"Xs:13;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e198:{
-"^":"Xs:13;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e199:{
-"^":"Xs:13;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e200:{
-"^":"Xs:13;",
-$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.k7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
-"^":"Xs:13;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
-"^":"Xs:13;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e204:{
-"^":"Xs:13;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e205:{
-"^":"Xs:13;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
-"^":"Xs:13;",
-$1:[function(a){return a.gA6()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
-"^":"Xs:13;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
-"^":"Xs:13;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e209:{
-"^":"Xs:13;",
-$1:[function(a){return J.o9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e210:{
-"^":"Xs:13;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e212:{
-"^":"Xs:13;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e213:{
-"^":"Xs:13;",
-$1:[function(a){return J.NB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.KL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e215:{
-"^":"Xs:13;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e216:{
-"^":"Xs:13;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e217:{
-"^":"Xs:13;",
-$1:[function(a){return a.gV8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
-"^":"Xs:13;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
-"^":"Xs:13;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.y1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e220:{
-"^":"Xs:13;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
-"^":"Xs:13;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e222:{
-"^":"Xs:13;",
-$1:[function(a){return J.jx(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e223:{
-"^":"Xs:13;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e224:{
-"^":"Xs:13;",
-$1:[function(a){return J.C7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e225:{
-"^":"Xs:13;",
-$1:[function(a){return J.vI(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e226:{
-"^":"Xs:13;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
-"^":"Xs:13;",
-$1:[function(a){return a.gS5()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
-"^":"Xs:13;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
-"^":"Xs:13;",
-$1:[function(a){return a.guj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
-"^":"Xs:13;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
-"^":"Xs:13;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
-"^":"Xs:13;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.C7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e233:{
-"^":"Xs:13;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
-"^":"Xs:13;",
-$1:[function(a){return J.dY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
-"^":"Xs:13;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
-"^":"Xs:13;",
-$1:[function(a){return J.zB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
-"^":"Xs:13;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e238:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e242:{
-"^":"Xs:13;",
-$1:[function(a){return J.Rg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e243:{
-"^":"Xs:13;",
-$1:[function(a){return J.d5(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
-"^":"Xs:13;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
-"^":"Xs:13;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
-"^":"Xs:13;",
-$1:[function(a){return J.cs(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
-"^":"Xs:13;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
-"^":"Xs:13;",
-$1:[function(a){return J.K2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
-"^":"Xs:13;",
-$1:[function(a){return J.r8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
-"^":"Xs:13;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e252:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEy()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
-"^":"Xs:13;",
-$1:[function(a){return J.XJ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
-"^":"Xs:13;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e255:{
-"^":"Xs:13;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e256:{
-"^":"Xs:13;",
-$1:[function(a){return a.gJk()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e257:{
-"^":"Xs:13;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
-"^":"Xs:13;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
-"^":"Xs:13;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
-"^":"Xs:13;",
-$1:[function(a){return a.gXA()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.XJ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e262:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e263:{
-"^":"Xs:13;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e264:{
-"^":"Xs:13;",
-$1:[function(a){return J.I2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gJk()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
-"^":"Xs:13;",
-$1:[function(a){return a.gTX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e266:{
-"^":"Xs:13;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
-"^":"Xs:13;",
-$1:[function(a){return a.gV0()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e268:{
-"^":"Xs:80;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e269:{
-"^":"Xs:80;",
-$2:[function(a,b){J.L9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e270:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NV(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e271:{
-"^":"Xs:80;",
-$2:[function(a,b){J.l7(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e272:{
-"^":"Xs:80;",
-$2:[function(a,b){J.kB(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.I2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
-"^":"Xs:80;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e275:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e277:{
-"^":"Xs:80;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e278:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e279:{
-"^":"Xs:80;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e280:{
-"^":"Xs:80;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.kB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e281:{
-"^":"Xs:80;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e282:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e283:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e284:{
-"^":"Xs:80;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e285:{
-"^":"Xs:80;",
-$2:[function(a,b){J.LM(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e286:{
-"^":"Xs:80;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e287:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Iw(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e288:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e289:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e290:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e291:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e292:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e293:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xW(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e294:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e295:{
-"^":"Xs:80;",
-$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Iw(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e296:{
-"^":"Xs:80;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e297:{
-"^":"Xs:80;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e298:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e299:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e300:{
-"^":"Xs:80;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e301:{
-"^":"Xs:80;",
-$2:[function(a,b){J.OH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e302:{
-"^":"Xs:80;",
-$2:[function(a,b){J.uP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e303:{
-"^":"Xs:80;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e304:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e305:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e306:{
-"^":"Xs:80;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e307:{
-"^":"Xs:80;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e308:{
-"^":"Xs:80;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e309:{
-"^":"Xs:80;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e310:{
-"^":"Xs:80;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.OH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e311:{
-"^":"Xs:80;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e312:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e313:{
-"^":"Xs:80;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e314:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e315:{
-"^":"Xs:80;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e316:{
-"^":"Xs:80;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e317:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e318:{
-"^":"Xs:80;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
-"^":"Xs:80;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e320:{
-"^":"Xs:80;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e321:{
-"^":"Xs:80;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
-"^":"Xs:80;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e323:{
-"^":"Xs:80;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e324:{
-"^":"Xs:80;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e325:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e326:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e327:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e328:{
-"^":"Xs:80;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e329:{
-"^":"Xs:80;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e330:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e331:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e332:{
-"^":"Xs:80;",
-$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
-"^":"Xs:80;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e334:{
-"^":"Xs:80;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
-"^":"Xs:80;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e336:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e337:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e338:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
-"^":"Xs:80;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e340:{
-"^":"Xs:80;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e341:{
-"^":"Xs:80;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e342:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e343:{
-"^":"Xs:80;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e345:{
-"^":"Xs:80;",
-$2:[function(a,b){J.aw(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e346:{
-"^":"Xs:80;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e347:{
-"^":"Xs:80;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e348:{
-"^":"Xs:80;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e349:{
-"^":"Xs:80;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e350:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e351:{
-"^":"Xs:80;",
-$2:[function(a,b){J.AJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e352:{
-"^":"Xs:80;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e354:{
-"^":"Xs:80;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e355:{
-"^":"Xs:80;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e356:{
-"^":"Xs:80;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e357:{
-"^":"Xs:80;",
-$2:[function(a,b){J.iH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e358:{
-"^":"Xs:80;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e359:{
-"^":"Xs:80;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e360:{
-"^":"Xs:80;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e361:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e362:{
-"^":"Xs:80;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e363:{
-"^":"Xs:80;",
-$2:[function(a,b){J.jd(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e364:{
-"^":"Xs:80;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e365:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ZI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e366:{
-"^":"Xs:80;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e367:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e368:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.iH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e369:{
-"^":"Xs:80;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e370:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e371:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e372:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e373:{
-"^":"Xs:80;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e374:{
-"^":"Xs:80;",
-$2:[function(a,b){J.FH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e375:{
-"^":"Xs:80;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e377:{
-"^":"Xs:80;",
-$2:[function(a,b){a.suj(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e378:{
-"^":"Xs:80;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e379:{
-"^":"Xs:80;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e380:{
-"^":"Xs:80;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
-"^":"Xs:80;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e382:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e383:{
-"^":"Xs:80;",
-$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e384:{
-"^":"Xs:80;",
-$2:[function(a,b){J.CA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e385:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e386:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
-"^":"Xs:80;",
-$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
-"^":"Xs:80;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e389:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e390:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e391:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e392:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e394:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e395:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e396:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e397:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e398:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e399:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e400:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e401:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e402:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e447:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e448:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e449:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e450:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e451:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e452:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e453:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e454:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e455:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e456:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e457:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e458:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e459:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e460:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e461:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e462:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e463:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e464:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e465:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e466:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e467:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e468:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e469:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e470:{
-"^":"Xs:74;",
+"^":"Xs:76;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e471:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e472:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e473:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e474:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e475:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e476:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e477:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e478:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e479:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e480:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e481:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e482:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e483:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e484:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e485:{
+"^":"Xs:76;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+$isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"pv;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjD:function(a){return a.BW},
 sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{Dw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.C8.ZL(a)
+a.n9=x
+a.wy=w
+C.C8.LX(a)
 C.C8.XI(a)
 return a}}},
-pv:{
+Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{rt:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{BB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.oq.ZL(a)
+a.n9=x
+a.wy=w
+C.oq.LX(a)
 C.oq.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
+return a}}}}],["","",,O,{
 "^":"",
 CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
+"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+Pz:function(a){var z,y,x,w,v,u,t
 z=this.ks
 if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!0)continue
+for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
 t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
@@ -4679,19 +4687,19 @@
 if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
 u.$builtinTypeInfo=[null]
 t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-o8:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
+cO:function(){},
+Nh:function(){return this.Ru.gLT().XH.length>0}},
 eo:{
-"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.kf(z,null,null)
+a.Hm=new G.ih(z,null,null)
 z=a.CA
-if(z!=null)this.hP(a,z.gmq())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,13,57],
+if(z!=null)this.hP(a,z.gDZ())},
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4706,120 +4714,120 @@
 s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.mA(z)}catch(q){w=H.Ru(q)
+a.Hm.G7(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.XO(q,null)
-N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+x=new H.oP(q,null)
+N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,102,103],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,102,103],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
+Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,104,1,105,106],
+x=new H.oP(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.fe.ZL(a)
-C.fe.XI(a)
+a.n9=x
+a.wy=w
+C.RD.LX(a)
+C.RD.XI(a)
 return a}}},
-Dsd:{
+tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
-"^":"Xs:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,107,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"^":"Xs:12;a",
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,108,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Vct;yB,R8,mN,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gWt:function(a){return a.nJ},
-sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
+gWt:function(a){return a.R8},
+sWt:function(a,b){a.R8=this.ct(a,C.yB,a.R8,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,108,109],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,110,111],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,110,112],
-SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
+zs:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
+pA:[function(a,b){a.R8=this.ct(a,C.yB,a.R8,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.yB).YM(b)},"$1","gWp",2,0,20,101],
+J.LE(a.yB).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.yB).wM(b)},"$1","gDX",2,0,19,102],
 static:{lW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ka.ZL(a)
+a.n9=x
+a.wy=w
+C.ka.LX(a)
 C.ka.XI(a)
 return a}}},
-tuj:{
+Vct:{
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,95,"call"],
+z.R8=J.Q5(z,C.yB,z.R8,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 SS:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,95,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtT:function(a){return a.tY},
-DZ:[function(a,b){Q.xI.prototype.DZ.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
-static:{On:function(a){var z,y,x,w
+Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
+static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.tWO.ZL(a)
+a.n9=x
+a.wy=w
+C.tWO.LX(a)
 C.tWO.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
@@ -4827,50 +4835,50 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,101],
-b0:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
+pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
+lE:function(a,b){var z,y,x
+z=J.Vs(b).dA.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},
-Gm:[function(a,b,c,d){var z=this.b0(a,d)
+YI:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,114,1,105,106],
-Lk:[function(a,b,c,d){var z=this.b0(a,d)
+J.pP(z).h(0,"highlight")},"$3","gVb",6,0,115,2,106,107],
+QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,114,1,105,106],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,115,2,106,107],
 static:{fm:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ux.ZL(a)
+a.n9=x
+a.wy=w
+C.ux.LX(a)
 C.ux.XI(a)
 return a}}},
-Vct:{
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"Xs:115;",
+"^":"Xs:116;",
 $1:[function(a){a.OF()},"$1",null,2,0,null,85,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
+$isEH:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 goE:function(a){return a.tH},
 soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
-gv8:function(a){return a.uo},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
+gO9:function(a){return a.uo},
+sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
@@ -4878,15 +4886,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,20,57],
-Db:[function(a){var z=a.tH
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
+Ey:[function(a){var z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,46,47,85],
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4897,76 +4905,20 @@
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.O0.ZL(a)
+a.n9=x
+a.wy=w
+C.O0.LX(a)
 C.O0.XI(a)
 return a}}},
 SaM:{
 "^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
+$isd3:true}}],["","",,H,{
 "^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},
-CkK:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},
-n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-Wt:function(a,b){var z,y,x,w,v
-z=[]
-y=a.length
-for(x=y,w=0;w<y;++w){if(w>=x)return H.e(a,w)
-v=a[w]
-if(b.$1(v)!==!0)z.push(v)
-x=a.length
-if(y!==x)throw H.b(P.a4(a))}x=z.length
-if(x===y)return
-C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},
-Sz:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
-if(b.$1(y)===!0)return y}throw H.b(H.DU())},
-rd:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},
-xF: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
-H.xF(a,b,c)
-z=J.Hn(c,b)
-if(J.xC(z,0))return
-if(J.u6(e,0))throw H.b(P.u(e))
-y=J.x(d)
-if(!!y.$isWO){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(H.ar())
-H.tb(w,x,a,b,z)},
-IC:function(a,b,c){var z,y,x,w
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},
-na: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.mY(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},
 DU:function(){return new P.lj("No element")},
 ar:function(){return new P.lj("Too few elements")},
 tb:function(a,b,c,d,e){var z,y,x,w,v
@@ -4989,15 +4941,15 @@
 w9:function(a,b,c,d){var z,y,x,w,v
 for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
 w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
 v=w-1
 y.u(a,w,y.t(a,v))
 w=v}y.u(a,w,x)}},
 ZD:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-z=C.jn.cU(c-b+1,6)
+z=C.jn.BU(c-b+1,6)
 y=b+z
 x=c-z
-w=C.jn.cU(b+c,2)
+w=C.jn.BU(b+c,2)
 v=w-z
 u=w+z
 t=J.U6(a)
@@ -5006,23 +4958,23 @@
 q=t.t(a,w)
 p=t.t(a,u)
 o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
+if(J.xZ(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
+s=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
+p=n}if(J.xZ(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
+s=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
+r=n}if(J.xZ(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
+s=n}if(J.xZ(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
+q=n}if(J.xZ(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
+r=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(p,o),0)){n=o
+r=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
 p=n}t.u(a,y,s)
 t.u(a,w,q)
@@ -5051,7 +5003,7 @@
 l=g
 break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
 if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(a,l),p),0)){--l
+t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
 if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
@@ -5087,7 +5039,7 @@
 l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
 aL:{
 "^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
+gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.W8(this,"aL",0)])},
 aN:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5097,7 +5049,7 @@
 gl0:function(a){return J.xC(this.gB(this),0)},
 grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,J.Hn(this.gB(this),1))},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
@@ -5118,17 +5070,17 @@
 w=P.p9(x)
 if(typeof z!=="number")return H.s(z)
 v=1
-for(;v<z;++v){w.vM+=b
+for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
+w.IN+=typeof u==="string"?u:H.d(u)
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
+w.IN+=typeof u==="string"?u:H.d(u)
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
 ad:function(a,b){return P.mW.prototype.ad.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.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5136,14 +5088,14 @@
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
 if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
-eR:function(a,b){return H.c1(this,b,null,null)},
+eR:function(a,b){return H.c1(this,b,null,H.W8(this,"aL",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(this,"aL",0)])
+if(b){z=H.VM([],[H.W8(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 y=Array(y)
 y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
+z=H.VM(y,[H.W8(this,"aL",0)])}x=0
 while(!0){y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 if(!(x<y))break
@@ -5152,7 +5104,7 @@
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.ip(this,"aL",0))
+z=P.Ls(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5160,186 +5112,262 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-if(y==null||J.z8(y,z))return z
+"^":"aL;Hb,ay,Hx",
+gUD:function(){var z,y
+z=J.q8(this.Hb)
+y=this.Hx
+if(y==null||J.xZ(y,z))return z
 return y},
-gjX:function(){var z,y
-z=J.q8(this.l6)
-y=this.SH
-if(J.z8(y,z))return z
+gdM:function(){var z,y
+z=J.q8(this.Hb)
+y=this.ay
+if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
-z=J.q8(this.l6)
-y=this.SH
+z=J.q8(this.Hb)
+y=this.ay
 if(J.J5(y,z))return 0
-x=this.AN
+x=this.Hx
 if(x==null||J.J5(x,z))return J.Hn(z,y)
 return J.Hn(x,y)},
-Zv:function(a,b){var z=J.WB(this.gjX(),b)
-if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i9(this.l6,z)},
-eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.c1(this.l6,J.WB(this.SH,b),this.AN,null)},
+Zv:function(a,b){var z=J.WB(this.gdM(),b)
+if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
+return J.i9(this.Hb,z)},
+eR:function(a,b){var z,y
+if(J.u6(b,0))throw H.b(P.N(b))
+z=J.WB(this.ay,b)
+y=this.Hx
+if(y!=null&&J.J5(z,y)){y=new H.MB()
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
 rh:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
-z=this.AN
-y=this.SH
-if(z==null)return H.c1(this.l6,y,J.WB(y,b),null)
+z=this.Hx
+y=this.ay
+if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.c1(this.l6,y,x,null)}},
+return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.SH
+z=this.ay
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
+x=this.Hx
 if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
 if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
 static:{c1:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
+"^":"a;Hb,bd,QX,Ff",
+gl:function(){return this.Ff},
 G:function(){var z,y,x,w
-z=this.l6
+z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
+if(!J.xC(this.bd,x))throw H.b(P.a4(z))
+w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
+if(w>=x){this.Ff=null
+return!1}this.Ff=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
+"^":"mW;Hb,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+gA:function(a){var z=new H.MH(null,J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.uY(this.l6))},
+gB:function(a){return J.q8(this.Hb)},
+gl0:function(a){return J.FN(this.Hb)},
+grZ:function(a){return this.Mi(J.uY(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{fR:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
-"^":"i1;l6,T6",
+"^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Dk;lo,OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){var z=this.OI
-if(z.G()){this.lo=this.mb(z.gl())
-return!0}this.lo=null
+"^":"Anv;Ff,CL,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+G:function(){var z=this.CL
+if(z.G()){this.Ff=this.Mi(z.gl())
+return!0}this.Ff=null
 return!1},
-gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
+gl:function(){return this.Ff},
+$asAnv:function(a,b){return[b]}},
 A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
+"^":"aL;ON,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+gB:function(a){return J.q8(this.ON)},
+Zv:function(a,b){return this.Mi(J.i9(this.ON,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
+"^":"mW;Hb,Oh",
+gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
-"^":"Dk;OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
+vG:{
+"^":"Anv;CL,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
-gl:function(){return this.OI.gl()}},
+gl:function(){return this.CL.gl()}},
 oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Dd(J.mY(this.l6),this.T6,C.MS,null)
+"^":"mW;Hb,Oh",
+gA:function(a){var z=new H.H1(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-Dd:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
+H1:{
+"^":"a;CL,Oh,Br,Ff",
+Mi:function(a){return this.Oh.$1(a)},
+gl:function(){return this.Ff},
 G:function(){var z,y
-z=this.e0
+z=this.Br
 if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
+for(y=this.CL;!z.G();){this.Ff=null
+if(y.G()){this.Br=null
+z=J.mY(this.Mi(y.gl()))
+this.Br=z}else return!1}this.Ff=this.Br.gl()
 return!0}},
 AM:{
-"^":"mW;l6,FT",
+"^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.l6,this.FT+b,H.u3(this,0))},
-gA:function(a){var z=this.l6
-z=new H.ig(z.gA(z),this.FT)
+return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
+gA:function(a){var z=this.Hb
+z=new H.b2(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-jb:function(a,b,c){if(this.FT<0)throw H.b(P.KP(this.FT))},
+jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
 static:{ke:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.wb(a,b,c)},wb:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
-"^":"AM;l6,FT",
+"^":"AM;Hb,u3",
 gB:function(a){var z,y
-z=this.l6
-y=J.Hn(z.gB(z),this.FT)
+z=this.Hb
+y=J.Hn(z.gB(z),this.u3)
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-ig:{
-"^":"Dk;OI,FT",
+b2:{
+"^":"Anv;CL,u3",
 G:function(){var z,y
-for(z=this.OI,y=0;y<this.FT;++y)z.G()
-this.FT=0
+for(z=this.CL,y=0;y<this.u3;++y)z.G()
+this.u3=0
 return z.G()},
-gl:function(){return this.OI.gl()}},
+gl:function(){return this.CL.gl()}},
+MB:{
+"^":"mW;",
+gA:function(a){return C.MS},
+aN:function(a,b){},
+gl0:function(a){return!0},
+gB:function(a){return 0},
+grZ:function(a){throw H.b(H.DU())},
+tg:function(a,b){return!1},
+Vr:function(a,b){return!1},
+zV:function(a,b){return""},
+ad:function(a,b){return this},
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+eR:function(a,b){if(b<0)throw H.b(P.N(b))
+return this},
+tt:function(a,b){var z
+if(b)z=H.VM([],[H.u3(this,0)])
+else{z=Array(0)
+z.fixed$length=init
+z=H.VM(z,[H.u3(this,0)])}return z},
+br:function(a){return this.tt(a,!0)},
+zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+$isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
+wb:{
+"^":"a;",
+static:{bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},CkK:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
+return!1},n3:function(a,b,c){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
+return b},Wt:function(a,b){var z,y,x,w,v
+z=[]
+y=a.length
+for(x=y,w=0;w<y;++w){if(w>=x)return H.e(a,w)
+v=a[w]
+if(b.$1(v)!==!0)z.push(v)
+x=a.length
+if(y!==x)throw H.b(P.a4(a))}x=z.length
+if(x===y)return
+C.Nm.sB(a,x)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},xF: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
+H.xF(a,b,c)
+z=J.Hn(c,b)
+if(J.xC(z,0))return
+if(J.u6(e,0))throw H.b(P.u(e))
+y=J.x(d)
+if(!!y.$isWO){x=e
+w=d}else{w=y.eR(d,e).tt(0,!1)
+x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
+H.tb(w,x,a,b,z)},IC:function(a,b,c){var z,y,x,w
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+z=J.x(c)
+if(!z.$isyN)c=z.tt(c,!1)
+z=J.U6(c)
+y=z.gB(c)
+x=a.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(a,x+y)
+x=a.length
+if(!!a.immutable$list)H.vh(P.f("set range"))
+H.qG(a,b+y,x,a,b)
+for(z=z.gA(c);z.G();b=w){w=b+1
+C.Nm.u(a,b,z.gl())}},h8: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.mY(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}}}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
+oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
 JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 Jd:function(a){return this.GT(a,null)},
 V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
 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"))},
+oq:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5353,42 +5381,48 @@
 $isQV:true,
 $asQV:null},
 iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
+"^":"aL;ON",
+gB:function(a){return J.q8(this.ON)},
 Zv:function(a,b){var z,y,x
-z=this.CR
+z=this.ON
 y=J.U6(z)
 x=y.gB(z)
 if(typeof b!=="number")return H.s(b)
 return y.Zv(z,x-1-b)}},
 tx:{
-"^":"a;fN>",
+"^":"a;OB>",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$istx&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
+return!!J.x(b).$istx&&J.xC(this.OB,b.OB)},
+giO:function(a){var z=J.v1(this.OB)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
+bu:[function(a){return"Symbol(\""+H.d(this.OB)+"\")"},"$0","gCR",0,0,76],
 $istx:true,
 $isIN:true,
-static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
+static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["","",,H,{
 "^":"",
 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}}],["dart.async","dart:async",,P,{
+return z}}],["","",,P,{
 "^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
-return P.K7()},
-ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
+xg:function(){var z,y,x
+z={}
+if(self.scheduleImmediate!=null)return P.vd()
+if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
+x=self.document.createElement("span")
+z.a=null
+new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
+return new P.ha(z,y,x)}return P.K7()},
+ZV:[function(a){++init.globalState.Xz.kv
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
+Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
 VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
+z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
-else return b.wY(a)},
+else return b.cR(a)},
 BV:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
+P.cH(C.ny,new P.w4(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5397,8 +5431,8 @@
 z.c=0
 z.d=null
 z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+y=new P.j7(z,b)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.dn,null)
 w=Array(y)
@@ -5408,28 +5442,19 @@
 v=H.VM(new P.Zf(P.Dt(y)),[y])
 z.a=v
 return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.yK())
-$.S6=$.S6.gaw()
-throw z}},"$0","yK",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.yK())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-ji:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+Cx:function(){var z,y
+for(;z=$.S6,z!=null;){$.mg=null
+y=z.gaw()
+$.S6=y
+if(y==null)$.k8=null
+J.cG(z)}},
+BG:[function(){$.v5=!0
+try{P.Cx()}finally{$.mg=null
+$.v5=!1
+if($.S6!=null)$.ej().$1(P.yK())}},"$0","yK",0,0,17],
+rb:function(a){var z=$.X3
+if(C.NU===z){P.Tk(null,null,C.NU,a)
+return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5442,89 +5467,144 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","bW",2,0,20,21],
-Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,22,23,24,25],
-dL:[function(){},"$0","v3",0,0,18],
+QEz:[function(a){},"$1","yy",2,0,19,20],
+Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
+dL:[function(){},"$0","v3",0,0,17],
 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)
+y=new H.oP(x,null)
 c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.YM(new P.dR(b,c,d))
-else b.K5(c,d)},
+NX:function(a,b,c,d){var z=a.Gv()
+if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
+else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.YM(new P.QX(b,c))
-else b.rX(c)},
-rT:function(a,b){var z
+Bb:function(a,b,c){var z=a.Gv()
+if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
+else b.In(c)},
+cH:function(a,b){var z
 if(J.xC($.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()
+YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
+dp:function(a,b){var z=a.gVs()
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
+Cw:function(a){if(a.geT(a)==null)return
+return a.geT(a).gyL()},
+CK:[function(a,b,c,d,e){var z,y,x
+z=new P.OM(new P.FO(d,e),null)
+y=$.S6
+if(y==null){$.mg=z
+$.k8=z
+$.S6=z
+if(!$.v5)$.ej().$1(P.yK())}else{x=$.mg
+if(x==null){z.aw=y
+$.mg=z
+$.S6=z}else{z.aw=x.aw
+x.aw=z
+$.mg=z
+if(z.aw==null)$.k8=z}}},"$5","wLZ",10,0,25,26,27,28,23,24],
 Ki:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","r6",8,0,30,27,28,29,31],
+return y}finally{$.X3=z}},"$4","qKH",8,0,29,26,27,28,30],
 V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","tz",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-WN:[function(a,b,c,d){return d},"$4","L8",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","Lm",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","oQ",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-E1:[function(a,b,c,d,e){var z
+return y}finally{$.X3=z}},"$6","tz",12,0,33,26,27,28,30,8,9],
+EeK:[function(a,b,c,d){return d},"$4","qJ6",8,0,34,26,27,28,30],
+cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
+bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
+Tk:[function(a,b,c,d){var z,y
+if(C.NU!==c)d=c.ce(d)
+if($.S6==null){z=new P.OM(d,null)
+$.k8=z
+$.S6=z
+if(!$.v5)$.ej().$1(P.yK())}else{y=new P.OM(d,null)
+$.k8.aw=y
+$.k8=y}},"$4","G2",8,0,37,26,27,28,30],
+h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
+Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.Af(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Oj",10,0,44],
+if(d==null)d=C.Kk
+else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
+else{z=P.YM(null,null,null,null,null)
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.bC(c,d,z)
+return y},"$5","OjX",10,0,45,26,27,28,46,47],
+th:{
+"^":"Xs:12;a",
+$1:[function(a){var z,y
+H.cv()
+z=this.a
+y=z.a
+z.a=null
+y.$0()},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+ha:{
+"^":"Xs:117;a,b,c",
+$1:function(a){var z,y;++init.globalState.Xz.kv
+this.a.a=a
+z=this.b
+y=this.c
+z.firstChild?z.removeChild(y):z.appendChild(y)},
+$isEH:true},
 C6:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
 $isXS:true},
+O6:{
+"^":"Ca;kc,I4",
+bu:[function(a){var z,y
+z="Uncaught Error: "+H.d(this.kc)
+y=this.I4
+return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,73],
+static:{Yq:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
+if(!!J.x(a).$isXS)return a.gI4()
+return}}},
 Ik:{
-"^":"u2;ly"},
+"^":"u2;BT"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,ly,pN,o7,Bd,Lj,Gv,lz,Ri",
-gly:function(){return this.ly},
-uR:function(a){var z=this.Ae
+"^":"yU4;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
+gBT:function(){return this.BT},
+uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&1)===a},
-Ac:function(){var z=this.Ae
+fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
+this.ru=z^1},
+gh0:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-dK:function(){var z=this.Ae
+Pa:function(){var z=this.ru
 if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
+this.ru=z|4},
+gKH:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+jy:[function(){},"$0","gb9",0,0,17],
+ie:[function(){},"$0","gxl",0,0,17],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
@@ -5532,26 +5612,28 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
-SL:function(){var z=this.yx
+WH:function(){var z=this.Kj
 if(z!=null)return z
 z=P.Dt(null)
-this.yx=z
+this.Kj=z
 return z},
-p1:function(a){var z,y
+pW:function(a){var z,y
 z=a.gSJ()
 y=a.giE()
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.v3())
+MI:function(a,b,c,d){var z,y,x
+if((this.YM&4)!==0){if(c==null)c=P.v3()
+z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
+z.q1()
 return z}z=$.X3
-y=a?1:0
+y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
+x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5559,107 +5641,107 @@
 x.iE=this
 y.siE(x)
 this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
+x.ru=this.YM&1
+if(this.iE===x)P.ot(this.Ld)
 return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
+rR:function(a){if(a.giE()===a)return
+if(a.gh0())a.Pa()
+else{this.pW(a)
+if((this.YM&2)===0&&this.iE===this)this.hg()}return},
+Pm:function(a){},
+Bu:function(a){},
+Pq:function(){if((this.YM&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,null,116],
+h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
+this.MW(b)},"$1","ght",2,0,null,118],
 xO:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.SL()
-this.SY()
+z=this.YM
+if((z&4)!==0)return this.Kj
+if(z>=4)throw H.b(this.Pq())
+this.YM=z|4
+y=this.WH()
+this.PS()
 return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-Qj:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-Qz:function(a){var z,y,x,w
-z=this.Gv
+Rg:function(a,b){this.MW(b)},
+MR:function(a,b){this.y7(a,b)},
+AN:function(){var z=this.Hz
+this.Hz=null
+this.YM&=4294967287
+C.jN.dS(z)},
+HI:function(a){var z,y,x,w
+z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
 y=this.iE
 if(y===this)return
 x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
+this.YM=z^3
+for(;y!==this;)if(y.uO(x)){z=y.gru()
 if(typeof z!=="number")return z.k()
-y.sAe(z|2)
+y.sru(z|2)
 a.$1(y)
-y.Ac()
+y.fc()
 w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
+if(y.gKH())this.pW(y)
+z=y.gru()
 if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
+y.sru(z&4294967293)
 y=w}else y=y.giE()
-this.Gv&=4294967293
-if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.QC)}},
+this.YM&=4294967293
+if(this.iE===this)this.hg()},
+hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
+P.ot(this.Ro)}},
 zW:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z=this.iE
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+MW:function(a){var z=this.iE
 if(z===this)return
-if(z.giE()===this){this.Gv|=2
+if(z.giE()===this){this.YM|=2
 this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.Qz(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.Qz(new P.OR(this,a,b))},
-SY:function(){if(this.iE!==this)this.Qz(new P.Bg(this))
-else this.yx.OH(null)}},
+this.YM&=4294967293
+if(this.iE===this)this.hg()
+return}this.HI(new P.tK(this,a))},
+y7:function(a,b){if(this.iE===this)return
+this.HI(new P.OR(this,a,b))},
+PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+else this.Kj.Xf(null)}},
 tK:{
 "^":"Xs;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"Xs;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
+$1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"Xs;a",
-$1:function(a){a.Qj()},
+$1:function(a){a.AN()},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z,y
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+MW:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.Dn(a,b,null))},
-SY:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
+z.C2(y)}},
+y7:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
+PS:function(){var z=this.iE
+if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
+else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){var z,y,x,w
-try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
+try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
+y=new H.oP(x,null)
+this.b.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-mQ:{
-"^":"Xs:80;a,b",
+j7:{
+"^":"Xs:81;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5667,10 +5749,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,117,118,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,119,120,"call"],
 $isEH:true},
 Tw:{
-"^":"Xs:119;a,c,d",
+"^":"Xs:121;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5679,209 +5761,213 @@
 if(w<0||w>=x.length)return H.e(x,w)
 x[w]=a
 if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,120,23,21],
+if(z.YM!==0)throw H.b(P.w("Future already completed"))
+z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,122,22,20],
 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,121,23,24,25]},
+if(z.YM!==0)throw H.b(P.w("Future already completed"))
+z.Nk(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,123,22,23,24]},
 Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
-gcg:function(){return this.Gv>=4},
-gWj:function(){return this.Gv===4},
-gNm:function(){return this.Gv===8},
-swG:function(a){if(a)this.Gv=2
-else this.Gv=0},
-gO1:function(){return this.Gv===2?null:this.OY},
-gyK:function(){return this.Gv===2?null:this.As},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
+"^":"a;YM,t9<,O1,nV@,bH?,kO?,bv?,Nw?",
+gnr:function(){return this.YM>=4},
+ga5:function(){return this.YM===4},
+gAT:function(){return this.YM===8},
+sKl:function(a){if(a)this.YM=2
+else this.YM=0},
+gdU:function(){return this.YM===2?null:this.bH},
+gp6:function(){return this.YM===2?null:this.kO},
+gTv:function(){return this.YM===2?null:this.bv},
+gco:function(){return this.YM===2?null:this.Nw},
 Rx:function(a,b){var z,y
 z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
-this.au(y)
+y=H.VM(new P.Gc(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
+this.xf(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
-co:function(a,b){var z,y,x
+pU:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.wY(b),y,null),[null])
-this.au(x)
+x=H.VM(new P.Gc(0,z,null,null,null,$.X3.cR(b),y,null),[null])
+this.xf(x)
 return x},
-OA:function(a){return this.co(a,null)},
-YM:function(a){var z,y
+OA:function(a){return this.pU(a,null)},
+wM:function(a){var z,y
 z=$.X3
 y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-this.au(y)
+this.xf(y)
 return y},
-gDL:function(){return this.jk},
-gcG:function(){return this.jk},
-Am:function(a){this.Gv=4
-this.jk=a},
-E6:function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},
-au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
-else{a.sBQ(this.jk)
-this.jk=a}},
-L3:function(){var z,y,x
-z=this.jk
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
+gDL:function(){return this.O1},
+gSt:function(){return this.O1},
+vd:function(a){this.YM=4
+this.O1=a},
+Is:function(a,b){this.YM=8
+this.O1=new P.Ca(a,b)},
+xf:function(a){if(this.YM>=4)this.t9.wr(new P.da(this,a))
+else{a.snV(this.O1)
+this.O1=a}},
+ah:function(){var z,y,x
+z=this.O1
+this.O1=null
+for(y=null;z!=null;y=z,z=x){x=z.gnV()
+z.snV(y)}return y},
+In:function(a){var z,y
 z=J.x(a)
 if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
 else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
+else{y=this.ah()
+this.vd(a)
 P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-this.Am(a)
+X2:function(a){var z=this.ah()
+this.vd(a)
 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,22,23,24,25],
-OH:function(a){var z
+ZL:[function(a,b){var z=this.ah()
+this.Is(a,b)
+P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,21,22,23,24],
+Xf:function(a){var z
 if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.eX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},
-X8:function(a,b,c){this.CG(a,b)},
-J9:function(a,b){this.OH(a)},
+if(!!z.$isb8){if(!!z.$isGc){z=a.YM
+if(z>=4&&z===8){if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.eX(this,a))},
+Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.ZL(this,a,b))},
+X8:function(a,b,c){this.Nk(a,b)},
+J9:function(a,b){this.Xf(a)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,dh",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(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.U7(b),new P.VL(b))},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
-do{z=b.gBQ()
-b.sBQ(null)
+return z},k3:function(a,b){b.sKl(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
+if(a.YM>=4)P.HZ(a,b)
+else a.xf(b)},yE:function(a,b){var z
+do{z=b.gnV()
+b.snV(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
 z={}
 z.e=a
 for(y=a;!0;){x={}
-if(!y.gcg())return
-w=z.e.gNm()
-if(w&&b==null){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
+if(!y.gnr())return
+w=z.e.gAT()
+if(w&&b==null){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())
 return}if(b==null)return
-if(b.gBQ()!=null){P.yE(z.e,b)
+if(b.gnV()!=null){P.yE(z.e,b)
 return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
+u=z.e.ga5()?z.e.gDL():null
 x.c=u
 x.d=!1
 y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
-if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
+if(!y||b.gdU()!=null||b.gco()!=null){t=b.gt9()
+if(w&&!z.e.gt9().fC(t)){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())
 return}s=$.X3
 if(s==null?t!=null:s!==t)$.X3=t
 else s=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
+if(y){if(b.gdU()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
+if(b.gco()!=null)new P.RT(z,x,w,b,t).$0()
 if(s!=null)$.X3=s
+b.sbH(null)
+b.skO(null)
+b.sbv(null)
+b.sNw(null)
 if(x.d)return
 if(x.b===!0){y=x.c
 y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
 if(y){r=x.c
-if(!!J.x(r).$isGc)if(r.Gv>=4){b.swG(!0)
+if(!!J.x(r).$isGc)if(r.YM>=4){b.sKl(!0)
 z.e=r
 y=r
 continue}else P.A9(r,b)
 else P.k3(r,b)
-return}}if(x.b===!0){q=b.L3()
-b.Am(x.c)}else{q=b.L3()
+return}}if(x.b===!0){q=b.ah()
+b.vd(x.c)}else{q=b.ah()
 v=x.c
-b.E6(J.w8(v),v.gI4())}z.e=b
+b.Is(J.w8(v),v.gI4())}z.e=b
 y=b
 b=q}}}},
 da:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
-"^":"Xs:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
+"^":"Xs:12;a",
+$1:[function(a){this.a.X2(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 VL:{
-"^":"Xs:122;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+"^":"Xs:124;b",
+$2:[function(a,b){this.b.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Xs:74;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.c.X2(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Xs:74;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b,c",
+$0:[function(){this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Xs:123;b,d,e,f",
+"^":"Xs:125;b,d,e,f",
 $0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
+try{this.b.c=this.f.FI(this.d.gdU(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"Xs:18;c,b,UI,bK",
+"^":"Xs:17;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()
+z=this.c.e.gSt()
 r=this.UI
-y=r.gyK()
+y=r.gp6()
 x=!0
 if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(q,null)
 r=J.w8(z)
 p=w
 o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
 r=this.b
 r.c=o
 r.b=!1
-return}u=r.go7()
+return}u=r.gTv()
 if(x===!0&&u!=null){try{r=u
 p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
+p=H.KT(p,[p,p]).Zg(r)
 n=this.bK
 m=this.b
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(q,null)
 r=J.w8(z)
 p=t
 o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
@@ -5893,111 +5979,111 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Xs:18;c,b,Gq,Rm,w3",
+"^":"Xs:17;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)
+try{z.a=this.w3.Gr(this.Rm.gco())}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
+x=new H.oP(w,null)
+if(this.Gq){v=J.w8(this.c.e.gSt())
 u=y
 u=v==null?u==null:v===u
 v=u}else v=!1
 u=this.b
-if(v)u.c=this.c.e.gcG()
+if(v)u.c=this.c.e.gSt()
 else u.c=new P.Ca(y,x)
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
+v.sKl(!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.ez(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Xs:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,124,"call"],
+"^":"Xs:12;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,126,"call"],
 $isEH:true},
-FZ:{
-"^":"Xs:122;a,mG",
+ez:{
+"^":"Xs:124;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){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,23,24,25,"call"],
+y.Is(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.ip(this,"wS",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"wU",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},125],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},125],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},127],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},127],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
 x=P.p9("")
 z.a=null
 z.b=!0
-z.a=this.KR(new P.Yl(z,this,b,y,x),!0,new P.dW3(y,x),new P.Lp0(y))
+z.a=this.KR(new P.dW3(z,this,b,y,x),!0,new P.Lp0(y,x),new P.QCh(y))
 return y},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
+z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
 return y},
 Vr:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
 return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
+this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
+z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.ip(this,"wS",0)])
-y=P.Dt([P.WO,H.ip(this,"wS",0)])
-this.KR(new P.lv(this,z),!0,new P.oo(z,y),y.gaq())
+z=H.VM([],[H.W8(this,"wS",0)])
+y=P.Dt([P.WO,H.W8(this,"wS",0)])
+this.KR(new P.lv(this,z),!0,new P.oo(z,y),y.gFa())
 return y},
 zH:function(a){var z,y
-z=P.Ls(null,null,null,H.ip(this,"wS",0))
-y=P.Dt([P.Jb,H.ip(this,"wS",0)])
-this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
+z=P.Ls(null,null,null,H.W8(this,"wS",0))
+y=P.Dt([P.Ol,H.W8(this,"wS",0)])
+this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.U6(this,b,null)
+z.mh(this,b,null)
 return z},
-gTw:function(a){var z,y
+gqG:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"wS",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
+z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"wS",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gaq())
+this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
 $iswS:true},
-Yl:{
+dW3:{
 "^":"Xs;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
 x=this.a
@@ -6005,432 +6091,335 @@
 x.b=!1
 try{this.e.KF(a)}catch(w){v=H.Ru(w)
 z=v
-y=new H.XO(w,null)
-P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,126,"call"],
+y=new H.oP(w,null)
+P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-Lp0:{
-"^":"Xs:13;f",
-$1:[function(a){this.f.Lp(a)},"$1",null,2,0,null,1,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+QCh:{
+"^":"Xs:12;f",
+$1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-dW3:{
-"^":"Xs:74;UI,bK",
-$0:[function(){this.UI.rX(this.bK.vM)},"$0",null,0,0,null,"call"],
+Lp0:{
+"^":"Xs:76;UI,bK",
+$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
+P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 LB:{
-"^":"Xs:74;e,f",
+"^":"Xs:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 z2:{
-"^":"Xs:127;a,UI",
+"^":"Xs:129;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 DO:{
-"^":"Xs:74;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;bK",
+$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Xs;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,126,"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,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"Xs:74;e,f",
+"^":"Xs:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-at:{
-"^":"Xs:13;",
+Jb:{
+"^":"Xs:12;",
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"Xs:74;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;UI",
+$0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.XPB(this.c,a),new P.h7d(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-XPB:{
-"^":"Xs:74;e,f",
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+WN:{
+"^":"Xs:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-h7d:{
-"^":"Xs:127;a,UI",
+XPB:{
+"^":"Xs:129;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
-"^":"Xs:74;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
+Ia:{
+"^":"Xs:76;bK",
+$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"Xs:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-uO:{
-"^":"Xs:74;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
+hh:{
+"^":"Xs:76;a,b",
+$0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
-"^":"Xs:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Wd:{
-"^":"Xs:74;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c",
+$0:[function(){this.c.In(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lv:{
 "^":"Xs;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,116,"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,118,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 oo:{
-"^":"Xs:74;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 oY:{
 "^":"Xs;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,116,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,118,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
-"^":"Xs:74;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xp:{
+lU:{
 "^":"Xs;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-OC:{
-"^":"Xs:74;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+xp:{
+"^":"Xs:76;d",
+$0:[function(){var z,y,x,w
+try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.d.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Xs;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
+z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"Xs:74;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"],
+"^":"Xs:76;a,c",
+$0:[function(){var z,y,x,w
+x=this.a
+if(x.b){this.c.In(x.a)
+return}try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.c.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 yX:{
 "^":"a;",
 $isyX:true},
-nR:{
-"^":"a;",
-gvq:function(a){return H.VM(new P.u2(this),[null])},
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gDe:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.Qk(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-SL:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"nR")}],
-xO:function(a){var z=this.Gv
-if((z&4)!==0)return this.SL()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.SY()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.SL()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.Dn(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gDe()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gQC()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.YM(this.gQC())
-v=new P.Bc(this)
-if(z!=null)z=z.YM(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Xs:74;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"Xs:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-SY:function(){this.gEe().Qj()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.Dn(a,b,null))},
-SY:function(){this.gEe().w6(C.ZB)}},
-q1:{
-"^":"ZzD;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-MFI:{
-"^":"nR+TT;"},
 u2:{
-"^":"ez;ly",
-w4:function(a){return this.ly.ET(a)},
-giO:function(a){return(H.eQ(this.ly)^892482866)>>>0},
+"^":"ezY;",
+k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
+giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isu2)return!1
-return b.ly===this.ly},
+return b.BT===this.BT},
 $isu2:true},
-yU:{
-"^":"KA;ly<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gly().j0(this)},
-uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,18]},
+yU4:{
+"^":"KA;BT<",
+cZ:function(){return this.gBT().rR(this)},
+jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-ps:function(a){this.pN=this.Lj.wY(a)},
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
 fm:function(a,b){if(b==null)b=P.bx()
-this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
+this.Tv=P.VH(b,this.t9)},
+Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.YM(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-QE:[function(a){var z=this.Gv
+this.YM=(z+128|4)>>>0
+if(b!=null)b.wM(this.gDQ(this))
+if(z<128&&this.fk!=null)this.fk.IO()
+if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
-this.Gv=z
-if(z<128){if((z&64)!==0){z=this.Ri
+this.YM=z
+if(z<128){if((z&64)!==0){z=this.fk
 z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.IO()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
+if(z)this.fk.t2(this)
+else{z=(this.YM&4294967291)>>>0
+this.YM=z
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
+Gv:function(){var z=(this.YM&4294967279)>>>0
+this.YM=z
+if((z&8)!==0)return this.Qe
+this.WN()
+return this.Qe},
+gUF:function(){return this.YM>=128},
+WN:function(){var z=(this.YM|8)>>>0
+this.YM=z
+if((z&64)!==0)this.fk.IO()
+if((this.YM&32)===0)this.fk=null
+this.Qe=this.cZ()},
+Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
+if(z<32)this.MW(b)
+else this.C2(H.VM(new P.fZ(b,null),[null]))},
+MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.Dn(a,b,null))},
-Qj:function(){var z=this.Gv
+if(z<32)this.y7(a,b)
+else this.C2(new P.Dn(a,b,null))},
+AN:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
-this.Gv=z
-if(z<32)this.SY()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
+this.YM=z
+if(z<32)this.PS()
+else this.C2(C.ZB)},
+jy:[function(){},"$0","gb9",0,0,17],
+ie:[function(){},"$0","gxl",0,0,17],
+cZ:function(){return},
+C2:function(a){var z,y
+z=this.fk
 if(z==null){z=new P.Qk(null,null,0)
-this.Ri=z}z.h(0,a)
-y=this.Gv
+this.fk=z}z.h(0,a)
+y=this.YM
 if((y&64)===0){y=(y|64)>>>0
-this.Gv=y
-if(y<128)this.Ri.t2(this)}},
-Iv:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-this.Lj.m1(this.pN,a)
-this.Gv=(this.Gv&4294967263)>>>0
-this.ut((z&4)!==0)},
-pb:function(a,b){var z,y
-z=this.Gv
+this.YM=y
+if(y<128)this.fk.t2(this)}},
+MW:function(a){var z=this.YM
+this.YM=(z|32)>>>0
+this.t9.m1(this.dB,a)
+this.YM=(this.YM&4294967263)>>>0
+this.Iy((z&4)!==0)},
+y7:function(a,b){var z,y
+z=this.YM
 y=new P.x1(this,a,b)
-if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.YM(y)
+if((z&1)!==0){this.YM=(z|16)>>>0
+this.WN()
+z=this.Qe
+if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.ut((z&4)!==0)}},
-SY:function(){var z,y
+this.Iy((z&4)!==0)}},
+PS:function(){var z,y
 z=new P.qB(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.YM(z)
+this.WN()
+this.YM=(this.YM|16)>>>0
+y=this.Qe
+if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
+Ge:function(a){var z=this.YM
+this.YM=(z|32)>>>0
 a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.ut((z&4)!==0)},
-ut:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
+this.YM=(this.YM&4294967263)>>>0
+this.Iy((z&4)!==0)},
+Iy:function(a){var z,y
+if((this.YM&64)!==0){z=this.fk
 z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
+if(z){z=(this.YM&4294967231)>>>0
+this.YM=z
+if((z&4)!==0)if(z<128){z=this.fk
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
+if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
+if((z&8)!==0){this.fk=null
 return}y=(z&4)!==0
 if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
+this.YM=(z^32)>>>0
+if(y)this.jy()
+else this.ie()
+this.YM=(this.YM&4294967263)>>>0}z=this.YM
+if((z&64)!==0&&z<128)this.fk.t2(this)},
+Cy:function(a,b,c,d,e){var z=this.t9
+this.dB=z.cR(a)
+this.fm(0,b)
+this.EU=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,bG,nS,Ir9,nav,lkp,JAK,N3S,FF"}},
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,vo,FF",MG:function(a,b,c,d,e){var z,y
+z=$.X3
+y=d?1:0
+y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
+y.Cy(a,b,c,d,e)
+return y}}},
 x1:{
-"^":"Xs:18;a,b,c",
+"^":"Xs:17;a,b,c",
 $0:[function(){var z,y,x,w,v,u
 z=this.a
-y=z.Gv
+y=z.YM
 if((y&8)!==0&&(y&16)===0)return
-z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-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},"$0",null,0,0,null,"call"],
+z.YM=(y|32)>>>0
+y=z.Tv
+x=H.G3()
+x=H.KT(x,[x,x]).Zg(y)
+w=z.t9
+v=this.b
+u=z.Tv
+if(x)w.z8(u,v,this.c)
+else w.m1(u,v)
+z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Xs:18;a",
+"^":"Xs:17;a",
 $0:[function(){var z,y
 z=this.a
-y=z.Gv
+y=z.YM
 if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.YM=(y|42)>>>0
+z.t9.ww(z.EU)
+z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-ez:{
+ezY:{
 "^":"wS;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.ps(a)
-z.fm(0,d)
-z.y5(c)
-return z},
+KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
+k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
 fZ:{
 "^":"fIm;P>,aw",
-dP:function(a){a.Iv(this.P)}},
+dP:function(a){a.MW(this.P)}},
 Dn:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
+dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.SY()},
+dP:function(a){a.PS()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
 "^":"a;",
-t2:function(a){var z=this.Gv
+t2:function(a){var z=this.YM
 if(z===1)return
-if(z>=1){this.Gv=1
+if(z>=1){this.YM=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},
-IO:function(){if(this.Gv===1)this.Gv=3}},
+this.YM=1},
+IO:function(){if(this.YM===1)this.YM=3}},
 CR:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){var z,y
 z=this.a
-y=z.Gv
-z.Gv=0
+y=z.YM
+z.YM=0
 if(y===3)return
 z.vG(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
-"^":"B3P;zR,N6,Gv",
+"^":"B3P;zR,N6,YM",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
@@ -6442,340 +6431,403 @@
 this.zR=y
 if(y==null)this.N6=null
 z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
+V1:function(a){if(this.YM===1)this.YM=3
 this.N6=null
 this.zR=null}},
 EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-ps:function(a){},
+"^":"a;t9<,YM,EU",
+gUF:function(){return this.YM>=4},
+q1:function(){if((this.YM&2)!==0)return
+this.t9.wr(this.gpx())
+this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-QE:[function(a){var z=this.Gv
+Fv:[function(a,b){this.YM+=4
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+QE:[function(a){var z=this.YM
 if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-SY:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
+this.YM=z
+if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
+Gv:function(){return},
+PS:[function(){var z=(this.YM&4294967293)>>>0
+this.YM=z
 if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
+this.YM=(z|1)>>>0
+z=this.EU
+if(z!=null)this.t9.ww(z)},"$0","gpx",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 dR:{
-"^":"Xs:74;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b,c",
+$0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Xs:130;a,b",
+"^":"Xs:132;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"Xs:74;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
 "^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
+z=H.W8(this,"og",0)
+y=H.W8(this,"og",1)
 x=$.X3
 w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.ps(a)
-v.fm(0,d)
-v.y5(c)
-return v},
+w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w.Cy(a,d,c,b,y)
+w.JC(this,a,d,c,b,z,y)
+return w},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
-kM:function(a,b){b.Rg(0,a)},
+FC:function(a,b){b.Rg(0,a)},
 $aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
+"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
+Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
+MR:function(a,b){if((this.YM&2)!==0)return
+P.KA.prototype.MR.call(this,a,b)},
+jy:[function(){var z=this.lI
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
+z.WJ(0)},"$0","gb9",0,0,17],
+ie:[function(){var z=this.lI
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},116],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,131,24,25],
-Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
+z.QE(0)},"$0","gxl",0,0,17],
+cZ:function(){var z=this.lI
+if(z!=null){this.lI=null
+z.Gv()}return},
+Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},118],
+SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,133,23,24],
+oZ:[function(){this.AN()},"$0","gos",0,0,17],
+JC:function(a,b,c,d,e,f,g){var z,y
+z=this.gwU()
+y=this.gPr()
+this.lI=this.m7.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
-"^":"og;ZP,Sb",
-Dr:function(a){return this.ZP.$1(a)},
-kM:function(a,b){var z,y,x,w,v
+"^":"og;VL,Sb",
+Ub:function(a){return this.VL.$1(a)},
+FC:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.Dr(a)}catch(w){v=H.Ru(w)
+try{z=this.Ub(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
+x=new H.oP(w,null)
+b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
 $aswS:null},
 c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-kM:function(a,b){var z,y,x,w,v
+"^":"og;xj,Sb",
+Eh:function(a){return this.xj.$1(a)},
+FC:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
+try{z=this.Eh(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
+x=new H.oP(w,null)
+b.MR(y,x)
 return}J.wx(b,z)}},
 AE:{
-"^":"og;pK,Sb",
-Iy:function(a){return this.pK.$1(a)},
-kM:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.Iy(a));w.G();){z=w.gl()
+"^":"og;yj,Sb",
+bZ:function(a){return this.yj.$1(a)},
+FC:function(a,b){var z,y,x,w,v
+try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
+x=new H.oP(v,null)
+b.MR(y,x)}}},
 pt:{
-"^":"og;Em,Sb",
-kM:function(a,b){var z=this.Em
-if(z>0){this.Em=z-1
+"^":"og;Km,Sb",
+FC:function(a,b){var z=this.Km
+if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-U6:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
 $aswS:null},
 kWp:{
 "^":"a;"},
-aYy:{
+fM:{
+"^":"a;M5,ig>"},
+n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,hY<,Ot<,jH<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,xk<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.hY.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
+"^":"a;lR,cP,U1,jH,Ka,Xp,o2,rb,Zqn,rF,JS,nw",
+hk:function(a,b){return this.lR.$2(a,b)},
+Gr:function(a){return this.cP.$1(a)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
-wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$1(a)},
+cR:function(a){return this.Xp.$1(a)},
+O8:function(a){return this.o2.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
-uN:function(a,b){return this.Zq.$2(a,b)},
+uN:function(a,b){return this.Zqn.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)}},
+iT:function(a){return this.nw.$1$specification(a)},
+$isyQ:true},
 e4y:{
 "^":"a;"},
 JBS:{
 "^":"a;"},
 Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-c1:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().ghY()==null;)z=z.geT(z)
-return z.gtp().ghY().$4(z,new P.Id(z.geT(z)),a,b)},
-Eo:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().gjH()==null;)z=z.geT(z)
-return z.gtp().gjH().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+"^":"a;bk",
 RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gxk()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gxk().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+z=this.bk.gOf()
+y=z.M5
+z.ig.$4(y,P.Cw(y),a,b)}},
+m0:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
-bH:function(a){var z,y,x,w
+fC:function(a){return this.gF7()===a.gF7()},
+$ism0:true},
+FQ:{
+"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
+gyL:function(){var z=this.ye
+if(z!=null)return z
+z=new P.Id(this)
+this.ye=z
+return z},
+gF7:function(){return this.pB.M5},
+ww:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
+if(b)return new P.OJ(this,z)
+else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
-rO:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
+rO:function(a,b){var z=this.cR(a)
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
 mS:function(a){return this.rO(a,!0)},
-cl:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.cZ(this,z)}},
-TF:{
-"^":"Xs:74;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Xs:74;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Xs:13;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Xs:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Xs:80;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-cZ:{
-"^":"Xs:80;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
+PT:function(a,b){var z=this.O8(a)
+if(b)return new P.N9(this,z)
+else return new P.ap(this,z)},
+t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
-if(y!=null||z.x4(0,b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).Eo(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).V6(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-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)}},
+if(y!=null||z.NZ(0,b))return y
+x=this.eT
+if(x!=null){w=J.UQ(x,b)
+if(w!=null)z.u(0,b,w)
+return w}return},
+hk:function(a,b){var z,y,x
+z=this.pB
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+c6:function(a,b){var z,y,x
+z=this.Gt
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){var z,y,x
+z=this.vr
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+FI:function(a,b){var z,y,x
+z=this.JY
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+mg:function(a,b,c){var z,y,x
+z=this.HG
+y=z.M5
+x=P.Cw(y)
+return z.ig.$6(y,x,this,a,b,c)},
+Al:function(a){var z,y,x
+z=this.Tr
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+cR:function(a){var z,y,x
+z=this.kX
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+O8:function(a){var z,y,x
+z=this.c5
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+wr:function(a){var z,y,x
+z=this.Of
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+uN:function(a,b){var z,y,x
+z=this.x6
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+Ch:function(a,b){var z,y,x
+z=this.kP
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,b)},
+bC:function(a,b,c){var z
+this.vr=this.eT.gvr()
+this.JY=this.eT.gJY()
+this.HG=this.eT.gHG()
+z=b.Ka
+this.Tr=z!=null?new P.fM(this,z):this.eT.gTr()
+z=b.Xp
+this.kX=z!=null?new P.fM(this,z):this.eT.gkX()
+this.c5=this.eT.gc5()
+this.Of=this.eT.gOf()
+this.x6=this.eT.gx6()
+this.Jy=this.eT.gJy()
+this.kP=this.eT.gkP()
+this.Gt=this.eT.gGt()
+this.pB=this.eT.gpB()}},
+OJ:{
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+Yn:{
+"^":"Xs:76;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+eP:{
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+aQ:{
+"^":"Xs:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+N9:{
+"^":"Xs:81;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+ap:{
+"^":"Xs:81;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
 FO:{
-"^":"Xs:74;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b",
+$0:[function(){throw H.b(P.Yq(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
-eM:{
-"^":"Xs:74;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Uez:{
-"^":"Xs:80;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-ghY:function(){return P.r6()},
-Gr:function(a){return this.ghY().$1(a)},
-gOt:function(){return P.MM()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-gjH:function(){return P.tz()},
-mg:function(a,b,c){return this.gjH().$3(a,b,c)},
-gKa:function(){return P.EU()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.L8()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.Lm()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.oQ()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gxk:function(){return P.Oj()},
-qp:function(a){return this.gxk().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"m0;",
+gvr:function(){return C.lk},
+gJY:function(){return C.Yl},
+gHG:function(){return C.Gu},
+gTr:function(){return C.pj},
+gkX:function(){return C.F6},
+gc5:function(){return C.Xk},
+gOf:function(){return C.Zc},
+gx6:function(){return C.Sq},
+gJy:function(){return C.NA},
+gkP:function(){return C.uo},
+gGt:function(){return C.mc},
+gpB:function(){return C.Rt},
 geT:function(a){return},
-gtp:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
+gSe:function(){return $.Rf()},
+gyL:function(){var z=$.Sk
+if(z!=null)return z
+z=new P.Id(this)
+$.Sk=z
+return z},
+gF7:function(){return this},
+ww:function(a){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$0()
+return x}x=P.Ki(null,null,this,a)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+m1:function(a,b){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$1(b)
+return x}x=P.V7(null,null,this,a,b)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+z8:function(a,b,c){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$2(b,c)
+return x}x=P.Mu(null,null,this,a,b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+xi:function(a,b){if(b)return new P.hj(this,a)
+else return new P.MK(this,a)},
+ce:function(a){return this.xi(a,!0)},
+rO:function(a,b){if(b)return new P.pQ(this,a)
+else return new P.XW(this,a)},
+mS:function(a){return this.rO(a,!0)},
+PT:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.E1(this,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.Ki(this,null,this,a)},
-FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
+hk:function(a,b){return P.CK(null,null,this,a,b)},
+c6:function(a,b){return P.E1(null,null,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){if($.X3===C.NU)return a.$0()
+return P.Ki(null,null,this,a)},
+FI:function(a,b){if($.X3===C.NU)return a.$1(b)
+return P.V7(null,null,this,a,b)},
+mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
+return P.Mu(null,null,this,a,b,c)},
 Al:function(a){return a},
-wY:function(a){return a},
+cR:function(a){return a},
 O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
+wr:function(a){P.Tk(null,null,this,a)},
+uN:function(a,b){return P.YF(a,b)},
+Ch:function(a,b){H.Af(b)},
+static:{"^":"ln,Sk"}},
+hj:{
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+MK:{
+"^":"Xs:76;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+pQ:{
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+XW:{
+"^":"Xs:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+Ze:{
+"^":"Xs:81;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+dM:{
+"^":"Xs:81;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true}}],["","",,P,{
 "^":"",
 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])},
-TQ:[function(a,b){return J.xC(a,b)},"$2","WbE",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,48,49,50],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
-return P.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+return P.uP(a,b,c,d,e)},
 Rd:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 Ix:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
@@ -6786,7 +6838,7 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.vM},
+return y.IN},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -6794,7 +6846,7 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-return z.gvM()},
+return z.gIN()},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -6851,101 +6903,101 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
+z.pop()}return y.gIN()},
 bA:{
-"^":"a;X5,vv,OX,OB,wV",
+"^":"a;X5,Mb,cG,Cs,Jp",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
 gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
 gUQ:function(a){return H.fR(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
-x4:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.Zt(b)},
-Zt:function(a){var z=this.OB
+NZ:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return y==null?!1:y[b]!=null}else return this.KY(b)},
+KY:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
+return this.DF(z[this.rk(a)],a)>=0},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
 else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.OX
+y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.cG
 if(w==null)y=null
 else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
+y=x===w?null:x}return y}else return this.c8(b)},
+c8:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 return x<0?null:y[x+1]},
 u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
+this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:function(a,b){var z,y,x,w
+z=this.Cs
 if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
+this.Cs=z}y=this.rk(a)
 x=z[y]
 if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
+this.Jp=null}else{w=this.DF(x,a)
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+this.Jp=null}}},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return;--this.X5
-this.wV=null
+this.Jp=null
 return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.Jp=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0}},
 aN:function(a,b){var z,y,x,w
-z=this.Ig()
+z=this.Nm()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
+if(z!==this.Jp)throw H.b(P.a4(this))}},
+Nm:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.Jp
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
-x=this.vv
+x=this.Mb
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
+s=this.cG
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
+for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.Jp=y
 return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
+u9:function(a,b,c){if(a[b]==null){++this.X5
+this.Jp=null}P.cW(a,b,c)},
+H4:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b];--this.X5
-this.wV=null
+this.Jp=null
 return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
@@ -6959,186 +7011,186 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
 $isEH:true},
 DJ:{
 "^":"Xs;a",
-$2:function(a,b){this.a.u(0,a,b)},
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.a,"bA")}},
 PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
+"^":"bA;X5,Mb,cG,Cs,Jp",
+rk:function(a){return H.CU(a)&0x3ffffff},
+DF:function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"bA;m6,RG,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.RG.$1(a)},
-Xy:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Xy(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a,b){if(this.Xy(b)!==!0)return!1
-return P.bA.prototype.Zt.call(this,b)},
-Rz:function(a,b){if(this.Xy(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
+"^":"bA;AH,dI,lO,X5,Mb,cG,Cs,Jp",
+Xm:function(a,b){return this.AH.$2(a,b)},
+jP:function(a){return this.dI.$1(a)},
+Bc:function(a){return this.lO.$1(a)},
+t:function(a,b){if(this.Bc(b)!==!0)return
+return P.bA.prototype.c8.call(this,b)},
+u:function(a,b,c){P.bA.prototype.Gk.call(this,b,c)},
+NZ:function(a,b){if(this.Bc(b)!==!0)return!1
+return P.bA.prototype.KY.call(this,b)},
+Rz:function(a,b){if(this.Bc(b)!==!0)return
+return P.bA.prototype.qg.call(this,b)},
+rk:function(a){return this.jP(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
+for(y=0;y<z;y+=2)if(this.Xm(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+static:{uP: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:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
 fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
+"^":"mW;ZD",
+gB:function(a){return this.ZD.X5},
+gl0:function(a){return this.ZD.X5===0},
+gA:function(a){var z=this.ZD
+z=new P.EQ(z,z.Nm(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Gs:function(a,b){return this.Fb.x4(0,b)},
+tg:function(a,b){return this.ZD.NZ(0,b)},
 aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
+z=this.ZD
+y=z.Nm()
 for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
+if(y!==z.Jp)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
-"^":"a;Fb,wV,zi,fD",
+"^":"a;ZD,Jp,iY,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
+z=this.Jp
+y=this.iY
+x=this.ZD
+if(z!==x.Jp)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
-this.zi=y+1
+this.iY=y+1
 return!0}}},
 YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
+"^":"a;X5,Mb,cG,Cs,HH,Nz,HU",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
 gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
 gUQ:function(a){return H.fR(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
-x4:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+NZ:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null)return!1
-return y[b]!=null}else return this.Zt(b)},
-Zt:function(a){var z=this.OB
+return y[b]!=null}else return this.KY(b)},
+KY:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 FV:function(a,b){J.Me(b,new P.pk(this))},
 t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return
 y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null)return
 y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
+return y==null?null:y.gcF()}else return this.c8(b)},
+c8:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
-return y[x].gcA()},
+return y[x].gcF()},
 u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
+this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:function(a,b){var z,y,x,w
+z=this.Cs
 if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
+this.Cs=z}y=this.rk(a)
 x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
+if(x==null)z[y]=[this.x4(a,b)]
+else{w=this.DF(x,a)
+if(w>=0)x[w].scF(b)
+else x.push(this.x4(a,b))}},
 to:function(a,b,c){var z
-if(this.x4(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.t(0,b)
 z=c.$0()
 this.u(0,b,z)
 return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x,w
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
+this.GS(w)
+return w.gcF()},
+V1:function(a){if(this.X5>0){this.Nz=null
+this.HH=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0
-this.zN=this.zN+1&67108863}},
+this.HU=this.HU+1&67108863}},
 aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(z),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
+z=this.HH
+y=this.HU
+for(;z!=null;){b.$2(z.gv8(z),z.gcF())
+if(y!==this.HU)throw H.b(P.a4(this))
+z=z.gtL()}},
+u9:function(a,b,c){var z=a[b]
+if(z==null)a[b]=this.x4(b,c)
+else z.scF(c)},
+H4:function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
-this.Vb(z)
+this.GS(z)
 delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
+return z.gcF()},
+x4:function(a,b){var z,y
 z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
+if(this.HH==null){this.Nz=z
+this.HH=z}else{y=this.Nz
+z.n8=y
+y.stL(z)
+this.Nz=z}++this.X5
+this.HU=this.HU+1&67108863
 return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+GS:function(a){var z,y
+z=a.gn8()
+y=a.gtL()
+if(z==null)this.HH=y
+else z.stL(y)
+if(y==null)this.Nz=z
+else y.sn8(z);--this.X5
+this.HU=this.HU+1&67108863},
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.up(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.nG(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isFo:true,
 $isT8:true,
 $asT8:null,
@@ -7147,290 +7199,290 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
 $isEH:true},
 pk:{
 "^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"YB")}},
 db:{
-"^":"a;kh>,cA@,DG@,zQ@"},
+"^":"a;v8>,cF@,tL@,n8@"},
 i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
+"^":"mW;ZD",
+gB:function(a){return this.ZD.X5},
+gl0:function(a){return this.ZD.X5===0},
 gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
+z=this.ZD
+y=new P.N6(z,z.HU,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
+y.Qx=z.HH
 return y},
-Gs:function(a,b){return this.Fb.x4(0,b)},
+tg:function(a,b){return this.ZD.NZ(0,b)},
 aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh(y))
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
+z=this.ZD
+y=z.HH
+x=z.HU
+for(;y!=null;){b.$1(y.gv8(y))
+if(x!==z.HU)throw H.b(P.a4(z))
+y=y.gtL()}},
 $isyN:true},
 N6:{
-"^":"a;Fb,zN,zq,fD",
+"^":"a;ZD,HU,Qx,fD",
 gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
+G:function(){var z=this.ZD
+if(this.HU!==z.HU)throw H.b(P.a4(z))
+else{z=this.Qx
 if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh(z)
-this.zq=this.zq.gDG()
+return!1}else{this.fD=z.gv8(z)
+this.Qx=this.Qx.gtL()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,CQ",
-Ys:function(){var z=new P.jg(0,null,null,null,null)
+"^":"u3T;X5,Mb,cG,Cs,vw",
+iL:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
+gA:function(a){var z=new P.cN(this,this.ij(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-Gs:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
+tg:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return y==null?!1:y[b]!=null}else return this.PR(b)},
+PR:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 hV:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
-if(z)return this.Gs(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
+if(z)return this.tg(0,a)?a:null
+return this.GP(a)},
+GP:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 return J.UQ(y,x)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+this.Mb=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.jBG()
-this.OB=z}y=this.nm(b)
+this.cG=y
+x=y}return this.bQ(x,b)}else return this.B7(0,b)},
+B7:function(a,b){var z,y,x
+z=this.Cs
+if(z==null){z=P.V5()
+this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
+else{if(this.DF(x,b)>=0)return!1
 x.push(b)}++this.X5
-this.CQ=null
+this.vw=null
 return!0},
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return!1;--this.X5
-this.CQ=null
+this.vw=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.CQ=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.vw=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.CQ
+ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
-x=this.vv
+x=this.Mb
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
+s=this.cG
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.CQ=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.vw=y
 return y},
-jn:function(a,b){if(a[b]!=null)return!1
+bQ:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
-this.CQ=null
+this.vw=null
 return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.CQ=null
+H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
+this.vw=null
 return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{jBG:function(){var z=Object.create(null)
+static:{V5:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;O2,CQ,zi,fD",
+"^":"a;vY,vw,iY,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.CQ
-y=this.zi
-x=this.O2
-if(z!==x.CQ)throw H.b(P.a4(x))
+z=this.vw
+y=this.iY
+x=this.vY
+if(z!==x.vw)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
-this.zi=y+1
+this.iY=y+1
 return!0}}},
 D0:{
-"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
-Ys:function(){var z=new P.D0(0,null,null,null,null,null,0)
+"^":"u3T;X5,Mb,cG,Cs,HH,Nz,HU",
+iL:function(){var z=new P.D0(0,null,null,null,null,null,0)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
-z.zq=z.O2.H9
+gA:function(a){var z=H.VM(new P.zQ(this,this.HU,null,null),[null])
+z.Qx=z.vY.HH
 return z},
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-Gs:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+tg:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
+return y[b]!=null}else return this.PR(b)},
+PR:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 hV:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
-if(z)return this.Gs(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
+if(z)return this.tg(0,a)?a:null
+else return this.GP(a)},
+GP:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 return J.Nq(J.UQ(y,x))},
 aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
+z=this.HH
+y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
+if(y!==this.HU)throw H.b(P.a4(this))
+z=z.gtL()}},
+grZ:function(a){var z=this.Nz
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+this.Mb=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
+this.cG=y
+x=y}return this.bQ(x,b)}else return this.B7(0,b)},
+B7:function(a,b){var z,y,x
+z=this.Cs
 if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
+this.Cs=z}y=this.rk(b)
 x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+if(x==null)z[y]=[this.yo(b)]
+else{if(this.DF(x,b)>=0)return!1
+x.push(this.yo(b))}return!0},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
+this.GS(y.splice(x,1)[0])
 return!0},
-Nk:function(a,b){this.h6(b,!0)},
-h6:function(a,b){var z,y,x,w,v
-z=this.H9
+uk:function(a,b){this.YS(b,!0)},
+YS:function(a,b){var z,y,x,w,v
+z=this.HH
 for(;z!=null;z=x){y=z.gGc(z)
-x=z.gDG()
-w=this.zN
+x=z.gtL()
+w=this.HU
 v=a.$1(y)
-if(w!==this.zN)throw H.b(P.a4(this))
+if(w!==this.HU)throw H.b(P.a4(this))
 if(b===v)this.Rz(0,y)}},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.Nz=null
+this.HH=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
+this.HU=this.HU+1&67108863}},
+bQ:function(a,b){if(a[b]!=null)return!1
+a[b]=this.yo(b)
 return!0},
-Nv:function(a,b){var z
+H4:function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
-this.Vb(z)
+this.GS(z)
 delete a[b]
 return!0},
-xf:function(a){var z,y
+yo:function(a){var z,y
 z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
+if(this.HH==null){this.Nz=z
+this.HH=z}else{y=this.Nz
+z.n8=y
+y.stL(z)
+this.Nz=z}++this.X5
+this.HU=this.HU+1&67108863
 return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+GS:function(a){var z,y
+z=a.gn8()
+y=a.gtL()
+if(z==null)this.HH=y
+else z.stL(y)
+if(y==null)this.Nz=z
+else y.sn8(z);--this.X5
+this.HU=this.HU+1&67108863},
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7439,16 +7491,16 @@
 delete z["<non-identifier-key>"]
 return z}}},
 tj:{
-"^":"a;Gc>,DG@,zQ@"},
+"^":"a;Gc>,tL@,n8@"},
 zQ:{
-"^":"a;O2,zN,zq,fD",
+"^":"a;vY,HU,Qx,fD",
 gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
+G:function(){var z=this.vY
+if(this.HU!==z.HU)throw H.b(P.a4(z))
+else{z=this.Qx
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
+this.Qx=this.Qx.gtL()
 return!0}}}},
 Yp:{
 "^":"w2Y;G4",
@@ -7458,15 +7510,15 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.Ys()
+zH:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.fR(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-Gs:function(a,b){var z
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
 aN:function(a,b){var z
@@ -7475,18 +7527,17 @@
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
+if(b===""){do{x=H.d(z.gl())
+y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
+for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.vM+=x}}return y.vM},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
+tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.ip(this,"mW",0))
+zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7495,7 +7546,7 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7508,7 +7559,7 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,71],
+bu:[function(a){return P.Ix(this,"(",")")},"$0","gCR",0,0,73],
 $isQV:true,
 $asQV:null},
 ark:{
@@ -7522,7 +7573,7 @@
 $asQV:null},
 lD:{
 "^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
+gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.W8(a,"lD",0)])},
 Zv:function(a,b){return this.t(a,b)},
 aN:function(a,b){var z,y
 z=this.gB(a)
@@ -7532,7 +7583,7 @@
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(a)
 for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
@@ -7544,28 +7595,28 @@
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},
-ad: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.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+return z.IN},
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
+if(b){z=H.VM([],[H.W8(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
 y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
+z=H.VM(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y
-z=P.Ls(null,null,null,H.ip(a,"lD",0))
+z=P.Ls(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7573,27 +7624,27 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-Nk:function(a,b){P.rC(a,b,!1)},
+uk:function(a,b){P.rC(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
 Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
+fV:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
 if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
 aM:function(a,b,c){var z,y,x,w
-this.pZ(a,b,c)
+this.fV(a,b,c)
 z=c-b
-y=H.VM([],[H.ip(a,"lD",0)])
+y=H.VM([],[H.W8(a,"lD",0)])
 C.Nm.sB(y,z)
 for(x=0;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
 y[x]=w}return y},
-Mu:function(a,b,c){this.pZ(a,b,c)
+Yc:function(a,b,c){this.fV(a,b,c)
 return H.c1(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
+oq:function(a,b,c){var z
+this.fV(a,b,c)
 z=c-b
 this.YW(a,b,this.gB(a)-z,a,c)
 this.sB(a,this.gB(a)-z)},
@@ -7615,7 +7666,7 @@
 if(c>=this.gB(a))return-1
 for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
 return-1},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
 c=this.gB(a)-1
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
@@ -7626,20 +7677,20 @@
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
 this.u(a,b,c)},
-oF:function(a,b,c){var z,y
+UG:function(a,b,c){var z,y
 if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.x(c)
 if(!!z.$isyN)c=z.br(c)
 y=J.q8(c)
 this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Yj(a,b,c)},
-Yj:function(a,b,c){var z,y
+this.Mh(a,b,c)},
+Mh:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -7654,67 +7705,98 @@
 aN:function(a,b){var z,y
 for(z=J.mY(this.gvc(this));z.G();){y=z.gl()
 b.$2(y,this.t(0,y))}},
-FV:function(a,b){var z,y,x,w
-for(z=J.RE(b),y=z.gvc(b),x=y.Fb,y=H.VM(new P.N6(x,x.zN,null,null),[H.u3(y,0)]),y.zq=y.Fb.H9;y.G();){w=y.fD
-this.u(0,w,z.t(b,w))}},
-x4:function(a,b){return J.wo(this.gvc(this),b)},
+FV:function(a,b){var z,y,x
+for(z=J.RE(b),y=z.gvc(b),y=y.gA(y);y.G();){x=y.gl()
+this.u(0,x,z.t(b,x))}},
+NZ:function(a,b){return J.kE(this.gvc(this),b)},
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.wU(this),[H.ip(this,"Yk",1)])},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
 wU:{
-"^":"mW;Fb",
-gB:function(a){var z=this.Fb
+"^":"mW;ZD",
+gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
-gl0:function(a){var z=this.Fb
+gl0:function(a){var z=this.ZD
 return J.FN(z.gvc(z))},
-gor:function(a){var z=this.Fb
+gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-grZ:function(a){var z=this.Fb
+grZ:function(a){var z=this.ZD
 return z.t(0,J.uY(z.gvc(z)))},
-gA:function(a){var z=this.Fb
+gA:function(a){var z=this.ZD
 z=new P.vc(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $isyN:true},
 vc:{
-"^":"a;wV,Fb,fD",
-G:function(){var z=this.wV
-if(z.G()){this.fD=this.Fb.t(0,z.gl())
+"^":"a;Jp,ZD,fD",
+G:function(){var z=this.Jp
+if(z.G()){this.fD=this.ZD.t(0,z.gl())
 return!0}this.fD=null
 return!1},
 gl:function(){return this.fD}},
+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"))},
+$isT8:true,
+$asT8:null},
+Pnf:{
+"^":"a;",
+t:function(a,b){return this.ZD.t(0,b)},
+u:function(a,b,c){this.ZD.u(0,b,c)},
+FV:function(a,b){this.ZD.FV(0,b)},
+V1:function(a){this.ZD.V1(0)},
+NZ:function(a,b){return this.ZD.NZ(0,b)},
+aN:function(a,b){this.ZD.aN(0,b)},
+gl0:function(a){return this.ZD.X5===0},
+gor:function(a){return this.ZD.X5!==0},
+gB:function(a){return this.ZD.X5},
+gvc:function(a){var z=this.ZD
+return H.VM(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.ZD.Rz(0,b)},
+bu:[function(a){return P.vW(this.ZD)},"$0","gCR",0,0,73],
+gUQ:function(a){var z=this.ZD
+return z.gUQ(z)},
+$isT8:true,
+$asT8:null},
+A2:{
+"^":"Pnf+KPM;ZD",
+$isT8:true,
+$asT8:null},
 LG:{
-"^":"Xs:80;a,b",
-$2:function(a,b){var z=this.a
+"^":"Xs:81;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,135,66,"call"],
 $isEH:true},
 Sw:{
-"^":"mW;v5,av,zX,qT",
-gA:function(a){var z=new P.fO(this,this.zX,this.qT,this.av,null)
+"^":"mW;dr,QN,Bq,Wf",
+gA:function(a){var z=new P.fO(this,this.Bq,this.Wf,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.zX;y=(y+1&this.v5.length-1)>>>0){x=this.v5
+z=this.Wf
+for(y=this.QN;y!==this.Bq;y=(y+1&this.dr.length-1)>>>0){x=this.dr
 if(y<0||y>=x.length)return H.e(x,y)
 b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.zX},
-gB:function(a){return(this.zX-this.av&this.v5.length-1)>>>0},
+if(z!==this.Wf)H.vh(P.a4(this))}},
+gl0:function(a){return this.QN===this.Bq},
+gB:function(a){return(this.Bq-this.QN&this.dr.length-1)>>>0},
 grZ:function(a){var z,y,x
-z=this.av
-y=this.zX
+z=this.QN
+y=this.Bq
 if(z===y)throw H.b(H.DU())
-z=this.v5
+z=this.dr
 x=z.length
 y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
@@ -7723,90 +7805,90 @@
 if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}this.Ix(z)
+z=H.VM(y,[H.u3(this,0)])}this.BR(z)
 return z},
 br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
+h:function(a,b){this.B7(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=b.length
 y=this.gB(this)
 x=y+z
-w=this.v5
+w=this.dr
 v=w.length
-if(x>=v){u=P.uay(x)
+if(x>=v){u=P.ra(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.u3(this,0)])
-this.zX=this.Ix(t)
-this.v5=t
-this.av=0
+this.Bq=this.BR(t)
+this.dr=t
+this.QN=0
 H.qG(t,y,x,b,0)
-this.zX+=z}else{x=this.zX
+this.Bq+=z}else{x=this.Bq
 s=v-x
 if(z<s){H.qG(w,x,x+z,b,0)
-this.zX+=z}else{r=z-s
+this.Bq+=z}else{r=z-s
 H.qG(w,x,x+s,b,0)
-x=this.v5
+x=this.dr
 H.qG(x,0,r,b,s)
-this.zX=r}}++this.qT},
+this.Bq=r}}++this.Wf},
 Rz:function(a,b){var z,y
-for(z=this.av;z!==this.zX;z=(z+1&this.v5.length-1)>>>0){y=this.v5
+for(z=this.QN;z!==this.Bq;z=(z+1&this.dr.length-1)>>>0){y=this.dr
 if(z<0||z>=y.length)return H.e(y,z)
-if(J.xC(y[z],b)){this.bB(z);++this.qT
+if(J.xC(y[z],b)){this.qg(z);++this.Wf
 return!0}}return!1},
-h6:function(a,b){var z,y,x,w
-z=this.qT
-y=this.av
-for(;y!==this.zX;){x=this.v5
+YS:function(a,b){var z,y,x,w
+z=this.Wf
+y=this.QN
+for(;y!==this.Bq;){x=this.dr
 if(y<0||y>=x.length)return H.e(x,y)
 x=a.$1(x[y])
-w=this.qT
+w=this.Wf
 if(z!==w)H.vh(P.a4(this))
-if(b===x){y=this.bB(y)
-z=++this.qT}else y=(y+1&this.v5.length-1)>>>0}},
-Nk:function(a,b){this.h6(b,!0)},
+if(b===x){y=this.qg(y)
+z=++this.Wf}else y=(y+1&this.dr.length-1)>>>0}},
+uk:function(a,b){this.YS(b,!0)},
 V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.zX
-if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.zX=0
-this.av=0;++this.qT}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
+z=this.QN
+y=this.Bq
+if(z!==y){for(x=this.dr,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
+x[z]=null}this.Bq=0
+this.QN=0;++this.Wf}},
+bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
-z=this.av
-if(z===this.zX)throw H.b(H.DU());++this.qT
-y=this.v5
+z=this.QN
+if(z===this.Bq)throw H.b(H.DU());++this.Wf
+y=this.dr
 x=y.length
 if(z>=x)return H.e(y,z)
 w=y[z]
 y[z]=null
-this.av=(z+1&x-1)>>>0
+this.QN=(z+1&x-1)>>>0
 return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.zX
+B7:function(a,b){var z,y,x
+z=this.dr
+y=this.Bq
 x=z.length
 if(y<0||y>=x)return H.e(z,y)
 z[y]=b
 x=(y+1&x-1)>>>0
-this.zX=x
-if(this.av===x)this.M9();++this.qT},
-bB:function(a){var z,y,x,w,v,u,t,s
-z=this.v5
+this.Bq=x
+if(this.QN===x)this.OO();++this.Wf},
+qg:function(a){var z,y,x,w,v,u,t,s
+z=this.dr
 y=z.length
 x=y-1
-w=this.av
-v=this.zX
+w=this.QN
+v=this.Bq
 if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
 if(t<0||t>=y)return H.e(z,t)
 v=z[t]
 if(u<0||u>=y)return H.e(z,u)
 z[u]=v}if(w>=y)return H.e(z,w)
 z[w]=null
-this.av=(w+1&x)>>>0
+this.QN=(w+1&x)>>>0
 return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.zX=w
+this.Bq=w
 for(u=a;u!==w;u=s){s=(u+1&x)>>>0
 if(s<0||s>=y)return H.e(z,s)
 v=z[s]
@@ -7814,52 +7896,52 @@
 z[u]=v}if(w<0||w>=y)return H.e(z,w)
 z[w]=null
 return a}},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
+OO:function(){var z,y,x,w
+z=Array(this.dr.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.u3(this,0)])
-z=this.v5
-x=this.av
+z=this.dr
+x=this.QN
 w=z.length-x
 H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
+z=this.QN
+x=this.dr
 H.qG(y,w,w+z,x,0)
-this.av=0
-this.zX=this.v5.length
-this.v5=y},
-Ix:function(a){var z,y,x,w,v
-z=this.av
-y=this.zX
-x=this.v5
+this.QN=0
+this.Bq=this.dr.length
+this.dr=y},
+BR:function(a){var z,y,x,w,v
+z=this.QN
+y=this.Bq
+x=this.dr
 if(z<=y){w=y-z
 H.qG(a,0,w,x,z)
 return w}else{v=x.length-z
 H.qG(a,0,v,x,z)
-z=this.zX
-y=this.v5
+z=this.Bq
+y=this.dr
 H.qG(a,v,v+z,y,0)
-return this.zX+v}},
-Pt:function(a,b){var z=Array(8)
+return this.Bq+v}},
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
-this.v5=H.VM(z,[b])},
+this.dr=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",uay:function(a){var z
+static:{"^":"TNe",ra: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}}}},
 fO:{
-"^":"a;Lz,pP,qT,Dc,fD",
+"^":"a;dk,pP,Wf,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
+z=this.dk
+if(this.Wf!==z.Wf)H.vh(P.a4(z))
 y=this.Dc
 if(y===this.pP){this.fD=null
-return!1}z=z.v5
+return!1}z=z.dr
 x=z.length
 if(y>=x)return H.e(z,y)
 this.fD=z[y]
@@ -7873,8 +7955,8 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
-Nk:function(a,b){var z,y,x
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
+uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
@@ -7887,24 +7969,23 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Rdf",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
+if(b===""){do{x=H.d(z.gl())
+y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
+for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.vM+=x}}return y.vM},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
@@ -7915,30 +7996,30 @@
 do y=z.gl()
 while(z.G())
 return y},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 Vj5:{
 "^":"lfu;"},
 oz:{
-"^":"a;G3>,Bb>,T8>",
+"^":"a;nl>,Bb>,T8>",
 $isoz:true},
 jp:{
-"^":"oz;P*,G3,Bb,T8",
+"^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
+oB:function(a){var z,y,x,w,v,u,t,s
+z=this.og
 if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
+y=this.fu
+for(x=y,w=x,v=null;!0;){v=this.R2(z.nl,a)
 u=J.Wx(v)
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
+v=this.R2(u.nl,a)
+if(J.xZ(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -7947,7 +8028,7 @@
 x=z
 z=s}else{if(u.C(v,0)){u=z.T8
 if(u==null)break
-v=this.yV(u.G3,a)
+v=this.R2(u.nl,a)
 if(J.u6(v,0)){t=z.T8
 z.T8=t.Bb
 t.Bb=z
@@ -7959,71 +8040,71 @@
 x.Bb=z.T8
 z.Bb=y.T8
 z.T8=y.Bb
-this.aY=z
+this.og=z
 y.T8=null
-y.Bb=null;++this.bb
+y.Bb=null;++this.wq
 return v},
-Xu:function(a){var z,y
+nJ:function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
 y.Bb=z}return z},
-bB:function(a){var z,y,x
-if(this.aY==null)return
-if(!J.xC(this.vh(a),0))return
-z=this.aY;--this.J0
+qg:function(a){var z,y,x
+if(this.og==null)return
+if(!J.xC(this.oB(a),0))return
+z=this.og;--this.hm
 y=z.Bb
-if(y==null)this.aY=z.T8
+if(y==null)this.og=z.T8
 else{x=z.T8
-y=this.Xu(y)
-this.aY=y
-y.T8=x}++this.qT
+y=this.nJ(y)
+this.og=y
+y.T8=x}++this.Wf
 return z},
-K8:function(a,b){var z,y;++this.J0;++this.qT
-if(this.aY==null){this.aY=a
+Oa:function(a,b){var z,y;++this.hm;++this.Wf
+if(this.og==null){this.og=a
 return}z=J.u6(b,0)
-y=this.aY
+y=this.og
 if(z){a.Bb=y
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
+y.Bb=null}this.og=a}},
 Ba:{
-"^":"vX1;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Xy:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
+"^":"vX1;V2s,lO,og,fu,hm,Wf,wq",
+L4:function(a,b){return this.V2s.$2(a,b)},
+Bc:function(a){return this.lO.$1(a)},
+R2:function(a,b){return this.L4(a,b)},
 t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Xy(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
+if(this.Bc(b)!==!0)return
+if(this.og!=null)if(J.xC(this.oB(b),0))return this.og.P
 return},
 Rz:function(a,b){var z
-if(this.Xy(b)!==!0)return
-z=this.bB(b)
+if(this.Bc(b)!==!0)return
+z=this.qg(b)
 if(z!=null)return z.P
 return},
 u:function(a,b,c){var z
 if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
+z=this.oB(b)
+if(J.xC(z,0)){this.og.P=c
+return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
 FV:function(a,b){H.bQ(b,new P.QG(this))},
-gl0:function(a){return this.aY==null},
-gor:function(a){return this.aY!=null},
+gl0:function(a){return this.og==null},
+gor:function(a){return this.og!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
+y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Wf,this.wq,null),[z])
+y.Dd(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-this.J0=0;++this.qT},
-x4:function(a,b){return this.Xy(b)===!0&&J.xC(this.vh(b),0)},
+b.$2(z.gnl(x),z.gP(x))}},
+gB:function(a){return this.hm},
+V1:function(a){this.og=null
+this.hm=0;++this.Wf},
+NZ:function(a,b){return this.Bc(b)===!0&&J.xC(this.oB(b),0)},
 gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
-gUQ:function(a){var z=new P.ro(this)
+gUQ:function(a){var z=new P.JO(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
 $asT8:null,
@@ -8033,7 +8114,7 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -8041,419 +8122,523 @@
 "^":"Xs;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
-gl:function(){var z=this.ya
+gl:function(){var z=this.Ju
 if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
+return this.Gf(z)},
+Zq:function(a){var z
+for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
+z=this.OC
+if(this.Wf!==z.Wf)throw H.b(P.a4(z))
+y=this.x5
+if(y.length===0){this.Ju=null
+return!1}if(z.wq!==this.wq&&this.Ju!=null){x=this.Ju
 C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+if(x==null)this.Zq(z.og)
+else{z.oB(x.nl)
+this.Zq(z.og.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
-this.ya=z
-this.Az(z.T8)
+this.Ju=z
+this.Zq(z.T8)
 return!0},
-Qf:function(a,b){this.Az(a.aY)}},
+Dd:function(a,b){this.Zq(a.og)}},
 nF:{
-"^":"mW;lT",
-gB:function(a){return this.lT.J0},
-gl0:function(a){return this.lT.J0===0},
+"^":"mW;OC",
+gB:function(a){return this.OC.hm},
+gl0:function(a){return this.OC.hm===0},
 gA:function(a){var z,y
-z=this.lT
-y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
+z=this.OC
+y=new P.DN(z,H.VM([],[P.oz]),z.Wf,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.u3(this,0))
+y.Dd(z,H.u3(this,0))
 return y},
 $isyN:true},
-ro:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.J0},
-gl0:function(a){return this.Fb.J0===0},
+JO:{
+"^":"mW;ZD",
+gB:function(a){return this.ZD.hm},
+gl0:function(a){return this.ZD.hm===0},
 gA:function(a){var z,y
-z=this.Fb
-y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
+z=this.ZD
+y=new P.ZM(z,H.VM([],[P.oz]),z.Wf,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.u3(this,1))
+y.Dd(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a},
+$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
+VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
+KH:function(a){var z
+if(a==null)return
+if(typeof a!="object")return a
+if(Object.getPrototypeOf(a)!==Array.prototype)return new P.r4(a,Object.create(null),null)
+for(z=0;z<a.length;++z)a[z]=P.KH(a[z])
+return a},
 jc: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","Jn",2,0,49,50],
-JC:{
-"^":"Xs:80;",
-$2:function(a,b){return b},
-$isEH:true},
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+else return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
-"^":"Xs:13;a",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Xs:12;a",
+$1:function(a){var z,y,x,w,v,u
 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]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-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},
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+return a}z=Object.create(null)
+x=new P.r4(a,z,null)
+w=x.KN()
+for(v=this.a,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.PF=z
+return x},
 $isEH:true},
-Ukr:{
+r4:{
+"^":"a;PF,LK,Mq",
+t:function(a,b){var z,y
+z=this.LK
+if(z==null)return this.Mq.t(0,b)
+else if(typeof b!=="string")return
+else{y=z[b]
+return typeof y=="undefined"?this.fb(b):y}},
+gB:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z},
+gl0:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z===0},
+gor:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z>0},
+gvc:function(a){var z
+if(this.LK==null){z=this.Mq
+return z.gvc(z)}z=this.KN()
+return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+gUQ:function(a){var z
+if(this.LK==null){z=this.Mq
+return z.gUQ(z)}return H.fR(this.KN(),new P.A5(this),null,null)},
+u:function(a,b,c){var z,y
+if(this.LK==null)this.Mq.u(0,b,c)
+else if(this.NZ(0,b)){z=this.LK
+z[b]=c
+y=this.PF
+if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
+FV:function(a,b){H.bQ(b,new P.E5(this))},
+NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
+if(typeof b!=="string")return!1
+return Object.prototype.hasOwnProperty.call(this.PF,b)},
+to:function(a,b,c){var z
+if(this.NZ(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
+Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
+return this.tZ().Rz(0,b)},
+V1:function(a){var z
+if(this.LK==null)this.Mq.V1(0)
+else{z=this.Mq
+if(z!=null)J.Z8(z)
+this.LK=null
+this.PF=null
+this.Mq=P.Fl(null,null)}},
+aN:function(a,b){var z,y,x,w
+if(this.LK==null)return this.Mq.aN(0,b)
+z=this.KN()
+for(y=0;y<z.length;++y){x=z[y]
+w=this.LK[x]
+if(typeof w=="undefined"){w=P.KH(this.PF[x])
+this.LK[x]=w}b.$2(x,w)
+if(z!==this.Mq)throw H.b(P.a4(this))}},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+KN:function(){var z=this.Mq
+if(z==null){z=Object.keys(this.PF)
+this.Mq=z}return z},
+tZ:function(){var z,y,x,w,v
+if(this.LK==null)return this.Mq
+z=P.Fl(null,null)
+y=this.KN()
+for(x=0;w=y.length,x<w;++x){v=y[x]
+z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
+else C.Nm.sB(y,0)
+this.LK=null
+this.PF=null
+this.Mq=z
+return z},
+fb:function(a){var z
+if(!Object.prototype.hasOwnProperty.call(this.PF,a))return
+z=P.KH(this.PF[a])
+return this.LK[a]=z},
+$isFo:true,
+$asFo:function(){return[null,null]},
+$isT8:true,
+$asT8:function(){return[null,null]}},
+A5:{
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
+$isEH:true},
+E5:{
+"^":"Xs:81;a",
+$2:function(a,b){this.a.u(0,a,b)},
+$isEH:true},
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-l6:{
-"^":"XS;Pc,FN",
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+AJ:{
+"^":"XS;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"$0","gAY",0,0,71],
-static:{Gy:function(a,b){return new P.l6(a,b)}}},
+else return"Converting object did not return an encodable object."},"$0","gCR",0,0,73],
+static:{Gy:function(a,b){return new P.AJ(a,b)}}},
 K8:{
-"^":"l6;Pc,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
+"^":"AJ;Ct,FN",
+bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;qa<,q4",
-pW:function(a,b){return P.jc(a,this.gP1().qa)},
-kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
+"^":"Uk;qa<,Ha",
+cW:function(a,b){return P.jc(a,this.gP1().qa)},
+iQ:function(a){return this.cW(a,null)},
+N7:function(a,b){var z=this.gZE()
+return P.Vg(a,z.Wl,z.UM)},
+KP:function(a){return this.N7(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
-"^":"wIe;UM,SI",
+"^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
 c5:{
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;q4,cP,ol",
-iY:function(a){return this.q4.$1(a)},
+"^":"a;Ha,qR,SK",
+HT:function(a){return this.Ha.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cP
+x=this.qR
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
 if(u>92)continue
 if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
+x.IN+=t}w=v+1
 t=H.mx(92)
-x.vM+=t
+x.IN+=t
 switch(u){case 8:t=H.mx(98)
-x.vM+=t
+x.IN+=t
 break
 case 9:t=H.mx(116)
-x.vM+=t
+x.IN+=t
 break
 case 10:t=H.mx(110)
-x.vM+=t
+x.IN+=t
 break
 case 12:t=H.mx(102)
-x.vM+=t
+x.IN+=t
 break
 case 13:t=H.mx(114)
-x.vM+=t
+x.IN+=t
 break
 default:t=H.mx(117)
-x.vM+=t
+x.IN+=t
 t=H.mx(48)
-x.vM+=t
+x.IN+=t
 t=H.mx(48)
-x.vM+=t
+x.IN+=t
 t=u>>>4&15
 t=H.mx(t<10?48+t:87+t)
-x.vM+=t
+x.IN+=t
 t=u&15
 t=H.mx(t<10?48+t:87+t)
-x.vM+=t
+x.IN+=t
 break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
+x.IN+=t}w=v+1
 t=H.mx(92)
-x.vM+=t
+x.IN+=t
 t=H.mx(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
+x.IN+=t}}if(w===0)x.KF(a)
+else if(w<y)x.KF(z.Nj(a,w,y))},
 WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
+for(z=this.SK,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
-try{z=this.iY(a)
+try{z=this.HT(a)
 if(!this.Jc(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
+throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.Gy(a,y))}}},
-Jc:function(a){var z,y,x,w,v,u
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cP.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cP.KF("true")
-return!0}else if(a===!1){this.cP.KF("false")
-return!0}else if(a==null){this.cP.KF("null")
-return!0}else if(typeof a==="string"){z=this.cP
+Jc:function(a){var z,y,x,w
+z={}
+if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+this.qR.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.qR.KF("true")
+return!0}else if(a===!1){this.qR.KF("false")
+return!0}else if(a==null){this.qR.KF("null")
+return!0}else if(typeof a==="string"){z=this.qR
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.cP
-y.KF("[")
-if(z.gB(a)>0){this.rl(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.rl(z.t(a,x))}}y.KF("]")
-this.pg(a)
-return!0}else if(!!z.$isT8){this.WD(a)
-y=this.cP
-y.KF("{")
-for(w=J.mY(z.gvc(a)),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.rl(z.t(a,u))}y.KF("}")
-this.pg(a)
+return!0}else{y=J.x(a)
+if(!!y.$isWO){this.WD(a)
+z=this.qR
+z.KF("[")
+if(y.gB(a)>0){this.rl(y.t(a,0))
+for(x=1;x<y.gB(a);++x){z.IN+=","
+this.rl(y.t(a,x))}}z.KF("]")
+this.E5(a)
+return!0}else if(!!y.$isT8){this.WD(a)
+w=this.qR
+w.KF("{")
+z.a="\""
+y.aN(a,new P.tF(z,this))
+w.KF("}")
+this.E5(a)
 return!0}else return!1}},
-pg:function(a){var z=this.ol
+E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,dH,BLm,KQz,Ho,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,dH,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-return z.vM}}},
-z0:{
-"^":"Ziv;IE",
+return z.IN}}},
+tF:{
+"^":"Xs:82;a,b",
+$2:[function(a,b){var z,y,x
+z=this.b
+y=z.qR
+x=this.a
+y.KF(x.a)
+x.a=",\""
+z.Ip(a)
+y.KF("\":")
+z.rl(b)},"$2",null,4,0,null,79,20,"call"],
+$isEH:true},
+u5F:{
+"^":"Ziv;QA",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
 "^":"wIe;",
-WJ:function(a){var z,y,x
+Sw: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=Array(y)
+y.fixed$length=init
+y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.Hn(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.mJ)},
+if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.Hn(z.gB(a),1)),0)
+return C.Nm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;So,mJ,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.mJ
+"^":"a;F6,o9,Zj",
+O6:function(a,b){var z,y,x,w,v
+z=this.Zj
+y=this.o9
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.mJ=w
+this.o9=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.mJ=y
+this.o9=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.mJ=w
+this.o9=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.mJ=w+1
+this.o9=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.mJ=w
+this.o9=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.mJ=y
+this.o9=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.mJ=y+1
+this.o9=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
-rw:function(a,b,c){var z,y,x,w,v,u,t,s
+Gx:function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.Pp(a,J.Hn(c,1))&64512)===55296)c=J.Hn(c,1)
 if(typeof c!=="number")return H.s(c)
-z=this.IT
+z=this.Zj
 y=z.length
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.mJ
+if(v<=127){u=this.o9
 if(u>=y)break
-this.mJ=u+1
-z[u]=v}else if((v&64512)===55296){if(this.mJ+3>=y)break
+this.o9=u+1
+z[u]=v}else if((v&64512)===55296){if(this.o9+3>=y)break
 t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.mJ
+if(this.O6(v,x.j(a,t)))w=t}else if(v<=2047){u=this.o9
 s=u+1
 if(s>=y)break
-this.mJ=s
+this.o9=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.mJ=s+1
-z[s]=128|v&63}else{u=this.mJ
+this.o9=s+1
+z[s]=128|v&63}else{u=this.o9
 if(u+2>=y)break
 s=u+1
-this.mJ=s
+this.o9=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.mJ=u
+this.o9=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.mJ=u+1
+this.o9=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;IE",
-WJ:function(a){var z,y
+"^":"wIe;QA",
+Sw:function(a){var z,y
 z=P.p9("")
-y=new P.LD(this.IE,z,!0,0,0,0)
+y=new P.Dd(this.QA,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-return z.vM},
+return z.IN},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
-LD:{
-"^":"a;IE,ZB,AX,FU,kN,NY",
+Dd:{
+"^":"a;QA,C4,YN,FU,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IE!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
-this.ZB.KF(H.mx(65533))
+fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
+this.C4.KF(H.mx(65533))
 this.FU=0
-this.kN=0
-this.NY=0}},
-ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=this.FU
-x=this.kN
-w=this.NY
-z.a=0
+this.rw=0
+this.pt=0}},
+ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=this.FU
+y=this.rw
+x=this.pt
 this.FU=0
-this.kN=0
-this.NY=0
-v=new P.zC(z,this,a)
-$loop$0:for(u=this.ZB,t=this.IE!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
+this.rw=0
+this.pt=0
+w=new P.wh(c)
+v=new P.yn(this,a,b,c)
+$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
-this.AX=!1
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.YN=!1
 p=H.mx(65533)
-u.vM+=p
-x=0
-break $multibyte$2}else{y=(y<<6|p.i(q,63))>>>0;--x;++r}}while(x>0)
-p=w-1
+u.IN+=p
+y=0
+break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
+p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16)))
-y=65533
-x=0
-w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16)))
-y=65533}if(!this.AX||y!==65279){p=H.mx(y)
-u.vM+=p}this.AX=!1}}for(;r<c;r=o){o=r+1
+if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+z=65533
+y=0
+x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+z=65533}if(!this.YN||z!==65279){p=H.mx(z)
+u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
+if(J.xZ(o,0)){this.YN=!1
+if(typeof o!=="number")return H.s(o)
+n=r+o
+v.$2(r,n)
+if(n===c)break
+r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){n=z.a
-if(n>0){m=o-1
-v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16)))
+if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
-u.vM+=p}else if(p.E(q,127)){this.AX=!1;++z.a}else{n=z.a
-if(n>0){m=o-1
-v.$2(m-n,m)}if(p.i(q,224)===192){y=p.i(q,31)
+u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
+y=1
 x=1
-w=1
-continue $loop$0}if(p.i(q,240)===224){y=p.i(q,15)
+continue $loop$0}if(p.i(q,240)===224){z=p.i(q,15)
+y=2
 x=2
-w=2
-continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){y=p.i(q,7)
+continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
+y=3
 x=3
-w=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
-this.AX=!1
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.YN=!1
 p=H.mx(65533)
-u.vM+=p
-y=65533
-x=0
-w=0}}break $loop$0}z=z.a
-if(z>0)v.$2(r-z,c)
-if(x>0){this.FU=y
-this.kN=x
-this.NY=w}},
+u.IN+=p
+z=65533
+y=0
+x=0}}break $loop$0}if(y>0){this.FU=z
+this.rw=y
+this.pt=x}},
 static:{"^":"ADi"}},
-zC:{
-"^":"Xs:133;a,b,c",
+wh:{
+"^":"Xs:136;a",
+$2:function(a,b){var z,y,x,w
+z=this.a
+for(y=J.U6(a),x=b;x<z;++x){w=y.t(a,x)
+if(J.mQ(w,127)!==w)return x-b}return z-b},
+$isEH:true},
+yn:{
+"^":"Xs:137;b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.ZB.KF(P.nB(x))
-else y.ZB.KF(P.nB(J.Fd(x,a,b)))
-this.a.a=0},
-$isEH:true}}],["dart.core","dart:core",,P,{
+if(z)y.C4.KF(P.HM(x))
+else y.C4.KF(P.HM(J.Fd(x,a,b)))},
+$isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,51,46,47],
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
 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="\""
+z.IN="\""
 for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
+if(v<=31)if(v===10)w=z.IN+="\\n"
+else if(v===13)w=z.IN+="\\r"
+else if(v===9)w=z.IN+="\\t"
+else{w=z.IN+="\\x"
+if(v<16)z.IN=w+"0"
+else{z.IN=w+"1"
 v-=16}w=H.mx(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
+w=z.IN+=w}else if(v===92)w=z.IN+="\\\\"
+else if(v===34)w=z.IN+="\\\""
 else{w=H.mx(v)
-w=z.vM+=w}}y=w+"\""
-z.vM=y
+w=z.IN+=w}}y=w+"\""
+z.IN=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+kC:[function(a,b){return a==null?b==null:a===b},"$2","Bx",4,0,54],
+NS:[function(a){return H.CU(a)},"$1","cEg",2,0,55],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -8463,18 +8648,18 @@
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
-if(y==null)H.qw(z)
+if(y==null)H.Af(z)
 else y.$1(z)},
-nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.u(0,a.gOB(a),b)},
 $isEH:true},
 CL:{
-"^":"Xs:134;a",
+"^":"Xs:138;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(J.ro(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b));++z.b},
 $isEH:true},
@@ -8485,12 +8670,12 @@
 fRn:{
 "^":"a;"},
 iP:{
-"^":"a;y3<,aL",
+"^":"a;rq<,aL",
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.FW(this.y3,b.gy3())},
-giO:function(a){return this.y3},
+return J.xC(this.rq,b.rq)&&this.aL===b.aL},
+iM:function(a,b){return J.FW(this.rq,b.grq())},
+giO:function(a){return this.rq},
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.aL
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
@@ -8501,15 +8686,15 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,71],
-h:function(a,b){return P.Wu(J.WB(this.y3,b.gVs()),this.aL)},
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
+h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
 EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
+RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
-if(z!=null){y=new P.MF()
-x=z.QK
+static:{"^":"Oj2,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+if(z!=null){y=new P.mw()
+x=z.pX
 if(1>=x.length)return H.e(x,1)
 w=H.BU(x[1],null,null)
 if(2>=x.length)return H.e(x,2)
@@ -8523,7 +8708,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.LL(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -8540,7 +8725,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.Hn(s,n*l)}k=!0}else k=!1
 j=H.fu(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)
+if(j==null)throw H.b(P.cD("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -8552,13 +8738,13 @@
 if(a>=10)return"0"+a
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
-MF:{
-"^":"Xs:135;",
+mw:{
+"^":"Xs:139;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Xs:136;",
+"^":"Xs:140;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8567,36 +8753,38 @@
 $isVf:true},
 "+double":0,
 a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),0,0,0)},
+"^":"a;m5<",
+g:function(a,b){return P.ii(0,0,this.m5+b.gm5(),0,0,0)},
+W:function(a,b){return P.ii(0,0,this.m5-b.gm5(),0,0,0)},
 U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
+return P.ii(0,0,C.CD.yu(C.CD.RE(this.m5*b)),0,0,0)},
 Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
 if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
+return P.ii(0,0,C.CD.Z(this.m5,b),0,0,0)},
+C:function(a,b){return this.m5<b.gm5()},
+D:function(a,b){return this.m5>b.gm5()},
+E:function(a,b){return this.m5<=b.gm5()},
+F:function(a,b){return this.m5>=b.gm5()},
+gVs:function(){return C.CD.BU(this.m5,1000)},
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
+return this.m5===b.m5},
+giO:function(a){return this.m5&0x1FFFFFFF},
+iM:function(a,b){return C.CD.iM(this.m5,b.gm5())},
 bu:[function(a){var z,y,x,w,v
 z=new P.DW()
-y=this.Fq
+y=this.m5
 if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
+x=z.$1(C.CD.JV(C.CD.BU(y,60000000),60))
+w=z.$1(C.CD.JV(C.CD.BU(y,1000000),60))
 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)},"$0","gAY",0,0,71],
+return H.d(C.CD.BU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,73],
+Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
+J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Xs:15;",
+"^":"Xs:14;",
 $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)
@@ -8605,106 +8793,145 @@
 return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"Xs:15;",
+"^":"Xs:14;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gAY",0,0,71]},
+bu:[function(a){return"Throw of null."},"$0","gCR",0,0,73]},
 OY:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gAY",0,0,71],
+return"Illegal argument(s)"},"$0","gCR",0,0,73],
 static:{u:function(a){return new P.OY(a)}}},
 Sn:{
 "^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
+bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
 static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
 JS:{
-"^":"XS;uF,UP,mP,SA,FZ",
+"^":"XS;uF,vI,mP,ae,wI",
 bu:[function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
 for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.vM+=", "}v=z.a
+v.IN+=", "}v=z.a
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,71],
+v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gCR",0,0,73],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,71],
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,73],
 $isXS:true,
 static:{nO:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"Bad state: "+this.G1},"$0","gCR",0,0,73],
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"XS;YA",
 bu:[function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,73],
 static:{a4:function(a){return new P.UV(a)}}},
 k5C:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
+bu:[function(a){return"Out of Memory"},"$0","gCR",0,0,73],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,71],
+bu:[function(a){return"Stack Overflow"},"$0","gCR",0,0,73],
 gI4:function(){return},
 $isXS:true},
 t7:{
 "^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,71],
+bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gCR",0,0,73],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
 bu:[function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
+return"Exception: "+H.d(z)},"$0","gCR",0,0,73]},
 oe:{
-"^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{cD:function(a){return new P.oe(a)}}},
+"^":"a;G1>,FF>,D7>",
+bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.G1
+y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
+x=this.D7
+w=this.FF
+if(typeof w!=="string")return x!=null?y+(" (at offset "+H.d(x)+")"):y
+if(x!=null)if(!(x<0)){z=J.q8(w)
+if(typeof z!=="number")return H.s(z)
+z=x>z}else z=!0
+else z=!1
+if(z)x=null
+if(x==null){z=J.U6(w)
+if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(r===10){if(u!==s||t!==!0)++v
+u=s+1
+t=!1}else if(r===13){++v
+u=s+1
+t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
+q=z.gB(w)
+s=x
+while(!0){p=z.gB(w)
+if(typeof p!=="number")return H.s(p)
+if(!(s<p))break
+r=z.j(w,s)
+if(r===10||r===13){q=s
+break}++s}p=J.Wx(q)
+if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+n=u
+m=""
+l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+o=q
+l=""}else{n=x-36
+o=x+36
+l="..."}m="..."}else{o=q
+n=u
+m=""
+l=""}k=z.Nj(w,n,o)
+if(typeof n!=="number")return H.s(n)
+return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
+bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
 static:{ts:function(){return new P.eV()}}},
 qo:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
-u:function(a,b,c){var z=H.of(b,"expando$values")
+bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
+t:function(a,b){var z=H.vA(b,"expando$values")
+return z==null?null:H.vA(z,this.V2())},
+u:function(a,b,c){var z=H.vA(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
+H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
+V2:function(){var z,y
+z=H.vA(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
 H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
+static:{"^":"bZT,rly,Km"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -8716,7 +8943,7 @@
 "^":"a;",
 $isQV:true,
 $asQV:null},
-Dk:{
+Anv:{
 "^":"a;"},
 WO:{
 "^":"a;",
@@ -8732,7 +8959,7 @@
 $asT8:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gAY",0,0,71]},
+bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
 FK:{
 "^":"a;",
@@ -8742,87 +8969,77 @@
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"$0","gAY",0,0,71],
+bu:[function(a){return H.a5(this)},"$0","gCR",0,0,73],
 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.wO(this),null)},
 $isa:true},
 ns:{
 "^":"a;",
 $isns:true},
-Jb:{
+Ol:{
 "^":"mW;",
-$isJb:true,
+$isOl:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.mD()
-else{z=H.mD()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}},
+"^":"a;n2,Mw",
+wE:function(a){var z,y
+z=this.n2==null
+if(!z&&this.Mw==null)return
+y=$.hG
+if(z)this.n2=y.$0()
+else{this.n2=J.Hn(y.$0(),J.Hn(this.Mw,this.n2))
+this.Mw=null}},
 CH:function(a){var z
-if(this.yz==null)return
-z=H.mD()
-this.yz=z
-if(this.wj!=null)this.wj=z},
+if(this.n2==null)return
+z=$.hG.$0()
+this.n2=z
+if(this.Mw!=null)this.Mw=z},
 giU:function(){var z,y
-z=this.yz
+z=this.n2
 if(z==null)return 0
-y=this.wj
-if(y==null){z=H.mD()
-y=this.yz
-if(typeof y!=="number")return H.s(y)
-y=z-y
-z=y}else{if(typeof y!=="number")return y.W()
-if(typeof z!=="number")return H.s(z)
-z=y-z}return z}},
+y=this.Mw
+return y==null?J.Hn($.hG.$0(),this.n2):J.Hn(y,z)},
+static:{"^":"Ji"}},
 qU:{
 "^":"a;",
 $isqU:true},
 "+String":0,
-WU:{
-"^":"a;Cb,R0,C3,Wn",
-gl:function(){return this.Wn},
+Xa:{
+"^":"a;Cb,R0,So,ft",
+gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.So
 this.R0=z
 y=this.Cb
 x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
+if(z===x.gB(y)){this.ft=null
 return!1}w=x.j(y,this.R0)
 v=this.R0+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
-if((u&64512)===56320){this.C3=v+1
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
+if((u&64512)===56320){this.So=v+1
+this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
+return!0}}this.So=v
+this.ft=w
 return!0}},
 Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
+"^":"a;IN<",
+gB:function(a){return this.IN.length},
+gl0:function(a){return this.IN.length===0},
+gor:function(a){return this.IN.length!==0},
+KF:function(a){this.IN+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
 z=J.mY(a)
 if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
+if(b.length===0){do{y=z.gl()
+this.IN+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
+for(;z.G();){this.IN+=b
 y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:[function(a){return this.vM},"$0","gAY",0,0,71],
-PD:function(a){if(typeof a==="string")this.vM=a
+this.IN+=typeof y==="string"?y:H.d(y)}}},
+V1:function(a){this.IN=""},
+bu:[function(a){return this.IN},"$0","gCR",0,0,73],
+PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
@@ -8834,30 +9051,23 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,mn,pO,Fi,ku,tP,BJ,ldN,yWg",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.mn,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.mn},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.bm()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-yM:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.mB(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
+"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z=this.Kk
+if(z==null)return""
+if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+return z},
+gtp:function(a){var z=this.QB
+if(z==null)return P.bG(this.Fi)
+return z},
+gIi:function(a){return this.Ee},
+pi:function(a,b){if(a==="")return"/"+b
+return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
+jI:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
+return C.xB.OY(a,"/.")!==-1},
+jn:function(a){var z,y,x,w,v
+if(!this.jI(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.Ff
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -8867,242 +9077,364 @@
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y
+bu:[function(a){var z,y,x,w
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
+z.KF(":")}x=this.Kk
+w=x==null
+if(!w||C.xB.nC(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.mn,0)){z.KF(":")
-z.KF(J.AG(this.mn))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"$0","gAY",0,0,71],
-n:function(a,b){var z,y,x
+if(C.xB.gor(y)){z.KF(y)
+z.KF("@")}if(!w)z.KF(x)
+y=this.QB
+if(y!=null){z.KF(":")
+z.KF(y)}}z.KF(this.Ee)
+y=this.xu
+if(y!=null){z.KF("?")
+z.KF(y)}y=this.ys
+if(y!=null){z.KF("#")
+z.KF(y)}return z.IN},"$0","gCR",0,0,73],
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)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.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
+z=z.gtp(b)
+if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+y=z==null
+x=b.xu
+w=x==null
+if(!y===!w){if(y)z=""
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+y=z==null
+x=b.ys
+w=x==null
+if(!y===!w){if(y)z=""
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
-giO:function(a){var z=new P.Wf()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.mn=0
-else if(h==="https"&&J.xC(e,443))this.mn=0
-else this.mn=e
-this.pO=this.x6(c,d)},
+giO:function(a){var z,y,x,w,v
+z=new P.XZ()
+y=this.gJf(this)
+x=this.gtp(this)
+w=this.xu
+if(w==null)w=""
+v=this.ys
+return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,pkL,lM,FsP,qfW,dRC,u0I,TGN,OP,c4,Fm,Bx,Hiw,H5t,zst,VFG,nJd,SpW,GPf,JA7,yw1,SQU,fbQ",hK:function(a0){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
-x=new P.OF()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.mKy,q)
-q=(C.mKy[q]&C.jn.KI(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.KU(h)
-z=new P.q5(P.L7(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-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.RD(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.RD(a)
-return"["+a+"]"}}return a},KU:function(a){var z,y,x,w,v,u
-z=new P.Mr()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.mKy,u)
-u=(C.mKy[u]&C.jn.KI(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
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,c4,Fm,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+if(a==="https")return 443
+return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z={}
+z.a=""
+z.b=""
+z.c=null
+z.d=null
+z.e=0
+z.f=-1
+w=a.length
+v=0
+while(!0){if(!(v<w)){y=0
+x=0
+break}if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35){y=0
+x=0
+break}if(u===47){x=v===0?2:1
+y=0
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+z.a=P.iy(a,v);++v
+if(v===w){z.f=-1
+x=0}else{if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35)x=0
+else x=u===47?2:1}y=v
+break}++v
+z.f=-1}z.e=v
+if(x===2){t=v+1
+z.e=t
+if(t===w){z.f=-1
+x=0}else{u=C.xB.j(a,t)
+z.f=u
+if(u===47){++z.e
+new P.BH(z,a,-1).$0()
+y=z.e}s=z.f
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+u=a.charCodeAt(s)
+z.f=u
+if(u===63||u===35)break
+z.f=-1}s=z.a
+r=z.c
+q=P.qd(a,y,z.e,null,r!=null,s==="file")
+s=z.f
+if(s===63){p=C.xB.XU(a,"#",z.e+1)
+s=z.e+1
+if(p<0){o=P.AN(a,s,w,null)
+n=null}else{o=P.AN(a,s,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+o=null}w=z.a
+s=z.b
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return a},L7:function(a,b,c,d){var z,y
+if(a==null)return
+if(b===c)return""
+if(C.xB.j(a,b)===91){z=c-1
+if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+P.eg(a,b+1,z)
+return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+if(a.charCodeAt(y)===58){P.eg(a,b,c)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.IN=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+if(v){t=C.xB.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.IN+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.IN=""}if(y<z){v=C.xB.Nj(a,y,z)
+x.toString
+x.IN=x.IN+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
+if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.IN=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+v=P.mC(u)
+x.IN+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
+if(b===0)return""
+a.toString
+z=a.length
+if(0>=z)H.vh(P.N(0))
+y=a.charCodeAt(0)
+x=y>=97
+if(!(x&&y<=122))w=y>=65&&y<=90
+else w=!0
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
+t=a.charCodeAt(u)
+if(t<128){s=t>>>4
+if(s>=8)return H.e(C.qq,s)
+s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
+if(w&&v)x=!1}a=J.Nj(a,0,b)
+return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
+return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
+z=a==null
+if(z&&!0)return f?"/":""
+z=!z
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(C.xB.gl0(y)){if(f)return"/"}else if((f||e)&&C.xB.j(y,0)!==47)return"/"+y
+return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
-if(y&&!0)return""
+if(y&&!0)return
 y=!y
-if(y);if(y)return P.Xc(a)
+if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(b,new P.Ue(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).Mw(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.QB()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.mx(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.mx(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.mx(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-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)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+C.jN.aN(d,new P.Ue(z,x))
+return x.IN},o6:function(a,b,c){if(a==null)return
+return P.Xc(a,b,c,C.o5)},wW:function(a){if(57>=a)return 48<=a
+a|=32
+return 97<=a&&102>=a},Qw:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+z=b+2
+y=a.length
+if(z>=y)return"%"
+x=b+1
+a.toString
+if(x<0)H.vh(P.N(x))
+if(x>=y)H.vh(P.N(x))
+w=a.charCodeAt(x)
+if(z<0)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(!P.wW(w)||!P.wW(v))return"%"
+u=P.Qw(w)*16+P.Qw(v)
+if(u<127){z=C.jn.wG(u,4)
+if(z>=8)return H.e(C.B2,z)
+z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
+if(a<128){z=Array(3)
+z.fixed$length=init
+z[0]=37
+y=a>>>4
+if(y>=16)H.vh(P.N(y))
+z[1]="0123456789ABCDEF".charCodeAt(y)
+z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
+w=4}else{x=224
+w=3}else{x=192
+w=2}y=3*w
+z=Array(y)
+z.fixed$length=init
+for(v=0;--w,w>=0;x=128){u=C.jn.PK(a,6*w)&63|x
+if(v>=y)return H.e(z,v)
+z[v]=37
+t=v+1
+s=u>>>4
+if(s>=16)H.vh(P.N(s))
+s="0123456789ABCDEF".charCodeAt(s)
+if(t>=y)return H.e(z,t)
+z[t]=s
+s=v+2
+t="0123456789ABCDEF".charCodeAt(u&15)
+if(s>=y)return H.e(z,s)
+z[s]=t
+v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(v<127){u=v>>>4
+if(u>=8)return H.e(d,u)
+u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
+continue}if("%"===t){t="%25"
+s=1}else s=3}else{if(v<=93){u=v>>>4
+if(u>=8)return H.e(C.rz,u)
+u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
+if(u){P.iV(a,z,"Invalid character")
+t=null
+s=null}else{if((v&64512)===55296){u=z+1
+if(u<c){if(u<0)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
+r=a.charCodeAt(u)
+if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
+s=2}else s=1}else s=1}else s=1
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.IN=""}w=C.xB.Nj(a,y,z)
+x.toString
+x.IN=x.IN+w
+x.IN+=typeof t==="string"?t:H.d(t)
+if(typeof s!=="number")return H.s(s)
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 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.to(z)),[null,null]).br(0)},RD:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
+return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+if(c==null)c=J.q8(a)
+z=new P.x8(a)
+y=new P.JTs(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
+w=b
+u=b
+t=!1
+while(!0){s=c
 if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
+if(!(u<s))break
 s=a
+s.toString
+if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
+if(u>=r)H.vh(P.N(u))
+if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
+s.toString
+if(u<0)H.vh(P.N(u))
+if(u>=J.q8(s))H.vh(P.N(u))
+if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
+w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
 J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
+t=!0}else J.bi(x,y.$2(w,u))
+w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
+q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(J.UQ(v,0),8)
+if(q&&!p)z.$2("expected a part after last `:`",c)
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+try{v=P.Dy(J.Nj(a,w,c))
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.lf(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.bi(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.oA(x,new P.EY(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
+z.$2("invalid end of IPv6 address.",w)}}if(t){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")
+n=Array(16)
+n.$builtinTypeInfo=[P.KN]
+u=0
+m=0
+while(!0){s=J.q8(x)
+if(typeof s!=="number")return H.s(s)
+if(!(u<s))break
+l=J.UQ(x,u)
+s=J.x(l)
+if(s.n(l,-1)){k=9-J.q8(x)
+for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
+n[m]=0
+s=m+1
+if(s>=16)return H.e(n,s)
+n[s]=0
+m+=2}}else{r=s.m(l,8)
+if(m<0||m>=16)return H.e(n,m)
+n[m]=r
+r=m+1
+s=s.i(l,255)
+if(r>=16)return H.e(n,r)
+n[r]=s
+m+=2}++u}return n},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)
+x=c.gZE().Sw(b)
 for(w=0;w<x.length;++w){v=x[w]
 u=J.Wx(v)
 if(u.C(v,128)){t=u.m(v,4)
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.KI(1,u.i(v,15)))!==0}else t=!1
+t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
 if(t){u=H.mx(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.mx(43)
-y.vM+=u}else{u=H.mx(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM},oh:function(a,b){var z,y,x,w
+y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
+y.IN+=u}else{u=H.mx(37)
+y.IN+=u
+z.$2(v,y)}}return y.IN},oh:function(a,b){var z,y,x,w
 for(z=J.rY(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9116,7 +9448,7 @@
 if(!(x<w&&y))break
 v=z.j(a,x)
 y=v!==37&&v!==43;++x}if(y)if(b===C.xM||!1)return a
-else u=z.gYC(a)
+else u=z.gNq(a)
 else{u=[]
 x=0
 while(!0){w=z.gB(a)
@@ -9129,36 +9461,53 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.oh(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.IE
-return new P.GY(t).WJ(u)}}},
-OF:{
-"^":"Xs:137;",
-$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.KI(1,a&15))!==0}else z=!1
-return z},
+else u.push(v);++x}}t=b.QA
+return new P.GY(t).Sw(u)}}},
+hP2:{
+"^":"Xs:141;",
+$1:function(a){a.C(0,128)
+return!1},
 $isEH:true},
-Uo:{
-"^":"Xs:138;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+BH:{
+"^":"Xs:17;a,b,c",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=this.a
+y=z.e
+x=this.b
+w=x.length
+if(y===w){z.f=this.c
+return}z.f=J.Pp(x,y)
+for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+r=x.charCodeAt(s)
+z.f=r
+if(r===47||r===63||r===35)break
+if(r===64){t=z.e
+u=-1}else if(r===58)u=z.e
+else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+if(q===-1){z.e=w
+z.f=v
+u=-1
+break}else z.e=q
+u=-1}++z.e
+z.f=v}p=z.e
+if(t>=0){z.b=P.ua(x,y,t)
+y=t+1}if(u>=0){o=u+1
+if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
+m=x.charCodeAt(o)
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
+n=n*10+(m-48)}else n=null
+z.d=P.JF(n,z.a)
+p=u}z.c=P.L7(x,y,p,!0)
+s=z.e
+if(s<w)z.f=C.xB.j(x,s)},
 $isEH:true},
-Mr:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.JH,z)
-z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-bm:{
-"^":"Xs:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
+UU:{
+"^":"Xs:12;",
+$1:function(a){return P.jW(C.jr,a,C.xM,!1)},
 $isEH:true},
 Ue:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -9168,130 +9517,75 @@
 z.KF("=")
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
-Al:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Xs:137;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-QB:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Xs:138;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(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},
-$isEH:true},
-QE:{
-"^":"Xs:138;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},
-$isEH:true},
-YP:{
-"^":"Xs:18;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))},
-$isEH:true},
-Wf:{
-"^":"Xs:139;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+XZ:{
+"^":"Xs:142;",
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
-y=z.Mw(b,"=")
+y=z.OY(b,"=")
 if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
 J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
-"^":"Xs:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+"^":"Xs:44;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
 to:{
-"^":"Xs:13;a",
+"^":"Xs:12;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,140,"call"],
+return z},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 x8:{
-"^":"Xs:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"Xs:144;a",
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$1:function(a){return this.$2(a,null)},
 $isEH:true},
-JT:{
-"^":"Xs:99;a,b",
+JTs:{
+"^":"Xs:100;b,c",
 $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)
+if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(J.Nj(this.b,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`")
+if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
 $isEH:true},
-EY:{
-"^":"Xs:13;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)]},
-$isEH:true},
 rI:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
+$isEH:true}}],["","",,W,{
 "^":"",
 Q8:function(a,b,c,d){var z,y,x
 z=document.createEvent("CustomEvent")
-J.QD(z,d)
+J.YSV(z,d)
 if(!J.x(d).$isWO)if(!J.x(d).$isT8){y=d
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
 if(y)try{d=P.pf(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
+J.G9(z,a,b,c,d)}catch(x){H.Ru(x)
+J.G9(z,a,b,c,null)}else J.G9(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-Og:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+qw: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
 z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
-C.Ar.eo(x,"GET",a,!0)
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.u3(z,0)]).Zz()
-z=H.VM(new W.RO(x,C.JN.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.u3(z,0)]).Zz()
+C.W3.eo(x,"GET",a,!0)
+z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
+z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
 Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
@@ -9311,31 +9605,31 @@
 return W.P1(a)},
 qc:function(a){var z
 if(a==null)return
-if("setInterval" in a){z=W.P1(a)
+if("postMessage" in a){z=W.P1(a)
 if(!!J.x(z).$isPZ)return z
 return}else return a},
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Gi:function(a,b){return new W.zZ(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,13,54],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,13,54],
-Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,55,54,56,57,58],
+v8:function(a,b){return new W.zZ(a,b)},
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
+Hx:[function(a){return J.pa(a)},"$1","Z6",2,0,12,56],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct: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
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
@@ -9347,10 +9641,10 @@
 if(a==null)return
 return $.X3.rO(a,!0)},
 Iq:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.cl(a,!0)},
-Bo:{
+return $.X3.PT(a,!0)},
+M8:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|pv|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V2|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|V46|vr|oEY|kn|V47|fI|V48|zM|V49|Rk|V50|Ti|V51|Um|V52|VZ|V53|WG|ImK|CY|V54|nm|V55|uw|V56|Pa|V57|D2|I5|V58|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|SaM|JI|WZq|ZP|pva|nJ|KAf|Eg|i7|cda|Gk|waa|J3|V10|MJ|T53|DK|V11|BS|V12|Vb|V13|Ly|ZzR|Im|pR|V14|hx|V15|L4|Mb|V16|mO|DE|V17|U1|V18|H8|WS|qh|V19|oF|V20|Q6|uE|V21|Zn|V22|n5|V23|Ma|wN|V24|ds|V25|qM|oEY|av|V26|uz|V27|kK|oa|V28|St|V29|IW|V30|Qh|V31|Oz|V32|Z4|V33|qk|V34|vj|LU|V35|CX|V36|md|V37|Bm|V38|Ya|V39|Ww|ye|V40|G1|V41|fl|V42|UK|V43|wM|V44|NK|V45|Zx|V46|F1|V47|ov|V48|vr|qeq|kn|V49|fI|V50|zM|V51|Rk|V52|Ti|V53|Um|V54|VZ|V55|WG|V56|f7|ImK|CY|V57|nm|V58|uw|V59|Pa|V60|D2|I5|V61|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9360,29 +9654,29 @@
 $asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+"^":"M8;N:target%,t5:type=,mH:href%,aB:protocol=",
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
 fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+"^":"M8;N:target%,mH:href%,aB:protocol=",
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"M8;mH:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
 "^":"Gv;t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
-"^":"Bo;",
+"^":"M8;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
 Ox:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"M8;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
 Ny9:{
-"^":"Bo;fg:height%,R:width}",
+"^":"M8;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
 Oi:{
@@ -9397,7 +9691,7 @@
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
 nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
+"^":"KV;Rn:data=,B:length=,ke:nextElementSibling=",
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
@@ -9406,20 +9700,20 @@
 di:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-Rb:{
-"^":"ea;M3:_dartDetail}",
+DG4:{
+"^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isRb:true,
+GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
+$isDG4:true,
 "%":"CustomEvent"},
 Q3:{
-"^":"Bo;",
+"^":"M8;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDetailsElement"},
 rV:{
-"^":"Bo;",
+"^":"M8;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
 YN:{
@@ -9427,7 +9721,7 @@
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
+XT:function(a,b){return a.querySelector(b)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"XMLDocument;Document"},
@@ -9436,9 +9730,9 @@
 gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
+XT:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rz:{
+cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 BK:{
@@ -9447,22 +9741,22 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isBK:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
+"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
 gks:function(a){return new W.VG(a,a.children)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
-gD7:function(a){return P.T7(C.CD.yu(C.CD.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
+gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-dQ:function(a){},
+Lx:function(a){},
 wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
-bu:[function(a){return a.localName},"$0","gAY",0,0,71],
+bu:[function(a){return a.localName},"$0","gCR",0,0,73],
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
@@ -9473,53 +9767,59 @@
 do{if(J.Uv(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-Gj:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
+PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
+XT:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+LX:function(a){},
 $ish4:true,
 $isPZ:true,
 "%":";Element"},
 fC:{
-"^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
+"^":"M8;fg:height%,oc:name%,t5:type=,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;It:_selector},Ii:path=,ee:timeStamp=,t5:type=",
-gSd:function(a){return W.qc(a.currentTarget)},
+"^":"Gv;dl:_selector},Ii:path=,ee:timeStamp=,t5:type=",
+gCa:function(a){return W.qc(a.currentTarget)},
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
 PZ:{
 "^":"Gv;",
-gI:function(a){return new W.kd(a)},
-Yb:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-H2:function(a,b){return a.dispatchEvent(b)},
+gI:function(a){return new W.xd(a)},
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+Ph:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
 Ao:{
-"^":"Bo;oc:name%,t5:type=",
+"^":"M8;oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rz;tT:code=",
+"^":"cmJ;tT:code=",
 "%":"FileError"},
+H05:{
+"^":"PZ;kc:error=",
+gyG:function(a){var z=a.result
+if(!!J.x(z).$isaI)return H.GG(z,0,null)
+return z},
+"%":"FileReader"},
 jH:{
-"^":"Bo;B:length=,oc:name%,N:target%",
+"^":"M8;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-iGN:{
-"^":"Bo;ih:color%",
+u9:{
+"^":"M8;ih:color%",
 "%":"HTMLHRElement"},
 pl:{
 "^":"Gv;B:length=",
@@ -9561,48 +9861,48 @@
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
-"^":"Bo;fg:height%,oc:name%,R:width}",
+"^":"M8;fg:height%,oc:name%,R:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
 "^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pAv:{
-"^":"Bo;fg:height%,EE:isMap=,R:width}",
+"^":"M8;fg:height%,EE:isMap=,R:width}",
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,oc:name%,t5:type=,P:value%,R:width}",
+"^":"M8;d4:checked%,fg:height%,jx:list=,oc:name%,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
 $isMi:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
+AD:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;oc:name%,t5:type=",
+In:{
+"^":"M8;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 pL:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+"^":"M8;mH:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
 "^":"Gv;mH:href=,aB:protocol=",
-RE:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+VD:function(a){return a.reload()},
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
 jJ:{
-"^":"Bo;oc:name%",
+"^":"M8;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
-"^":"Bo;kc:error=",
+"^":"M8;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
@@ -9611,28 +9911,29 @@
 Wyx:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-wq:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
-D80:{
+CM:{
 "^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
 "%":"MediaStreamEvent"},
-Hy:{
+cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isHy:true,
+gFF:function(a){return W.qc(a.source)},
+$iscxu:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"Bo;q1:content=,oc:name%",
+"^":"M8;rz:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLMeterElement"},
 PGY:{
 "^":"ea;",
@@ -9641,31 +9942,31 @@
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-yt:{
+bnE:{
 "^":"Imr;",
-FY:function(a,b,c){return a.send(b,c)},
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
 "^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.Ph,!1),[null])},
+giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
 "%":"MIDIInput;MIDIPort"},
 AjY:{
-"^":"w6O;YK:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
 else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
 z=W.qc(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.jC(J.tG(z)))
-return H.VM(new P.hL(J.Hh(y.x),J.Hh(y.y)),[null])}},
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
+return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
 $isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
-y=new W.QR(z)
+y=new W.DB(z)
 y.$2("childList",h)
 y.$2("attributes",e)
 y.$2("characterData",f)
@@ -9684,29 +9985,29 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;lb:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
 gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
+J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$iswi){z=b.NL
+if(!!z.$iswi){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
-pj:function(a){var z
+D4:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
 bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,71],
+return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
-Gs:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-dR:function(a,b,c){return a.replaceChild(b,c)},
+tg:function(a,b){return a.contains(b)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
+AS:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
+yk:{
 "^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -9727,48 +10028,48 @@
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 VSm:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLOListElement"},
 G77:{
-"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
+"^":"M8;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
-"^":"Bo;ph:label%",
+"^":"M8;ph:label%",
 "%":"HTMLOptGroupElement"},
 Qlt:{
-"^":"Bo;vH:index=,ph:label%,P:value%",
+"^":"M8;vH:index=,ph:label%,P:value%",
 "%":"HTMLOptionElement"},
 Xp:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"M8;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
-"^":"Bo;oc:name%,P:value%",
+"^":"M8;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-f5:{
+PF:{
 "^":"ea;",
-$isf5:true,
+$isPF:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-qW:{
+Qls:{
 "^":"nx;N:target=",
 "%":"ProcessingInstruction"},
 KRv:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLProgressElement"},
-ew:{
+ew7:{
 "^":"ea;ox:loaded=",
-$isew:true,
+$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bT:{
-"^":"ew;O3:url=",
+"^":"ew7;O3:url=",
 "%":"ResourceProgressEvent"},
 j24:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLScriptElement"},
 lpR:{
-"^":"Bo;B:length%,oc:name%,t5:type=,P:value%",
+"^":"M8;B:length%,oc:name%,t5:type=,P:value%",
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -9776,7 +10077,7 @@
 $isI0:true,
 "%":"ShadowRoot"},
 yNV:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLSourceElement"},
 zD9:{
 "^":"ea;kc:error=,G1:message=",
@@ -9787,13 +10088,13 @@
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-AsS:{
+Cd:{
 "^":"Gv;",
 FV:function(a,b){H.bQ(b,new W.AA(a))},
-x4:function(a,b){return a.getItem(b)!=null},
+NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
 Rz:function(a,b){var z=a.getItem(b)
@@ -9816,48 +10117,48 @@
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]},
 "%":"Storage"},
-KL:{
-"^":"ea;G3:key=,O3:url=",
+iiu:{
+"^":"ea;nl:key=,O3:url=",
 "%":"StorageEvent"},
 fqq:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLStyleElement"},
 v6:{
-"^":"Bo;",
+"^":"M8;",
 $isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
 inA:{
-"^":"Bo;",
+"^":"M8;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
 tV:{
-"^":"Bo;RH:rowIndex=",
+"^":"M8;RH:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $istV:true,
 "%":"HTMLTableRowElement"},
-IV:{
-"^":"Bo;",
+BTK:{
+"^":"M8;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
 fX:{
-"^":"Bo;q1:content=",
+"^":"M8;rz:content=",
 $isfX:true,
-"%":";HTMLTemplateElement;RS|k5d|q6"},
+"%":";HTMLTemplateElement;GLL|k5d|q6"},
 Un:{
 "^":"nx;",
 $isUn:true,
 "%":"CDATASection|Text"},
 FBi:{
-"^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
+"^":"M8;oc:name%,vp:rows=,t5:type=,P:value%",
 "%":"HTMLTextAreaElement"},
-xVu:{
+R0:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
-"^":"Bo;fY:kind=,ph:label%",
+"^":"M8;fY:kind=,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
@@ -9867,33 +10168,33 @@
 "%":"HTMLVideoElement"},
 EKW:{
 "^":"PZ;aB:protocol=,O3:url=",
-LG:function(a,b,c){return a.close(b,c)},
+XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
 "^":"PZ;bq:history=,oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
+ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
 b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
 b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
+hn:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+X6:function(a,b,c){return this.hn(a,b,c,null)},
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
-Bn:{
+U3:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-o5:{
+FR:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,71],
+bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
@@ -9917,12 +10218,12 @@
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
 NfA:{
-"^":"Bo;",
+"^":"M8;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
@@ -9966,51 +10267,51 @@
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
-"^":"ark;MW,wM",
-Gs:function(a,b){return J.wo(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
+"^":"ark;dA,jS",
+tg:function(a,b){return J.kE(this.jS,b)},
+gl0:function(a){return this.dA.firstElementChild==null},
+gB:function(a){return this.jS.length},
+t:function(a,b){var z=this.jS
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.wM
+u:function(a,b,c){var z=this.jS
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
+this.dA.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
+h:function(a,b){this.dA.appendChild(b)
 return b},
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
-Nk:function(a,b){this.zU(b,!1)},
-zU:function(a,b){var z,y,x
-z=this.MW
+uk:function(a,b){this.aO(b,!1)},
+aO:function(a,b){var z,y,x
+z=this.dA
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
-if(!!J.x(b).$ish4){z=this.MW
+if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
 xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
+if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.jS
 y=z.length
-x=this.MW
+x=this.dA
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
-Yj:function(a,b,c){throw H.b(P.nO(null))},
-V1:function(a){J.r4(this.MW)},
+Mh:function(a,b,c){throw H.b(P.nO(null))},
+V1:function(a){J.Wf(this.dA)},
 mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
+if(z!=null)this.dA.removeChild(z)
 return z},
-grZ:function(a){var z=this.MW.lastElementChild
+grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
@@ -10018,47 +10319,47 @@
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 tN:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
+"^":"ark;jt,xa",
+gB:function(a){return this.jt.length},
+t:function(a,b){var z=this.jt
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-Un:function(a,b){var z=C.t5.ad(this.Sn,new W.ty())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
+grZ:function(a){return C.t5.grZ(this.jt)},
+gDD:function(a){return W.or(this.xa)},
+S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
+this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.Un(a,b)
+z.S8(a,b)
 return z}}},
 ty:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 QI:{
 "^":"Gv;"},
-kd:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
+xd:{
+"^":"a;c9<",
+t:function(a,b){return H.VM(new W.RO(this.gc9(),b,!1),[null])}},
 DM:{
-"^":"kd;WK:YO<,WK",
+"^":"xd;c9:Yg<,c9",
 t:function(a,b){var z,y
 z=$.nn()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.JF(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.JF(this.YO,b,!1),[null])},
+if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cqa(this.Yg,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.Cqa(this.Yg,b,!1),[null])},
 static:{"^":"fDX"}},
 RAp:{
 "^":"Gv+lD;",
@@ -10075,15 +10376,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Xs:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,141,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 bU2:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"Xs:13;b,c",
+"^":"Xs:12;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -10091,61 +10392,61 @@
 y=y>=200&&y<300||y===0||y===304
 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,1,"call"],
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-QR:{
-"^":"Xs:80;a",
+DB:{
+"^":"Xs:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
+"^":"ark;uR",
+grZ:function(a){var z=this.uR.lastChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
-h:function(a,b){this.NL.appendChild(b)},
+h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
 xe:function(a,b,c){var z,y,x
-if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.NL
+if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.uR
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-oF:function(a,b,c){var z,y
-z=this.NL
+UG:function(a,b,c){var z,y
+z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 J.r5(z,c,y[b])},
-Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
-z=this.NL
+z=this.uR
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
-zU:function(a,b){var z,y,x
-z=this.NL
+aO:function(a,b){var z,y,x
+z=this.uR
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
-Nk:function(a,b){this.zU(b,!0)},
-V1:function(a){J.r4(this.NL)},
+uk:function(a,b){this.aO(b,!0)},
+V1:function(a){J.Wf(this.uR)},
 u:function(a,b,c){var z,y
-z=this.NL
+z=this.uR
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.childNodes)},
+gA:function(a){return C.t5.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
+gB:function(a){return this.uR.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
+t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 $iswi:true,
@@ -10168,15 +10469,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -10209,216 +10510,216 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.JO(this))},
+FV:function(a,b){J.Me(b,new W.Za(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
-z=this.MW.attributes
+z=this.dA.attributes
 y=H.VM([],[P.qU])
 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},
+if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
+y.push(J.DA(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
+z=this.dA.attributes
 y=H.VM([],[P.qU])
 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)
+if(this.O2(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},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-JO:{
-"^":"Xs:80;a",
+Za:{
+"^":"Xs:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
-"^":"a7B;MW",
-x4:function(a,b){return this.MW.hasAttribute(b)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
+"^":"a7B;dA",
+NZ:function(a,b){return this.dA.hasAttribute(b)},
+t:function(a,b){return this.dA.getAttribute(b)},
+u:function(a,b,c){this.dA.setAttribute(b,c)},
 Rz:function(a,b){var z,y
-z=this.MW
+z=this.dA
 y=z.getAttribute(b)
 z.removeAttribute(b)
 return y},
 gB:function(a){return this.gvc(this).length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.qm(z))
+O2:function(a){return a.namespaceURI==null}},
+nFk:{
+"^":"As3;RN,AL",
+DG:function(){var z=P.Ls(null,null,null,P.qU)
+this.AL.aN(0,new W.pd(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.lo,z)},
-OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-Rz:function(a,b){return this.Q6(new W.FcD(b))},
-Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
+for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
+H9:function(a){this.AL.aN(0,new W.uS(a))},
+Rz:function(a,b){return this.Fm(new W.Bj(b))},
+Fm:function(a){return this.AL.es(0,!1,new W.hD(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.Zu()),[null,null])},
+static:{or:function(a){var z=new W.nFk(a,null)
+z.b1(a)
 return z}}},
-Xw:{
-"^":"Xs:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
+Zu:{
+"^":"Xs:12;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-qm:{
-"^":"Xs:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
+pd:{
+"^":"Xs:12;a",
+$1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
-Jt:{
-"^":"Xs:13;a",
-$1:function(a){return a.OS(this.a)},
+uS:{
+"^":"Xs:12;a",
+$1:function(a){return a.H9(this.a)},
 $isEH:true},
-FcD:{
-"^":"Xs:13;a",
+Bj:{
+"^":"Xs:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
+"^":"As3;dA",
+DG:function(){var z,y,x
 z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.lo)
+for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
 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," "))}},
+J.Pw(this.dA,a.zV(0," "))}},
 FkO:{
-"^":"a;Ph"},
+"^":"a;fA"},
 RO:{
-"^":"wS;bi,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.Ph,W.aF(a),this.Sg)
+"^":"wS;bi,fA,el",
+KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.aF(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
+z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-JF:{
-"^":"RO;bi,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"wS",0),null])},
+Cqa:{
+"^":"RO;bi,fA,el",
+WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
 $iswS:true},
 ie:{
-"^":"Xs:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
+"^":"Xs:12;a",
+$1:function(a){return J.We(J.l2(a),this.a)},
 $isEH:true},
-rg:{
-"^":"Xs:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+tS:{
+"^":"Xs:12;b",
+$1:[function(a){J.A6L(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
-"^":"yX;VP,bi,Ph,u7,Sg",
-ed:function(){if(this.bi==null)return
-this.Ns()
+"^":"yX;UU,bi,fA,H2,el",
+Gv:function(){if(this.bi==null)return
+this.EO()
 this.bi=null
-this.u7=null
+this.H2=null
 return},
-Fv:[function(a,b){if(this.bi==null)return;++this.VP
-this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.V5(this.bi,this.Ph,z,this.Sg)},
-Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.bi,this.Ph,z,this.Sg)}},
+Fv:[function(a,b){if(this.bi==null)return;++this.UU
+this.EO()
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+gUF:function(){return this.UU>0},
+QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
+this.DN()},"$0","gDQ",0,0,17],
+DN:function(){var z=this.H2
+if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
+EO:function(){var z=this.H2
+if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
+gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
 h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 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."))},
+oq:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-Rz:function(a,b){return J.V1(this.xa,b)},
-V1:function(a){J.Z8(this.xa)},
-t:function(a,b){var z=this.xa
+"^":"ark;xN",
+gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
+gB:function(a){return this.xN.length},
+h:function(a,b){J.bi(this.xN,b)},
+Rz:function(a,b){return J.V1(this.xN,b)},
+V1:function(a){J.Z8(this.xN)},
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xa
+u:function(a,b,c){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
+sB:function(a,b){J.wg(this.xN,b)},
+GT:function(a,b){J.LH(this.xN,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(this.xa,b,c)},
-Mw:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xa,b,c)},
+XU:function(a,b,c){return J.G0(this.xN,b,c)},
+OY:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return J.ff(this.xN,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.CP(this.xa,b,c,d,e)},
+xe:function(a,b,c){return J.Vk(this.xN,b,c)},
+YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.O2(this.xa,b,c)}},
+oq:function(a,b,c){J.Cz(this.xN,b,c)}},
 LV:{
 "^":"a;qD",
 G:function(){return this.qD.G()},
 gl:function(){return this.qD.QZ}},
 W9:{
-"^":"a;nj,vN,Nq,QZ",
+"^":"a;NX,vN,G3,QZ",
 G:function(){var z,y
-z=this.Nq+1
+z=this.G3+1
 y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
+if(z<y){this.QZ=J.UQ(this.NX,z)
+this.G3=z
 return!0}this.QZ=null
-this.Nq=y
+this.G3=y
 return!1},
 gl:function(){return this.QZ}},
 zZ:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;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,54,"call"],
+return this.a(a)},"$1",null,2,0,null,56,"call"],
 $isEH:true},
 dW:{
-"^":"a;Ui",
-gbq:function(a){return W.zK(this.Ui.history)},
-geT:function(a){return W.P1(this.Ui.parent)},
-xO:function(a){return this.Ui.close()},
-xc:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+"^":"a;uU",
+gbq:function(a){return W.zK(this.uU.history)},
+geT:function(a){return W.P1(this.uU.parent)},
+xO:function(a){return this.uU.close()},
+hn:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
+X6:function(a,b,c){return this.hn(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Yb:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+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."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
 VP:{
-"^":"a;IP",
+"^":"a;nA",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
+"%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
 "^":"tpr;N:target=,mH:href=",
@@ -10435,8 +10736,8 @@
 pfc:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5G;kp:operator=,fg:height=,yG:result=,x=,y=",
+lF:{
+"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
 EfE:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -10450,7 +10751,7 @@
 ihH:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
-ym:{
+tk2:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
@@ -10459,8 +10760,8 @@
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-yu:{
-"^":"d5G;kp:operator=,fg:height=,yG:result=,x=,y=",
+yum:{
+"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI8:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -10471,7 +10772,7 @@
 bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
 HX:{
@@ -10483,10 +10784,10 @@
 OE5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
+l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
@@ -10502,7 +10803,7 @@
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 fQ:{
-"^":"en;fg:height=,x=,y=",
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
 "^":"d5G;t5:type=,mH:href=",
@@ -10516,11 +10817,11 @@
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"SH<"}},
+static:{"^":"JQ<"}},
 hy:{
 "^":"tpr;fg:height=,x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
@@ -10543,52 +10844,40 @@
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
 "^":"As3;LO",
-lF:function(){var z,y,x,w
+DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
+"%":"SQLError"}}],["","",,P,{
 "^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
 hq:{
 "^":"a;",
-$ishq:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+$ishq:true}}],["","",,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)},
+z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","uuA",8,0,null,40,61,26,62],
 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},
 Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
-if(a==null)return
-else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 else{z=J.x(a)
 if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
 else if(!!z.$isiP)return H.o2(a)
-else if(!!z.$isE4)return a.eh
+else if(!!z.$isE4)return a.S1
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
 hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -10599,31 +10888,31 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,52,63],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
-else return P.iQ(a,$.LZ(),new P.np())},
+else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.np())
+else return P.iQ(a,$.LZ(),new P.Ut())},
 iQ:function(a,b,c){var z=P.Jk(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
-"^":"a;eh",
+"^":"a;S1",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.eh[b])},
+return P.dU(this.S1[b])},
 u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.eh[b]=P.wY(c)},
+this.S1[b]=P.wY(c)},
 giO:function(a){return 0},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
+return!!J.x(b).$isE4&&this.S1===b.S1},
+Eg:function(a){return a in this.S1},
 Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.u("property is not a String or num"))
-delete this.eh[a]},
+delete this.S1[a]},
 bu:[function(a){var z,y
-try{z=String(this.eh)
+try{z=String(this.S1)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,71],
+return P.a.prototype.bu.call(this,this)}},"$0","gCR",0,0,73],
 V7:function(a,b){var z,y
-z=this.eh
+z=this.S1
 y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
 nQ:function(a){return this.V7(a,null)},
@@ -10636,12 +10925,12 @@
 x=z.bind.apply(z,y)
 String(x)
 return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
-return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-if(z.x4(0,a))return z.t(0,a)
+if(z.NZ(0,a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isT8){x={}
 z.u(0,a,x)
@@ -10649,19 +10938,19 @@
 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,61,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 r7:{
-"^":"E4;eh",
+"^":"E4;S1",
 qP:function(a,b){var z,y
 z=P.wY(b)
 y=P.F(H.VM(new H.A8(a,P.En()),[null,null]),!0,null)
-return P.dU(this.eh.apply(z,y))},
+return P.dU(this.S1.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"Wk;eh",
+"^":"Wk;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -10670,7 +10959,7 @@
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
 if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.eh.length
+gB:function(a){var z=this.S1.length
 if(typeof z==="number"&&z>>>0===z)return z
 throw H.b(P.w("Bad JsArray length"))},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
@@ -10678,7 +10967,7 @@
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
 xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-UZ:function(a,b,c){P.uF(b,c,this.gB(this))
+oq:function(a,b,c){P.NH(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -10691,9 +10980,9 @@
 C.Nm.FV(x,J.Ld(d,e).rh(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
+GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{uF:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{NH:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
 Wk:{
 "^":"E4+lD;",
@@ -10703,27 +10992,27 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Xs:13;",
-$1:function(a){var z=P.xZ(a,!1)
+"^":"Xs:12;",
+$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
-Jd:{
-"^":"Xs:13;",
+np:{
+"^":"Xs:12;",
 $1:function(a){return H.VM(new P.GD(a),[null])},
 $isEH:true},
-np:{
-"^":"Xs:13;",
+Ut:{
+"^":"Xs:12;",
 $1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -10754,26 +11043,26 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;Nd,ii",
-hv:function(){var z,y,x,w,v,u
-z=this.Nd
+"^":"a;xx,vz",
+SR:function(){var z,y,x,w,v,u
+z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.ii
+u=v+x+this.vz
 z=(u&4294967295)>>>0
-this.Nd=z
-this.ii=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.xx=z
+this.vz=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hv()
-return(this.Nd&z)>>>0}do{this.hv()
-y=this.Nd
+if((a&z)===0){this.SR()
+return(this.xx&z)>>>0}do{this.SR()
+y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mf:function(a){var z,y,x,w,v,u,t,s
+mK:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
@@ -10783,36 +11072,36 @@
 a=J.Cl(y.W(a,w),4294967296)
 v=((~x&4294967295)>>>0)+(x<<21>>>0)
 u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.BU(v-u,4294967296)&4294967295
 v=((u^(u>>>24|w<<8))>>>0)*265
 x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+w=((w^w>>>24)>>>0)*265+C.jn.BU(v-x,4294967296)&4294967295
 v=((x^(x>>>14|w<<18))>>>0)*21
 x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+w=((w^w>>>14)>>>0)*21+C.jn.BU(v-x,4294967296)&4294967295
 x=(x^(x>>>28|w<<4))>>>0
 w=(w^w>>>28)>>>0
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Nd*1037
+y=C.jn.BU(v-u,4294967296)
+v=this.xx*1037
 t=(v&4294967295)>>>0
-this.Nd=t
-s=(this.ii*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.ii=s
-this.Nd=(t^u)>>>0
-this.ii=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.ii===0&&this.Nd===0)this.Nd=23063
-this.hv()
-this.hv()
-this.hv()
-this.hv()},
-static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
-z.mf(a)
+this.xx=t
+s=(this.vz*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
+this.vz=s
+this.xx=(t^u)>>>0
+this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.vz===0&&this.xx===0)this.xx=23063
+this.SR()
+this.SR()
+this.SR()
+this.SR()},
+static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.mK(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
@@ -10867,7 +11156,7 @@
 "^":"a;",
 gT8:function(a){return this.gBb(this)+this.R},
 gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,71],
+bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gCR",0,0,73],
 n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -10877,7 +11166,7 @@
 return z},
 giO:function(a){var z=this.G6
 return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -10887,221 +11176,173 @@
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
 "^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"v0;Rp"},
-v0:{
-"^":"Nx3+B8q;",
-$isT8:true,
-$asT8:null},
-B8q:{
+moY:{
+"^":"a;JH",
+static:{"^":"aRn,aLE,Rwl"}},
+V2:{
 "^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-Rz:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isT8:true,
-$asT8:null},
-Nx3:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-x4:function(a,b){return this.Rp.x4(0,b)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(a){var z=this.Rp
-return H.VM(new P.i5(z),[H.u3(z,0)])},
-gB:function(a){return this.Rp.X5},
-Rz:function(a,b){return this.Rp.Rz(0,b)},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
-$isT8:true,
-$asT8:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
+$isAS:true}}],["","",,H,{
 "^":"",
+Hj:function(a,b,c){},
 m6:function(a){a.toString
 return a},
 jZN:function(a){a.toString
 return a},
 aRu:function(a){a.toString
 return a},
+GG:function(a,b,c){H.Hj(a,b,c)
+return new Uint8Array(a,b)},
 WZ:{
-"^":"Gv;",
+"^":"Gv;H3:byteLength=",
 gbx:function(a){return C.uh},
+kq:function(a,b,c){H.Hj(a,b,c)
+return new DataView(a,b)},
 $isWZ:true,
+$isaI:true,
 "%":"ArrayBuffer"},
 eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
+"^":"Gv;bg:buffer=,H3:byteLength=,Vl:byteOffset=",
+aq:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
 else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
+Lu:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
+Mz:function(a,b,c,d){var z=d+1
+this.Lu(a,b,z)
+this.Lu(a,c,z)
+if(b>c)throw H.b(P.TE(b,0,c))
+return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|ObS|GVy|Dg|fjp|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.dP},
+gbx:function(a){return C.nW},
+mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]},
-$isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.NS},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+gbx:function(a){return C.nC},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]},
-$isAS:true,
 "%":"Float64Array"},
 xja:{
 "^":"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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int16Array"},
-dE:{
+dE5:{
 "^":"Pg;",
-gbx:function(a){return C.XI},
+gbx:function(a){return C.hg},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
 gbx:function(a){return C.laj},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int8Array"},
-pd:{
+wfF:{
 "^":"Pg;",
-gbx:function(a){return C.oZ},
+gbx:function(a){return C.M5},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint16Array"},
 Pqh:{
 "^":"Pg;",
-gbx:function(a){return C.UR},
+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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
 gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
 gbx:function(a){return C.Wr},
 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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+aM:function(a,b,c){return new Uint8Array(a.subarray(b,this.Mz(a,b,c,a.length)))},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
+SM:function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
+this.Lu(a,b,z)
+this.Lu(a,c,z)
 if(b>c)throw H.b(P.TE(b,0,c))
 y=c-b
 if(e<0)throw H.b(P.u(e))
@@ -11112,27 +11353,31 @@
 $isXj:true},
 Dg:{
 "^":"GVy;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+return a[b]},
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+a[b]=c},
+YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.SM(a,b,c,d,e)
 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,
-$isWO:true,
-$asWO:function(){return[P.Vf]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.Vf]}},
-Ui:{
-"^":"we+lD;",
+$isDg:true},
+ObS:{
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]}},
 GVy:{
-"^":"Ui+SU7;"},
+"^":"ObS+SU7;"},
 Pg:{
 "^":"Ipv;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+a[b]=c},
+YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.SM(a,b,c,d,e)
 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,
@@ -11141,48 +11386,48 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-ObS:{
-"^":"we+lD;",
+fjp:{
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+Af:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){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)}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
+"^":"WZq;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gkc:function(a){return a.Ew},
+skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wI.ZL(a)
-C.wI.XI(a)
+a.n9=x
+a.wy=w
+C.On.LX(a)
+C.On.XI(a)
 return a}}},
-D13:{
+WZq:{
 "^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"pva;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 ga4:function(a){return a.a3},
 sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
@@ -11193,11 +11438,11 @@
 sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
 gCf:function(a){return a.y4},
 sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,114,1,105,106],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,115,2,106,107],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -11206,9 +11451,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,114,1,105,106],
-o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,142,1],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,115,2,106,107],
+o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,146,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11218,28 +11463,28 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.GhT.ZL(a)
-C.GhT.XI(a)
+a.n9=w
+a.wy=v
+C.Jh.LX(a)
+C.Jh.XI(a)
 return a}}},
-WZq:{
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Xs:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"^":"Xs:12;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gv8:function(a){return a.fe},
-sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
+"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gO9:function(a){return a.fe},
+sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
 sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
 gFR:function(a){return a.bY},
@@ -11250,11 +11495,11 @@
 skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
 gyG:function(a){return a.oy},
 syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-wB:[function(a,b,c,d){var z=a.fe
+cg:[function(a,b,c,d){var z=a.fe
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,84,46,47,85],
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11266,32 +11511,32 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.qL.ZL(a)
+a.n9=x
+a.wy=w
+C.qL.LX(a)
 C.qL.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"Xs:144;a",
+"^":"Xs:148;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,95,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 uv:{
-"^":"Xs:74;b",
+"^":"Xs:76;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11299,92 +11544,92 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MC.ZL(a)
+a.n9=x
+a.wy=w
+C.MC.LX(a)
 C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"cda;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
 static:{cYO:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.LTI.ZL(a)
+a.n9=x
+a.wy=w
+C.LTI.LX(a)
 C.LTI.XI(a)
 return a}}},
-pva:{
+cda:{
 "^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"waa;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
 static:{TsF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MO0.ZL(a)
-C.MO0.XI(a)
+a.n9=x
+a.wy=w
+C.n0.LX(a)
+C.n0.XI(a)
 return a}}},
-cda:{
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V10;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gQR:function(a){return a.Zc},
+sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Hb.ZL(a)
-C.Hb.XI(a)
+a.n9=x
+a.wy=w
+C.ls6.LX(a)
+C.ls6.XI(a)
 return a}}},
-waa:{
+V10:{
 "^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -11395,66 +11640,67 @@
 w=P.Fl(null,null)
 a.PQ=!0
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Xo.ZL(a)
+a.n9=x
+a.wy=w
+C.Xo.LX(a)
 C.Xo.XI(a)
 return a}}},
 T53:{
 "^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V2;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V11;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.P6).YM(b)},"$1","gWp",2,0,20,101],
+pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.PJ8.ZL(a)
+a.n9=x
+a.wy=w
+C.PJ8.LX(a)
 C.PJ8.XI(a)
 return a}}},
-V2:{
+V11:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+$isd3:true}}],["","",,O,{
 "^":"",
 Hz:{
-"^":"a;zE,UG",
-sih:function(a,b){var z=this.UG
+"^":"a;zE,y5",
+sih:function(a,b){var z=this.y5
 C.yp.zB(J.Qd(this.zE),z,z+4,b)},
-gih:function(a){var z=this.UG
-return C.yp.Mu(J.Qd(this.zE),z,z+4)},
-rA:[function(){return new O.Hz(this.zE,this.UG+4)},"$0","gaw",0,0,145],
-gvH:function(a){return C.CD.cU(this.UG,4)},
+gih:function(a){var z=this.y5
+return C.yp.Yc(J.Qd(this.zE),z,z+4)},
+PY:[function(){return new O.Hz(this.zE,this.y5+4)},"$0","gaw",0,0,149],
+gvH:function(a){return C.CD.BU(this.y5,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
-z=b.gy(b)
-y=J.eY(a)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
+z=J.RE(b)
+y=z.gy(b)
+x=J.eY(a)
+if(typeof y!=="number")return y.U()
 if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
+z=z.gx(b)
+if(typeof z!=="number")return H.s(z)
+return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,tL"},
+"^":"a;Yu<,yT"},
 Vb:{
-"^":"V10;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V12;A6,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -11462,39 +11708,39 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
+a.A6=z
 z=J.Q9(z)
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.u3(z,0)]).Zz()
-z=J.mZ(a.hi)
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.u3(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
+z=J.GW(a.A6)
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
+Zt:function(a,b){var z,y,x
+for(z=J.mY(b),y=0;z.G();){x=z.Ff
 if(typeof x!=="number")return H.s(x)
 y=y*256+x}return y},
-fJ:function(a,b,c,d){var z=J.It(c,"@")
+OU:function(a,b,c,d){var z=J.It(c,"@")
 if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Aj.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,w=a.Aj;z.G();){v=z.gl()
+a.Cv.u(0,b,z[0])
+a.Tl.u(0,b,d)
+a.GE.u(0,this.Zt(a,d),b)},
+DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
+for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.It(v.r0,"/")),null,null)
-t=u==null?C.pr:P.Nh(u)
+continue}u=H.BU(C.Nm.grZ(J.It(v.TU,"/")),null,null)
+t=u==null?C.pr:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.It(v.bN,"@")
 if(0>=r.length)return H.e(r,0)
 y.u(0,u,r[0])
 x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.R2())
-this.fJ(a,0,"",$.Qg())},
-WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.dW
-y=J.eY(a.An)
+w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.aw())
+this.OU(a,0,"",$.Qg())},
+Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=a.rn
+y=J.eY(a.WC)
 if(typeof z!=="number")return z.U()
 if(typeof y!=="number")return H.s(y)
 x=z*y
-w=C.CD.cU(O.x6(a.An,b).UG,4)
+w=C.CD.BU(O.x6(a.WC,b).y5,4)
 v=C.CD.Z(w,x)
 u=C.CD.Y(w,x)
 t=J.UQ(a.oj,"pages")
@@ -11520,57 +11766,57 @@
 y=J.UQ(a.oj,"unit_size_bytes")
 if(typeof y!=="number")return H.s(y)
 return new O.x2(J.WB(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
-U8:[function(a,b){var z,y,x,w,v
+bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
-y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
+y=this.Tm(a,z.gD7(b))
+x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
-z=O.x6(a.An,z)
-w=z.UG
-v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
+z=O.x6(a.WC,z)
+w=z.y5
+v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,142,2],
-H3:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,142,2],
-My:function(a){var z,y,x,w,v
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,146,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,146,87],
+UV:function(a){var z,y,x,w,v
 z=a.oj
-if(z==null||a.hi==null)return
-this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
+if(z==null||a.A6==null)return
+this.DO(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
 y=J.UQ(a.oj,"pages")
-z=a.hi.parentElement
+z=a.A6.parentElement
 z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(z.clientHeight)),null).R
+x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
 z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
-a.dW=z
+a.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.Ry(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.eY(w))
-J.OE(a.hi,J.OB(a.An))
-this.Fc(a,0)},
-Fc:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+w=P.f9(J.Ry(a.A6).createImageData(x,v))
+a.WC=w
+J.vP(a.A6,J.eY(w))
+J.OE(a.A6,J.OB(a.WC))
+this.Ky(a,0)},
+Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
 a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
+x=a.rn
 if(typeof x!=="number")return H.s(x)
 w=b*x
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.An)
+if(!(b>=x)){x=J.OB(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
+u=O.x6(a.WC,H.VM(new P.hL(0,w),[null]))
 t=J.UQ(y.t(z,b),"objects")
 y=J.U6(t)
-x=a.rM
+x=a.Tl
 s=0
 while(!0){r=y.gB(t)
 if(typeof r!=="number")return H.s(r)
@@ -11578,11 +11824,11 @@
 q=y.t(t,s)
 p=x.t(0,y.t(t,s+1))
 for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.UG
+n=u.y5
 m=n+4
 C.yp.zB(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.UG
-x=C.CD.cU(y,4)
+u=new O.Hz(r,m)}s+=2}while(!0){y=u.y5
+x=C.CD.BU(y,4)
 r=u.zE
 n=J.RE(r)
 m=n.gR(r)
@@ -11596,14 +11842,14 @@
 x=$.Qg()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.hi)
-x=a.An
+u=new O.Hz(r,m)}y=J.Ry(a.A6)
+x=a.WC
 J.kZ(y,x,0,0,0,w,J.eY(x),v)
 P.BV(new O.R5(a,b),null)},
-SK:[function(a,b){var z=a.oj
+pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,101],
-YS:[function(a,b){P.BV(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.Wq()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.BV(new O.oc(a),null)},"$1","gRh",2,0,19,59],
 static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -11613,54 +11859,54 @@
 v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
 u=P.Fl(null,null)
 t=P.Fl(null,null)
-a.rM=z
-a.Aj=y
-a.UL=x
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Tl=z
+a.GE=y
+a.Cv=x
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=w
 a.ZQ=v
-a.iQ=u
-a.Xi=t
-C.wc.ZL(a)
+a.n9=u
+a.wy=t
+C.wc.LX(a)
 C.wc.XI(a)
 return a}}},
-V10:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Xs:74;a,b",
-$0:function(){J.MU(this.a,this.b+1)},
+"^":"Xs:76;a,b",
+$0:function(){J.AC(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,146,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,150,"call"],
 $isEH:true},
-z4:{
-"^":"Xs:80;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,147,"call"],
+Wq:{
+"^":"Xs:81;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,151,"call"],
 $isEH:true},
 oc:{
-"^":"Xs:74;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"^":"Xs:76;a",
+$0:function(){J.oO(this.a)},
+$isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
+"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
+wA:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.hI(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
+return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.wA.call(this,a,b)}},
 Ly:{
-"^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V13;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
 scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 god:function(a){return a.Sk},
@@ -11668,37 +11914,37 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
+a.jF=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
+z=new G.yD(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Ya:function(a){var z,y,x,w
+a.Uv=z
+a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
+Y1:function(a){var z,y,x,w
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,"class")
 if(w==null)continue
 w.gUY().eC(x.t(y,"new"))
 w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.Ai()
+FS:function(a){var z,y,x,w,v,u,t,s,r,q
+a.Rp.Ai()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
 if(y==null)continue
 if(y.gMp())continue
-x=y.gUY().ghb().rT
-w=y.gUY().ghb().wf
-v=y.gUY().gl().rT
+x=y.gUY().gEJ().wY
+w=y.gUY().gEJ().wf
+v=y.gUY().gl().wY
 u=y.gUY().gl().wf
-t=y.gxQ().ghb().rT
-s=y.gxQ().ghb().wf
-r=y.gxQ().gl().rT
+t=y.gxQ().gEJ().wY
+s=y.gxQ().gEJ().wf
+r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.an(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
+J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
+As:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
 J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
@@ -11706,18 +11952,18 @@
 while(!0){v=J.q8(x.gUQ(z))
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{if(C.Nm.Gs(C.NG,w))break c$0
+c$0:{if(C.Nm.tg(C.NG,w))break c$0
 u=J.UQ(y.gks(b),w)
 v=J.RE(u)
 v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
+v.sa4(u,a.Rp.Gu(c,w))}++w}},
+ya:function(a){var z,y,x,w,v,u,t,s
+z=J.Mx(a.Na)
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
+y=z.gB(z)-a.Rp.gzz().length
+for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
+w=J.Mx(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -11736,28 +11982,28 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
+J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-AE:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+this.As(a,J.Mx(a.Na).t(0,x),s)}},
+BB:[function(a,b,c,d){var z,y,x
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-x=a.nc
+x=a.Rp
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,104,1,105,106],
-SK:[function(a,b){var z=a.Ol
+a.Rp.sT3(!0)}else x.sT3(!x.gT3())
+J.II(a.Rp)
+this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,101],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,101],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,101],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,148,149],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,152,153],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11769,84 +12015,84 @@
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.KJ
+a.MF=this.ct(a,C.TN,a.MF,z)}z=a.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 x=J.aT(a.Ol)
-z=a.GQ
+z=a.Xe
 w=x.gUY().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
-v=a.GQ
-z=J.Hn(x.gUY().gCs(),x.gUY().gSU())
-v=v.KJ
+v=a.Xe
+z=J.Hn(x.gUY().gkV(),x.gUY().gSU())
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.GQ
+w=a.Xe
 v=x.gUY().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.Oc.KJ
+z=a.FX.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
+z=a.FX
 w=x.gxQ().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
-v=a.Oc
-z=J.Hn(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.KJ
+v=a.FX
+z=J.Hn(x.gxQ().gkV(),x.gxQ().gSU())
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.Oc
+w=a.FX
 v=x.gxQ().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Ya(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
+this.Y1(a)
+this.FS(a)
+this.ya(a)
+a.jF.Am(a.Xe)
+a.Uv.Am(a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
-Ar:[function(a,b){var z,y,x
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,150,151],
-uW:[function(a,b){var z,y
+return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,154,155],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,150,151],
-F9:[function(a,b){var z,y
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,154,155],
+o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,150,151],
+return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,154,155],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
+a.Xe=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.GQ.KJ.V7("addColumn",["number","Size"])
+a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Oc=new G.Kf(z)
+a.FX=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.KJ.V7("addColumn",["number","Size"])
+a.FX.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.pg()),new G.Kt("Accumulated Instances",G.IZ()),new G.Kt("Current Size",G.pg()),new G.Kt("Current Instances",G.IZ()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.pg()),new G.Kt("Accumulator Instances",G.IZ()),new G.Kt("Current Size",G.pg()),new G.Kt("Current Instances",G.IZ())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(2)},
-static:{Ut:function(a){var z,y,x,w
+static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -11854,28 +12100,28 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vc.ZL(a)
+a.n9=x
+a.wy=w
+C.Vc.LX(a)
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V11:{
+V13:{
 "^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
+$isd3:true}}],["","",,P,{
 "^":"",
 pf:function(a){var z,y
 z=[]
-y=new P.Tm(new P.OW([],z),new P.rG(z),new P.fh(z)).$1(a)
-new P.uS().$0()
+y=new P.kd(new P.wF([],z),new P.rG(z),new P.aj(z)).$1(a)
+new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.GW([],z),new P.D6(z),new P.KC(z)).$1(a)},
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
@@ -11888,8 +12134,8 @@
 if(z==null){z=J.NT(window.navigator.userAgent,"Opera",0)
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
-OW:{
-"^":"Xs:48;b,c",
+wF:{
+"^":"Xs:51;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -11899,23 +12145,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Xs:152;d",
+"^":"Xs:156;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-fh:{
-"^":"Xs:153;e",
+aj:{
+"^":"Xs:157;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
-uS:{
-"^":"Xs:74;",
+Qa:{
+"^":"Xs:76;",
 $0:function(){},
 $isEH:true},
-Tm:{
-"^":"Xs:13;f,UI,bK",
+kd:{
+"^":"Xs:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -11923,8 +12169,8 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSE)throw H.b(P.nO("structured clone of RegExp"))
+if(!!y.$isiP)return new Date(a.rq)
+if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -11949,11 +12195,11 @@
 w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Xs:80;a,Gq",
-$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
+"^":"Xs:81;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-GW:{
-"^":"Xs:48;a,b",
+CA:{
+"^":"Xs:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -11963,19 +12209,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Xs:152;c",
+"^":"Xs:156;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Xs:153;d",
+"^":"Xs:157;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"Xs:13;e,f,UI,bK",
+"^":"Xs:12;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
@@ -11988,7 +12234,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -12008,184 +12254,239 @@
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,71],
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
+bu:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,73],
+gA:function(a){var z=this.DG()
+z=H.VM(new P.zQ(z,z.HU,null,null),[null])
+z.Qx=z.vY.HH
 return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,154,31],
-ad:function(a,b){var z=this.lF()
+aN:function(a,b){this.DG().aN(0,b)},
+zV:function(a,b){return this.DG().zV(0,b)},
+ez:[function(a,b){var z=this.DG()
+return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,158,30],
+ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,155,31],
-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},
-gB:function(a){return this.lF().X5},
-Gs:function(a,b){return this.lF().Gs(0,b)},
-hV:function(a){return this.lF().Gs(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
+lM:[function(a,b){var z=this.DG()
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,159,30],
+Vr:function(a,b){return this.DG().Vr(0,b)},
+gl0:function(a){return this.DG().X5===0},
+gor:function(a){return this.DG().X5!==0},
+gB:function(a){return this.DG().X5},
+tg:function(a,b){return this.DG().tg(0,b)},
+hV:function(a){return this.DG().tg(0,a)?a:null},
+h:function(a,b){return this.H9(new P.GE(b))},
 Rz:function(a,b){var z,y
 if(typeof b!=="string")return!1
-z=this.lF()
+z=this.DG()
 y=z.Rz(0,b)
 this.p5(z)
 return y},
-FV:function(a,b){this.OS(new P.rl(b))},
-Nk:function(a,b){this.OS(new P.PR(b))},
-grZ:function(a){var z=this.lF().lX
+FV:function(a,b){this.H9(new P.rl(b))},
+uk:function(a,b){this.H9(new P.PR(b))},
+grZ:function(a){var z=this.DG().Nz
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
+tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y
-z=this.lF()
-y=z.Ys()
+z=this.DG()
+y=z.iL()
 y.FV(0,z)
 return y},
-eR:function(a,b){var z=this.lF()
+eR:function(a,b){var z=this.DG()
 return H.ke(z,b,H.u3(z,0))},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
+V1:function(a){this.H9(new P.uQ())},
+H9:function(a){var z,y
+z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isJb:true,
-$asJb:function(){return[P.qU]},
+$isOl:true,
+$asOl:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
-"^":"Xs:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 rl:{
-"^":"Xs:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 PR:{
-"^":"Xs:13;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.Ei(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 uQ:{
-"^":"Xs:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 D7:{
-"^":"ark;NJ,iz",
-gye:function(){var z=this.iz
+"^":"ark;ew,kG",
+gd3:function(){var z=this.kG
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
+aN:function(a,b){H.bQ(this.gd3(),b)},
+u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
+J.DG(z[b],c)},
+sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.NL.appendChild(b)},
+this.oq(0,b,z)},
+h:function(a,b){this.kG.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
-Gs:function(a,b){if(!J.x(b).$ish4)return!1
-return b.parentNode===this.NJ},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
+tg:function(a,b){if(!J.x(b).$ish4)return!1
+return b.parentNode===this.ew},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
+oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.GS())},
+V1:function(a){J.Wf(this.kG.uR)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)J.Mp(z)
 return z},
-xe:function(a,b,c){this.iz.xe(0,b,c)},
-oF:function(a,b,c){var z,y
-z=this.iz.NL
+xe:function(a,b,c){this.kG.xe(0,b,c)},
+UG:function(a,b,c){var z,y
+z=this.kG.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
-for(z=0;z<this.gye().length;++z){y=this.gye()
+for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
 if(x===b){J.Mp(x)
 return!0}}return!1},
-gB:function(a){return this.gye().length},
-t:function(a,b){var z=this.gye()
+gB:function(a){return this.gd3().length},
+t:function(a,b){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gye()
+gA:function(a){var z=this.gd3()
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
+$isEH:true}}],["","",,O,{
 "^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
-else{y=J.w1(z)
+Im:{
+"^":"ZzR;jw,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gV8:function(a){return J.UQ(a.tY,"slot")},
+gyg:function(a){var z=J.UQ(a.tY,"slot")
+return typeof z==="number"},
+gWk:function(a){return!!J.x(J.UQ(a.tY,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.tY,"slot"),"type"),"@Field")},
+gFF:function(a){return J.UQ(a.tY,"source")},
+gyK:function(a){return a.jw},
+syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
+rT:[function(a,b){return J.aT(J.UQ(a.tY,"source")).cv(J.WB(J.eS(J.UQ(a.tY,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){var z,y
+if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
+else{z=a.tY
+y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,157,158,101],
-static:{lu:function(a){var z,y,x,w
+c.$0()}},"$2","gus",4,0,161,162,102],
+static:{Xn:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.po.ZL(a)
-C.po.XI(a)
+a.n9=x
+a.wy=w
+C.QFk.LX(a)
+C.QFk.XI(a)
+return a}}},
+ZzR:{
+"^":"xI+Pi;",
+$isd3:true},
+cC:{
+"^":"Xs:114;a",
+$1:[function(a){var z,y,x
+z=this.a
+y=J.UQ(a,"references")
+x=Q.ch(null,null)
+x.FV(0,y)
+z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,150,"call"],
+$isEH:true},
+qm:{
+"^":"Xs:12;a",
+$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,B,{
+"^":"",
+pR:{
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gXt:function(a){var z=a.tY
+if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gXt.call(this,a)},
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){var z,y
+z=a.tY
+if(b===!0)J.LE(z).ml(new B.Ng(a)).wM(c)
+else{y=J.w1(z)
+y.u(z,"fields",null)
+y.u(z,"elements",null)
+c.$0()}},"$2","gus",4,0,161,162,102],
+static:{luW:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.Pe=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.n9=x
+a.wy=w
+C.hM.LX(a)
+C.hM.XI(a)
 return a}}},
 Ng:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
-a.sTX(z.t(a,"valueAsString"))}z=this.a
+a.sTE(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 hx:{
-"^":"V12;VQ,VR,MV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V14;VQ,VR,Cm,MV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
 gIi:function(a){return a.VR},
 sIi:function(a,b){a.VR=this.ct(a,C.XM,a.VR,b)},
+gyK:function(a){return a.Cm},
+syK:function(a,b){a.Cm=this.ct(a,C.uO,a.Cm,b)},
 gCF:function(a){return a.MV},
 sCF:function(a,b){a.MV=this.ct(a,C.tg,a.MV,b)},
-vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-S1:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retained")).ml(new Z.Pz(a))},"$1","ghN",2,0,110,112],
-Pr:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,110,33],
-SK:[function(a,b){J.cI(a.VQ).YM(b)},"$1","gvC",2,0,20,101],
+vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+zs:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retained")).ml(new Z.dQ(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,111,32],
+rT:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/inbound_references?limit="+H.d(b))).ml(new Z.Fs(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,19,102],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12193,194 +12494,199 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.MV=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.yKx.ZL(a)
+a.n9=x
+a.wy=w
+C.yKx.LX(a)
 C.yKx.XI(a)
 return a}}},
-V12:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
-Pz:{
-"^":"Xs:113;a",
+dQ:{
+"^":"Xs:114;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.MV=J.Q5(z,C.tg,z.MV,y)},"$1",null,2,0,null,95,"call"],
+z.MV=J.Q5(z,C.tg,z.MV,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 cL:{
-"^":"Xs:144;a",
+"^":"Xs:148;a",
 $1:[function(a){var z=this.a
-z.VR=J.Q5(z,C.XM,z.VR,a)},"$1",null,2,0,null,95,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+z.VR=J.Q5(z,C.XM,z.VR,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true},
+Fs:{
+"^":"Xs:148;a",
+$1:[function(a){var z=this.a
+z.Cm=J.Q5(z,C.uO,z.Cm,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V15;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
 static:{p4t:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wd.ZL(a)
-C.wd.XI(a)
+a.n9=x
+a.wy=w
+C.j1o.LX(a)
+C.j1o.XI(a)
 return a}}},
-V13:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{vH:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ag.ZL(a)
+a.n9=x
+a.wy=w
+C.Ag.LX(a)
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V16;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
 static:{Ch:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ie.ZL(a)
+a.n9=x
+a.wy=w
+C.Ie.LX(a)
 C.Ie.XI(a)
 return a}}},
-V14:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{oB:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ig.ZL(a)
+a.n9=x
+a.wy=w
+C.Ig.LX(a)
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V17;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,101],
-Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
+pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
+T9:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.x4.ZL(a)
-C.x4.XI(a)
+a.n9=x
+a.wy=w
+C.VLs.LX(a)
+C.VLs.XI(a)
 return a}}},
-V15:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
-Kv:{
-"^":"Xs:74;a",
+XB:{
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,101],
-Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
+"^":"V18;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gPB:function(a){return a.OS},
+sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
+pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
+T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.GII.ZL(a)
-C.GII.XI(a)
+a.n9=x
+a.wy=w
+C.tO.LX(a)
+C.tO.XI(a)
 return a}}},
-V16:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{jS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12388,176 +12694,176 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ug.ZL(a)
-C.Ug.XI(a)
+a.n9=x
+a.wy=w
+C.bP.LX(a)
+C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{Sc:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{va:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wK.ZL(a)
+a.n9=x
+a.wy=w
+C.wK.LX(a)
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V19;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{UE:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{RN:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ozm.ZL(a)
+a.n9=x
+a.wy=w
+C.ozm.LX(a)
 C.ozm.XI(a)
 return a}}},
-V17:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V20;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
 static:{chF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.rU.ZL(a)
+a.n9=x
+a.wy=w
+C.rU.LX(a)
 C.rU.XI(a)
 return a}}},
-V18:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{AW:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{Jz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Fw.ZL(a)
+a.n9=x
+a.wy=w
+C.Fw.LX(a)
 C.Fw.XI(a)
 return a}}},
 Zn:{
-"^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{O3:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{kf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ij.ZL(a)
+a.n9=x
+a.wy=w
+C.ij.LX(a)
 C.ij.XI(a)
 return a}}},
-V19:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V22;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.aV.ZL(a)
+a.n9=x
+a.wy=w
+C.aV.LX(a)
 C.aV.XI(a)
 return a}}},
-V20:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{Ii1:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{Ii:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.iR.ZL(a)
+a.n9=x
+a.wy=w
+C.iR.LX(a)
 C.iR.XI(a)
 return a}}},
-V21:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{ML:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12565,79 +12871,79 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.L6.ZL(a)
-C.L6.XI(a)
+a.n9=x
+a.wy=w
+C.RVQ.LX(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V24;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,101],
-Po:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
+pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
+O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.yr.ZL(a)
-C.yr.XI(a)
+a.n9=x
+a.wy=w
+C.wP.LX(a)
+C.wP.XI(a)
 return a}}},
-V22:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 mj:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
 static:{tX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wvk.ZL(a)
+a.n9=x
+a.wy=w
+C.wvk.LX(a)
 C.wvk.XI(a)
 return a}}},
-V23:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"oEY;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -12648,88 +12954,88 @@
 w=P.Fl(null,null)
 a.CB=!1
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OkI.ZL(a)
-C.OkI.XI(a)
+a.n9=x
+a.wy=w
+C.hU.LX(a)
+C.hU.XI(a)
 return a}}},
-ZzR:{
+oEY:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V24;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gNN:function(a){return a.RX},
-Fn:function(a){return this.gNN(a).$0()},
-sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,101],
-Po:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
+"^":"V26;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gpE:function(a){return a.RX},
+Fn:function(a){return this.gpE(a).$0()},
+spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
+pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZFP:function(a){var z,y,x,w
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
+static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.bZ.ZL(a)
+a.n9=x
+a.wy=w
+C.bZ.LX(a)
 C.bZ.XI(a)
 return a}}},
-V24:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,SF,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
+"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
 gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
+Pz:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
 x=this.ks
 if(x.length>0)return
 for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
-s=J.X9(t.gAv(),w.gAv())
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(s>y||J.X9(J.on(t).gDu(),u.Av)>y))continue
+if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
 x.push(X.SJ(z,u,t,this))}},
-o8:function(){},
+cO:function(){},
 Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.X9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
 y=J.RE(z)
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.SF.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.zg=G.dj(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.SF.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
+this.zg=G.dj(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
 z.push(this.vs)
-z.push(this.ki)},
+z.push(this.zg)},
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?d.yt+1:0
@@ -12738,7 +13044,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V25;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V27;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -12780,38 +13086,38 @@
 a.fE=this.ct(a,C.aH,a.fE,v)
 J.aT(a.oi).N3(a.oi)
 J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.kf(z,null,null)
+a.Hm=new G.ih(z,null,null)
 this.Zb(a)},
-m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,57],
-SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,101],
+TN:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
+pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
+this.FG(a)},
+FG:function(a){var z,y,x,w,v
+z=J.aT(a.oi).gqo()
 if(z==null)return
-try{a.Hm.mA(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+x=new H.oP(w,null)
+N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,102,103],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,102,103],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
+Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,104,1,105,106],
+x=new H.oP(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{"^":"B6",jD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12826,28 +13132,28 @@
 a.ev=""
 a.XX=0.0002
 a.TM="uv"
-a.WC="#tableTree"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Xg="#tableTree"
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.kS.ZL(a)
+a.n9=x
+a.wy=w
+C.kS.LX(a)
 C.kS.XI(a)
 return a}}},
-V25:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,159,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,163,"call"],
+$isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{IB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12855,19 +13161,19 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.LN.ZL(a)
+a.n9=x
+a.wy=w
+C.LN.LX(a)
 C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V28;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -12876,76 +13182,76 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OoF.ZL(a)
+a.n9=x
+a.wy=w
+C.OoF.LX(a)
 C.OoF.XI(a)
 return a}}},
-V26:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V29;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.fp(a.ow)},"$1","gX0",2,0,160,14],
-kf:[function(a,b){$.Kh.x3(a.ow)
-return J.df(a.ow)},"$1","gDQ",2,0,160,14],
-tb:[function(a,b){$.Kh.x3(a.ow)
-return J.eg(a.ow)},"$1","gLc",2,0,160,14],
-jA:[function(a,b){$.Kh.x3(a.ow)
-return J.J1(a.ow)},"$1","gqF",2,0,160,14],
-Cx:[function(a,b){$.Kh.x3(a.ow)
-return J.Fy(a.ow)},"$1","gVX",2,0,160,14],
+Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,164,13],
+kf:[function(a,b){$.Kh.pZ(a.ow)
+return J.df(a.ow)},"$1","gDQ",2,0,164,13],
+PyB:[function(a,b){$.Kh.pZ(a.ow)
+return J.UR(a.ow)},"$1","gLc",2,0,164,13],
+XQ:[function(a,b){$.Kh.pZ(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,164,13],
+Cx:[function(a,b){$.Kh.pZ(a.ow)
+return J.Fy(a.ow)},"$1","gZp",2,0,164,13],
 static:{zr:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.F2.ZL(a)
+a.n9=x
+a.wy=w
+C.F2.LX(a)
 C.F2.XI(a)
 return a}}},
-V27:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{b2:function(a){var z,y,x,w
+static:{Qj:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vi.ZL(a)
-C.Vi.XI(a)
+a.n9=x
+a.wy=w
+C.rCJ.LX(a)
+C.rCJ.XI(a)
 return a}}},
-V28:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -12954,23 +13260,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ji.ZL(a)
-C.Ji.XI(a)
+a.n9=x
+a.wy=w
+C.mb.LX(a)
+C.mb.XI(a)
 return a}}},
-V29:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
-"^":"a;Y0,WL",
+"^":"a;NK,aF",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.KJ
+z=this.NK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -12982,97 +13288,97 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V30;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V32;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ak:[function(a,b){var z,y,x
+o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.Gv!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
 z=a.iw
 if(z==null)return
 z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
 if(y!=null){z=a.iw
-x=z.WL
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x=z.aF
+if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
+z.aF=x}x.Am(z.NK)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.aXP.ZL(a)
+a.n9=x
+a.wy=w
+C.aXP.LX(a)
 C.aXP.XI(a)
 return a}}},
-V30:{
+V32:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;Yi,S2",
+"^":"a;KK,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.KJ
+z=this.KK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.lo
+for(y=J.mY(a.gaf());y.G();){x=y.Ff
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.mB(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+w=J.Q0(a.gaf(),"Idle")
+v=a.gvh()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-r=y[u].OQ
+r=y[u].jf
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V31;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V33;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,18],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
 z=a.Cn
-if(z!=null){z.ed()
+if(z!=null){z.Gv()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.TO).YM(b)},"$1","gWp",2,0,20,101],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,160,14],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,160,14],
+pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,164,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,164,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13080,96 +13386,96 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.Fs=new L.Lr(new G.Kf(z),null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.LR=new L.Lr(new G.Kf(z),null)
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.Xe.ZL(a)
-C.Xe.XI(a)
+a.n9=w
+a.wy=v
+C.hys.LX(a)
+C.hys.XI(a)
 return a}}},
-V31:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.Fs
+y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
+v=new G.yD(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,161,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.w0(z))},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 CV:{
-"^":"Xs:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,143,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 Vq:{
-"^":"Xs:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"^":"Xs:12;a",
+$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-LE:function(a,b){var z,y,x,w,v,u,t,s
+KW:function(a,b){var z,y,x,w,v,u,t,s
 z=this.GO
-if(z.Gs(0,a))return
+if(z.tg(0,a))return
 z.h(0,a)
 for(y=J.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
 t=y.t(a,u)
 s=J.x(t)
 if(!!s.$isT8){s=C.xB.U("  ",b)
-w.vM+=s
+w.IN+=s
 s="\""+H.d(u)+"\": {\n"
-w.vM+=s
-this.LE(t,v)
+w.IN+=s
+this.KW(t,v)
 s=C.xB.U("  ",b)
-s=w.vM+=s
-w.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
-w.vM+=s
+s=w.IN+=s
+w.IN=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+w.IN+=s
 s="\""+H.d(u)+"\": [\n"
-w.vM+=s
-this.aK(t,v)
+w.IN+=s
+this.J7(t,v)
 s=C.xB.U("  ",b)
-s=w.vM+=s
-w.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-w.vM+=s
+s=w.IN+=s
+w.IN=s+"]\n"}else{s=C.xB.U("  ",b)
+w.IN+=s
 s="\""+H.d(u)+"\": "+H.d(t)
-s=w.vM+=s
-w.vM=s+"\n"}}z.Rz(0,a)},
-aK:function(a,b){var z,y,x,w,v,u
+s=w.IN+=s
+w.IN=s+"\n"}}z.Rz(0,a)},
+J7:function(a,b){var z,y,x,w,v,u
 z=this.GO
-if(z.Gs(0,a))return
+if(z.tg(0,a))return
 z.h(0,a)
 for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
 if(!!u.$isT8){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"{\n"
-this.LE(v,w)
+u=x.IN+=u
+x.IN=u+"{\n"
+this.KW(v,w)
 u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"[\n"
-this.aK(v,w)
+u=x.IN+=u
+x.IN=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
+u=x.IN+=u
+x.IN=u+"[\n"
+this.J7(v,w)
 u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
+u=x.IN+=u
+x.IN=u+"]\n"}else{u=C.xB.U("  ",b)
+x.IN+=u
+u=x.IN+=typeof v==="string"?v:H.d(v)
+x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V32;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V34;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13179,127 +13485,129 @@
 z=P.p9("")
 y=P.Ls(null,null,null,null)
 x=a.Ly
-z.vM=""
+z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
+new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y,x,w
+z=z.IN
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Yt.ZL(a)
+a.n9=x
+a.wy=w
+C.Yt.LX(a)
 C.Yt.XI(a)
 return a}}},
-V32:{
+V34:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
+$isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{V4:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{rA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Z3.ZL(a)
+a.n9=x
+a.wy=w
+C.Z3.LX(a)
 C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V35;iI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.WB(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.iI).YM(b)},"$1","gWp",2,0,20,101],
+vV:[function(a,b){return J.aT(a.iI).cv(J.WB(J.eS(a.iI),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.iI).wM(b)},"$1","gDX",2,0,19,102],
 static:{as:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MG.ZL(a)
-C.MG.XI(a)
+a.n9=x
+a.wy=w
+C.Bn.LX(a)
+C.Bn.XI(a)
 return a}}},
-V33:{
+V35:{
 "^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,n2,Cj>,ks>,tg",
+"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.xC(J.O6(z),"")
+y=z==null||J.xC(J.DA(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.n2
+gOR:function(){if($.RL){var z=this.cK
 if(z!=null)return z
 z=this.eT
-if(z!=null)return z.gOR()}return $.Y4},
-sOR:function(a){if($.RL&&this.eT!=null)this.n2=a
+if(z!=null)return z.gOR()}return $.DR},
+sOR:function(a){if($.RL&&this.eT!=null)this.cK=a
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
-$.Y4=a}},
-gSZ:function(){return this.tQ()},
+$.DR=a}},
+gSZ:function(){return this.qX()},
 mL:function(a){return a.P>=this.gOR().P},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
+if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.AG(b)
+z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
 x=$.xO
 $.xO=x+1
 w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){v.cB(w)
-v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-Ny:function(a){return this.TF(a,null,null)},
-ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZW(a,null,null)},
-wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.wF(a,null,null)},
+if($.RL)for(v=this;v!=null;){v.js(w)
+v=J.Lp(v)}else N.QM("").js(w)}},
+X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
+kS:function(a){return this.X2A(a,null,null)},
+Da:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.Da(a,null,null)},
+DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.DH(a,null,null)},
+r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.r0(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
-tQ:function(){if($.RL||this.eT==null){var z=this.tg
+qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.tg=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").tQ()},
-cB:function(a){var z=this.tg
-if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)}},
+this.z3=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
+js:function(a){var z=this.z3
+if(z!=null){if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)}},
 QL:function(a,b,c){var z=this.eT
-if(z!=null)J.Tr(z).u(0,this.oc,this)},
+if(z!=null)J.jd(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"Xs:74;a",
+"^":"Xs:76;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 '.'"))
@@ -13307,7 +13615,7 @@
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.xB.Nj(z,0,y))
 z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
+v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
 $isEH:true},
@@ -13331,44 +13639,44 @@
 if(typeof z!=="number")return H.s(z)
 return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gAY",0,0,71],
+bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gAY",0,0,71],
+"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
 $isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
+static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e471())
+N.QM("").gSZ().yI(new F.e486())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"google")
+z=J.UQ($.Xw(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e472())},
-e471:{
-"^":"Xs:163;",
+$.Ib().MM.ml(G.vN()).ml(new F.e487())},
+e486:{
+"^":"Xs:167;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.wo(z.gG1(a),"Can't assign to null: ")===!0||J.wo(z.gG1(a),"Expression is not assignable: ")===!0
+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.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,162,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,166,"call"],
 $isEH:true},
-e472:{
-"^":"Xs:13;",
+e487:{
+"^":"Xs:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V34;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V36;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -13378,28 +13686,28 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.kD.ZL(a)
+a.n9=x
+a.wy=w
+C.kD.LX(a)
 C.kD.XI(a)
 return a}}},
-V34:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V35;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V37;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
+gwp:function(a){return a.V4},
+swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJm:function(a){var z,y,x,w
+static:{yU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13408,26 +13716,26 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.IG.ZL(a)
+a.n9=x
+a.wy=w
+C.IG.LX(a)
 C.IG.XI(a)
 return a}}},
-V35:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V36;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V38;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{vn:function(a){var z,y,x,w
+gwp:function(a){return a.V4},
+swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
+static:{JR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13435,75 +13743,75 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Nk.ZL(a)
+a.n9=x
+a.wy=w
+C.Nk.LX(a)
 C.Nk.XI(a)
 return a}}},
-V36:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V37;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V39;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gFR:function(a){return a.rU},
 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)},
 gjl:function(a){return a.SB},
 sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Kp:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.Hq},
+sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
+VV:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,114,1,105,106],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,115,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
+static:{wC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.z2="Refresh"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Hq="Refresh"
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Y6.ZL(a)
-C.Y6.XI(a)
+a.n9=x
+a.wy=w
+C.J7.LX(a)
+C.J7.XI(a)
 return a}}},
-V37:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{W1:function(a){var z,y,x,w
+"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.br.ZL(a)
+a.n9=x
+a.wy=w
+C.br.LX(a)
 C.br.XI(a)
 return a}}},
 G1:{
-"^":"V38;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V40;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{Br:function(a){var z,y,x,w
@@ -13513,26 +13821,26 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OKl.ZL(a)
+a.n9=x
+a.wy=w
+C.OKl.LX(a)
 C.OKl.XI(a)
 return a}}},
-V38:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V39;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V41;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,57],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13544,47 +13852,47 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.RRl.ZL(a)
+a.n9=x
+a.wy=w
+C.RRl.LX(a)
 C.RRl.XI(a)
 return a}}},
-V39:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V40;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V42;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{Qj:function(a){var z,y,x,w
+static:{IV:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.S3.ZL(a)
-C.S3.XI(a)
+a.n9=x
+a.wy=w
+C.ctm.LX(a)
+C.ctm.XI(a)
 return a}}},
-V40:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V41;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V43;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -13596,21 +13904,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.HR.ZL(a)
-C.HR.XI(a)
+a.n9=x
+a.wy=w
+C.ic.LX(a)
+C.ic.XI(a)
 return a}}},
-V41:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V42;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V44;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 static:{Xii:function(a){var z,y,x,w
@@ -13619,58 +13927,58 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Mn.ZL(a)
+a.n9=x
+a.wy=w
+C.Mn.LX(a)
 C.Mn.XI(a)
 return a}}},
-V42:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V43;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V45;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-kf:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,160,14],
-tb:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.eg(J.aT(a.Wx))},"$1","gLc",2,0,160,14],
-jA:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.J1(J.aT(a.Wx))},"$1","gqF",2,0,160,14],
-Cx:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gVX",2,0,160,14],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,164,1,105,106],
-static:{yno:function(a){var z,y,x,w
+kf:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,164,13],
+PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,164,13],
+XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,164,13],
+Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,164,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,168,2,106,107],
+static:{zC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.L88.ZL(a)
-C.L88.XI(a)
+a.n9=x
+a.wy=w
+C.L8.LX(a)
+C.L8.XI(a)
 return a}}},
-V43:{
+V45:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V44;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V46;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gz2:function(a){return a.qC},
+sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
 if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.ch(null,D.Mk),null,null)
@@ -13678,122 +13986,128 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.V3("targetManager"),Q.ch(null,null),null,null,null,null)
-x.Ff()
+x.lK()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+static:{JT8:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.YpE.ZL(a)
-C.YpE.XI(a)
+a.n9=x
+a.wy=w
+C.k0.LX(a)
+C.k0.XI(a)
 return a}}},
-V44:{
+V46:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
+$isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gi6:function(a){return $.Kh},
-gKw:function(a){return J.pP(this.gi6(a).Ef)},
+gl6:function(a){return J.D8(this.gi6(a).fN)},
 Es:function(a){A.zs.prototype.Es.call(this,a)
-this.Tt(a)},
+this.U2(a)},
 wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)
-this.Q4(a)},
-e1:function(a){A.zs.prototype.e1.call(this,a)},
+Lx:function(a){A.zs.prototype.Lx.call(this,a)
+this.yM(a)},
+I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
-Lq:[function(a,b){if(a.tB!=null)this.Tt(a)
-else this.Q4(a)},"$1","gj8",2,0,20,57],
-Tt:function(a){var z
+uc:[function(a,b){if(a.tB!=null)this.U2(a)
+else this.yM(a)},"$1","grX",2,0,19,59],
+U2:function(a){var z
 if(a.tB==null)return
-z=a.kR
-if(z!=null)z.ed()
-a.kR=P.rT(a.tB,this.gwZ(a))},
-Q4:function(a){var z=a.kR
-if(z!=null)z.ed()
-a.kR=null},
-Lu:[function(a){var z
+z=a.Qf
+if(z!=null)z.Gv()
+a.Qf=P.cH(a.tB,this.gPs(a))},
+yM:function(a){var z=a.Qf
+if(z!=null)z.Gv()
+a.Qf=null},
+Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,18],
-wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,164,2,105,106],
-KN:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,165,166],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,167,168],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-Kq:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,135,21],
-z4:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,169,170],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,169,170],
-OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,169,170],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,169,170],
-KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,169,170],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,169,170],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,169,170],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,169,170],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,169,170],
-Dz:[function(a,b){return!C.Nm.Gs(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,169,170],
-static:{EE:function(a){var z,y,x,w
+if(z==null){this.yM(a)
+return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,168,87,106,107],
+XD:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gGs",2,0,169,170],
+Qb:[function(a,b){return G.mG(b)},"$1","gSs",2,0,171,172],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,139,20],
+z4:[function(a,b){return b!=null&&J.xC(b.gzS(),"Null")&&J.xC(J.eS(b),"objects/null")},"$1","gHh",2,0,93,173],
+zi:[function(a,b){return b!=null&&J.xC(b.gzS(),"Null")&&!J.xC(J.eS(b),"objects/null")},"$1","gIt",2,0,93,173],
+uL:[function(a,b){return b!=null&&J.xC(b.gzS(),"Error")},"$1","gt3",2,0,93,173],
+wS:[function(a,b){var z
+if(b!=null)z=J.xC(b.gzS(),"Smi")||J.xC(b.gzS(),"Mint")||J.xC(b.gzS(),"Bigint")
+else z=!1
+return z},"$1","gWL",2,0,93,173],
+RU:[function(a,b){return b!=null&&J.xC(b.gzS(),"Bool")},"$1","gFY",2,0,93,173],
+T1:[function(a,b){return b!=null&&J.xC(b.gzS(),"String")},"$1","gu7",2,0,93,173],
+wm:[function(a,b){return b!=null&&J.xC(b.gzS(),"Instance")},"$1","gNs",2,0,93,173],
+Lb:[function(a,b){return b!=null&&J.xC(b.gzS(),"Double")},"$1","gzx",2,0,93,173],
+qc:[function(a,b){var z
+if(b!=null)z=J.xC(b.gzS(),"GrowableObjectArray")||J.xC(b.gzS(),"Array")
+else z=!1
+return z},"$1","gK4",2,0,93,173],
+tR:[function(a,b){return b!=null&&J.xC(b.gzS(),"Type")},"$1","gqN",2,0,93,173],
+AC:[function(a,b){if(b==null)return!1
+return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b.gzS())},"$1","geS",2,0,93,173],
+static:{ew:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Pfz.ZL(a)
+a.n9=x
+a.wy=w
+C.Pfz.LX(a)
 C.Pfz.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
-$isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 Ap:{
 "^":"a;",
 sP:function(a,b){},
 fR:function(){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isAp:true}}],["","",,O,{
 "^":"",
 Pi:{
 "^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
+gqh:function(a){var z=a.Vg
+if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
-a.AP=z}z.toString
+a.Vg=z}z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-Tr:[function(a){},"$0","gqw",0,0,18],
-dt:[function(a){a.AP=null},"$0","gym",0,0,18],
+w37:[function(a){},"$0","gcm",0,0,17],
+dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
-if(this.gnz(a)&&z!=null){y=a.AP
+if(this.gnz(a)&&z!=null){y=a.Vg
 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,123],
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(x)
+return!0}return!1},"$0","gDx",0,0,125],
 gnz:function(a){var z,y
-z=a.AP
+z=a.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
@@ -13801,15 +14115,15 @@
 nq:function(a,b){if(!this.gnz(a))return
 if(a.fn==null){a.fn=[]
 P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
+$isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
 $isyj:true},
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
+bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
+$isqI:true}}],["","",,O,{
 "^":"",
 J8:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
@@ -13829,7 +14143,7 @@
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
 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))+".")}}$.Nc=$.Oo.length
 $.Td=!1},
@@ -13838,37 +14152,37 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"Xs:171;a",
+"^":"Xs:174;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.N0(z))},
 $isEH:true},
 N0:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){this.a.a=!1
 O.J8()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Xs:30;b",
+"^":"Xs:29;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 HF:{
-"^":"Xs:74;c,d,e,f",
+"^":"Xs:76;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"Xs:172;UI",
+"^":"Xs:175;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 iu:{
-"^":"Xs:13;bK,Gq,Rm,w3",
+"^":"Xs:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,173,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+return this.w3.$1(a)},"$1",null,2,0,null,176,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
@@ -13886,26 +14200,26 @@
 if(t>=u.length)return H.e(u,t)
 u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
 p=J.xC(d[q],s.t(a,J.Hn(u.g(b,t),1)))
-o=x[v]
-n=x[r]
+o=x[r]
+n=x[v]
 m=t-1
 if(p){if(v>=w)return H.e(x,v)
 if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
+if(m>=o.length)return H.e(o,m)
+p=o[m]
 if(t>=n.length)return H.e(n,t)
-p=n[t]
+n[t]=p}else{if(r>=w)return H.e(x,r)
+if(t>=o.length)return H.e(o,t)
+p=o[t]
 if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
+o=n.length
+if(m>=o)return H.e(n,m)
+m=n[m]
 if(typeof m!=="number")return m.g()
 m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
+if(t>=o)return H.e(n,t)
+n[t]=m}}return x},
 kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -13940,7 +14254,7 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
 rN:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
@@ -13970,39 +14284,39 @@
 if(J.xC(b,c)){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
+t=new G.Zq(a,z,u,b,0)
+for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
 J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
 x=new P.Yp(u)
 x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
 q=[]
-q.$builtinTypeInfo=[G.DA]
+q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.WB(t.Ld,1)
+t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
-z=t.em
+z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
 J.bi(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.WB(t.Ld,1)
+t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
+t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
 J.bi(z,d[p]);++p
 break}if(t!=null)q.push(t)
@@ -14011,52 +14325,52 @@
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.Nd(b.gem())
+x=J.Nd(b.gkJ())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
 v.$builtinTypeInfo=[null]
-u=new G.DA(y,v,x,z,w)
+u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
 q.Ft=J.WB(q.Ft,s)
 if(t)continue
 z=u.Ft
-y=J.WB(z,u.VD.G4.length)
+y=J.WB(z,u.HD.G4.length)
 x=q.Ft
-p=P.J(y,J.WB(x,q.Ld))-P.y(z,x)
+p=P.J(y,J.WB(x,q.wF))-P.y(z,x)
 if(p>=0){C.Nm.W4(a,r);--r
-z=J.Hn(q.Ld,q.VD.G4.length)
+z=J.Hn(q.wF,q.HD.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
-z=J.WB(u.Ld,J.Hn(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
+z=J.WB(u.wF,J.Hn(q.wF,p))
+u.wF=z
+y=u.HD.G4.length
+x=q.HD.G4.length
 if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.Hn(q.Ft,u.Ft))
+else{o=q.kJ
+if(J.u6(u.Ft,q.Ft)){z=u.HD
+z=z.Yc(z,0,J.Hn(q.Ft,u.Ft))
 o.toString
 if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.WB(u.Ft,u.VD.G4.length),J.WB(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.Hn(J.WB(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
+H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
+J.bj(o,z.Yc(z,J.Hn(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
 t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.Hn(u.Ld,u.VD.G4.length)
+n=J.Hn(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
 hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
+z=H.VM([],[G.Zq])
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.ao;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XH;y.G();){w=y.Ff
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -14064,45 +14378,45 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.xC(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.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"yj;WA>,VD,em<,Ft,Ld",
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().G4.length))}return z},
+Zq:{
+"^":"yj;WA>,HD,kJ<,Ft,wF",
 gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-ck:function(a){var z
+gRt:function(){return this.HD},
+gNg:function(){return this.wF},
+vP:function(a){var z
 if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
 if(typeof z!=="number")return H.s(z)
 z=a<z}else z=!0
 if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.WB(this.Ft,this.Ld))},
+if(!J.xC(this.wF,this.HD.G4.length))return!0
+return J.u6(a,J.WB(this.Ft,this.wF))},
 bu:[function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,71],
-$isDA:true,
+y=this.HD
+return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+$isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
 z=new P.Yp(d)
 z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
+return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
-nd:{
+iv:{
 "^":"a;"},
 vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
+"^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.J8()},"$0","Jy",0,0,18],
+kM:[function(){return O.J8()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,V2:dUC%,me:U3%",
+"^":"a;R9:ro%,rJ:XY%,xt:cU%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
+this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
@@ -14116,57 +14430,57 @@
 $.Oo=z}z.push(a)
 $.Nc=$.Nc+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().fK(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().H6.II.t(0,x)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
+w=$.cp().JE.II.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
+y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
+dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
+if(this.grJ(a)==null||!this.gnz(a))return!1
+z.a=this.gxt(a)
+this.sxt(a,null)
+this.grJ(a).aN(0,new F.X6(z,a))
 if(z.a==null)return!1
 y=this.gR9(a)
 z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
+if(this.gxt(a)==null)this.sxt(a,[])
+this.gxt(a).push(b)},
 $isd3:true},
 X6:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().Tv(z,a)
+y=$.cp().Gp(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
+J.Zh(z).u(0,a,y)}},
+$isEH:true}}],["","",,A,{
 "^":"",
 xhq:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.zdr,this.DA,b)},
-bu:[function(a){return"#<"+new H.cu(H.wO(this),null).bu(0)+" value: "+H.d(this.DA)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:function(a){return this.Xq},
+sP:function(a,b){this.Xq=F.Wi(this,C.zdr,this.Xq,b)},
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
+"^":"uFU;lr@,Mu,XH,Vg,fn",
+gXF:function(){var z=this.Mu
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.iT=z}z.toString
+this.Mu=z}z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gB:function(a){return this.ao.length},
+gB:function(a){return this.XH.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.ao
+z=this.XH
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -14174,79 +14488,82 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.iT
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
+if(x)if(b<y){x=new H.wb()
+x.$builtinTypeInfo=[H.u3(z,0)]
+if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
+w=new H.bX(z,b,y)
+w.$builtinTypeInfo=[H.u3(x,0)]
 if(b<0)H.vh(P.N(b))
 if(y<0)H.vh(P.N(y))
 if(b>y)H.vh(P.TE(b,0,y))
-x=x.br(0)
+x=w.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
+this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
+this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.ao
+z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.iT
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 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)
+this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
-Yj:function(a,b,c){var z,y,x
+Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.iT
+z=this.Mu
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
+if(z&&y>0){z=this.XH
+x=H.VM(new H.wb(),[H.u3(z,0)])
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.na(this.ao,b,c)},
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XH,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
-this.On(y,y+1)
-x=this.iT
+this.Xy(y,y+1)
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
+if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
 C.Nm.FV(z,b)
-this.On(y,z.length)
+this.Xy(y,z.length)
 x=z.length-y
-z=this.iT
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
+if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
+for(z=this.XH,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
-UZ:function(a,b,c){var z,y,x,w,v,u,t
+oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XH.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XH.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.XH
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -14254,77 +14571,79 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.iT
+u=this.Mu
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
+if(u&&x>0){u=new H.wb()
+u.$builtinTypeInfo=[H.u3(w,0)]
+if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
 z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[null]
+z.$builtinTypeInfo=[H.u3(u,0)]
 if(b<0)H.vh(P.N(b))
 if(c<0)H.vh(P.N(c))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-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)))
+this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
+UG:function(a,b,c){var z,y,x,w
+if(b<0||b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.XH
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.na(z,b,c)
-this.On(x,z.length)
-z=this.iT
+H.h8(z,b,c)
+this.Xy(x,z.length)
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+if(z&&y>0)this.E2(G.K6(this,b,y,null))},
 xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
+if(b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XH
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.On(y-1,y)
-y=this.iT
+this.Xy(y-1,y)
+y=this.Mu
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
+if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-iH:function(a){var z,y
-z=this.iT
+E2:function(a){var z,y
+z=this.Mu
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
+if(this.lr==null){this.lr=[]
+P.rb(this.gL6())}this.lr.push(a)},
+Xy:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
-Ju:[function(){var z,y,x
-z=this.b3
+oCy:[function(){var z,y,x
+z=this.lr
 if(z==null)return!1
 y=G.Qi(this,z)
-this.b3=null
-z=this.iT
+this.lr=null
+z=this.Mu
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,123],
+if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.Zq])
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(x)
+return!0}return!1},"$0","gL6",0,0,125],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -14333,7 +14652,7 @@
 w=J.RE(x)
 v=J.WB(w.gvH(x),x.gNg())
 u=J.WB(w.gvH(x),x.gRt().G4.length)
-t=y.Mu(b,w.gvH(x),v)
+t=y.Yc(b,w.gvH(x),v)
 w=w.gvH(x)
 s=J.Wx(w)
 if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
@@ -14361,67 +14680,67 @@
 "^":"ark+Pi;",
 $isd3:true},
 xb:{
-"^":"Xs:74;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
+"^":"Xs:76;a",
+$0:function(){this.a.Mu=null},
+$isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;G3>,jL,zZ,aC,w5",
+"^":"yj;nl>,jL,zZ,aC,w5",
 bu:[function(a){var z
 if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
+return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(a){var z=this.Zp
+"^":"Pi;LL,Vg,fn",
+gvc:function(a){var z=this.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.Zp
+gUQ:function(a){var z=this.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.Zp
+gB:function(a){var z=this.LL
 return z.gB(z)},
-gl0:function(a){var z=this.Zp
+gl0:function(a){var z=this.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.Zp
+gor:function(a){var z=this.LL
 return z.gB(z)!==0},
-x4:function(a,b){return this.Zp.x4(0,b)},
-t:function(a,b){return this.Zp.t(0,b)},
+NZ:function(a,b){return this.LL.NZ(0,b)},
+t:function(a,b){return this.LL.t(0,b)},
 u:function(a,b,c){var z,y,x,w
-z=this.AP
+z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
+if(!z){this.LL.u(0,b,c)
+return}z=this.LL
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
 if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
 this.nq(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
-this.G8()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
+this.ld()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.Zp
+z=this.LL
 y=z.gB(z)
 x=z.Rz(0,b)
-w=this.AP
+w=this.Vg
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.ya(b,x,null,!1,!0),[null,null]))
 F.Wi(this,C.Wn,y,z.gB(z))
-this.G8()}return x},
+this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.Zp
+z=this.LL
 y=z.gB(z)
-x=this.AP
+x=this.Vg
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
-this.G8()}z.V1(0)},
-aN:function(a,b){return this.Zp.aN(0,b)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-G8:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
+this.ld()}z.V1(0)},
+aN:function(a,b){return this.LL.aN(0,b)},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
 $isqC:true,
 $isT8:true,
@@ -14433,42 +14752,42 @@
 return y}}},
 zT:{
 "^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
-Qw:{
-"^":"Ap;R7,OW,Oy,Ew,A2",
-HW:function(a){return this.OW.$1(a)},
-WM:function(a){return this.Ew.$1(a)},
+Wa:{
+"^":"Ap;Os,he,mD,Wv,XS",
+bl:function(a){return this.he.$1(a)},
+xq:function(a){return this.Wv.$1(a)},
 TR:function(a,b){var z
-this.Ew=b
-z=this.HW(J.mu(this.R7,this.gWz()))
-this.A2=z
+this.Wv=b
+z=this.bl(J.mu(this.Os,this.gYZ()))
+this.XS=z
 return z},
-fOr:[function(a){var z=this.HW(a)
-if(J.xC(z,this.A2))return
-this.A2=z
-return this.WM(z)},"$1","gWz",2,0,13,58],
-xO:function(a){var z=this.R7
+pN:[function(a){var z=this.bl(a)
+if(J.xC(z,this.XS))return
+this.XS=z
+return this.xq(z)},"$1","gYZ",2,0,12,60],
+xO:function(a){var z=this.Os
 if(z!=null)J.yd(z)
-this.R7=null
-this.OW=null
-this.Oy=null
-this.Ew=null
-this.A2=null},
-gP:function(a){var z=this.HW(J.Vm(this.R7))
-this.A2=z
+this.Os=null
+this.he=null
+this.mD=null
+this.Wv=null
+this.XS=null},
+gP:function(a){var z=this.bl(J.Vm(this.Os))
+this.XS=z
 return z},
-sP:function(a,b){J.ta(this.R7,b)},
-fR:function(){return this.R7.fR()}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.Os,b)},
+fR:function(){return this.Os.fR()}}}],["","",,L,{
 "^":"",
-Hj:function(a,b){var z,y,x,w,v
+yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{z=b
@@ -14477,16 +14796,16 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
-z=y&&!C.Nm.Gs(C.Zw,b)}else z=!0
-if(z)return J.UQ(a,$.Mg().H6.af.t(0,b))
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z)return J.UQ(a,$.Mg().JE.af.t(0,b))
 try{z=a
 y=b
-x=$.cp().H6.II.t(0,y)
+x=$.cp().JE.II.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.XK(a)
-v=$.mX().aR(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.VND()
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
+v=$.mX().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 EX:function(a,b,c){var z,y,x
@@ -14497,65 +14816,65 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
-z=y&&!C.Nm.Gs(C.Zw,b)}else z=!0
-if(z){J.kW(a,$.Mg().H6.af.t(0,b),c)
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z){J.kW(a,$.Mg().JE.af.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.XK(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.VND()
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"lg;HS,XF,xE,GX,D2,Wf,KZ",
+"^":"lg;HS,Lq,IE,zo,dR,vS,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
+if(z!=null)z.rL(this.Lq,b)},
+gDJ:function(){return 2},
 TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
-qc:function(a){this.xE=L.BH(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
+Ej:function(a){this.IE=L.SE(this,this.Lq)
+this.CG(!0)},
+U9:function(){this.vS=null
 this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
+this.Lq=null},
+VC:function(a){this.HS.I5(this.Lq,a)},
+CG:function(a){var z,y
+z=this.vS
+y=this.HS.WK(this.Lq)
+this.vS=y
 if(a||J.xC(y,z))return!1
-this.Aw(this.Wf,z,this)
+this.vk(this.vS,z,this)
 return!0},
-tF:function(){return this.hQ(!1)},
+mX:function(){return this.CG(!1)},
 $isAp:true},
 Zl:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
+"^":"a;T7",
+gB:function(a){return this.T7.length},
+gl0:function(a){return this.T7.length===0},
 gPu:function(){return!0},
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.OK,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
 v=J.x(w)
-if(!!v.$isIN){if(!x)z.vM+="."
-u=$.Mg().H6.af.t(0,w)
-z.vM+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.vM+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
-z.vM+=v}}return z.vM},"$0","gAY",0,0,71],
+if(!!v.$isIN){if(!x)z.IN+="."
+u=$.Mg().JE.af.t(0,w)
+z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
+z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
+z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.OK
+z=this.T7
 y=z.length
-x=b.OK
+x=b.T7
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.OK,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.T7,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -14563,29 +14882,29 @@
 x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
 x^=x>>>11
 return 536870911&x+((16383&x)<<15>>>0)},
-Tl:function(a){var z,y
+WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(a==null)return
-a=L.Hj(a,y)}return a},
+a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.OK
+z=this.T7
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
+a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
 return L.EX(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
+I5:function(a,b){var z,y,x,w
+if(!this.gPu()||this.T7.length===0)return
+z=this.T7
 y=z.length-1
 for(x=0;a!=null;x=w){if(0>=z.length)return H.e(z,0)
 b.$2(a,z[0])
 if(x>=y)break
 w=x+1
 if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
+a=L.yfW(a,z[x])}},
 $isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
@@ -14596,12 +14915,12 @@
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.lo
+for(;z.G();){x=z.Ff
 if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.hW()
 w=z.t(0,a)
 if(w!=null)return w
 v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.Js()
+if(v==null)return $.lf()
 w=new L.Zl(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
@@ -14609,19 +14928,19 @@
 if(!t.G())H.vh(H.DU())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
-TV:{
-"^":"Zl;OK",
+vH:{
+"^":"Zl;T7",
 gPu:function(){return!1},
-static:{"^":"qa"}},
-lPa:{
-"^":"Xs:74;",
+static:{"^":"l7"}},
+DOe:{
+"^":"Xs:76;",
 $0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
 iF:{
-"^":"a;vc>,vH>,G3>,tq",
-T2:function(a){var z
+"^":"a;vc>,vH>,nl>,ep",
+Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -14629,202 +14948,203 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-PS:function(){var z,y,x,w
-z=this.G3
+ZW:function(){var z,y,x,w
+z=this.nl
 if(z==null)return
-z=$.Gx().zD(z)
+z=$.cx().B0(z)
 y=this.vc
-x=this.G3
-if(z)y.push($.Mg().H6.NU.t(0,x))
+x=this.nl
+if(z)y.push($.Mg().JE.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
-y.push(w!=null?w:this.G3)}this.G3=null},
-mx:function(a,b){var z=this.G3
-this.G3=z==null?b:H.d(z)+H.d(b)},
-YD:function(a,b){var z,y,x
+y.push(w!=null?w:this.nl)}this.nl=null},
+mx:function(a,b){var z=this.nl
+this.nl=z==null?b:H.d(z)+H.d(b)},
+lA:function(a,b){var z,y,x
 z=this.vH
 y=b.length
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.LY([z])
+x=H.eT([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
-z=this.G3
-this.G3=z==null?x:H.d(z)+x
+z=this.nl
+this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q
-z=U.Fa(J.Ii(a),0,null,65533)
-for(y=z.length,x="beforePath";!0;){w=++this.vH
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=U.dZr(J.OX(a),0,null,65533)
+for(y=z.length,x="beforePath";x!=null;){w=++this.vH
 if(w>=y)v=null
 else{if(w<0)return H.e(z,w)
-v=z[w]}if(v!=null)w=H.LY([v])==="\\"&&this.YD(x,z)
+v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.lA(x,z)
 else w=!1
 if(w)continue
-u=this.T2(v)
-if(x==="error")return
-t=this.tq.t(0,x)
+u=this.Xn(v)
+if(J.xC(x,"error"))return
+t=this.ep.t(0,x)
 s=t.t(0,u)
 if(s==null)s=t.t(0,"else")
 if(s==null)return
-w=s.length
-if(0>=w)return H.e(s,0)
-x=s[0]
-r=w>1?s[1]:null
-if(r==="push"&&this.G3!=null)this.PS()
-if(r==="append"){w=s.length
-if(w>2&&!0){if(2>=w)return H.e(s,2)
-q=s[2]}else q=H.LY([v])
-w=this.G3
-this.G3=w==null?q:H.d(w)+q}if(x==="afterPath")return this.vc}return}},
+w=J.U6(s)
+x=w.t(s,0)
+r=w.gB(s)>1?w.t(s,1):null
+q=J.x(r)
+if(q.n(r,"push")&&this.nl!=null)this.ZW()
+if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
+q=!0}else q=!1
+if(q)p=w.t(s,2)
+else p=H.eT([v])
+w=this.nl
+this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
 PD:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return},
 $isEH:true},
-ww:{
-"^":"lg;xE,DT,VZ,GX,D2,Wf,KZ",
-gIn:function(){return 3},
+bg:{
+"^":"lg;IE,pu,vl,zo,dR,vS,KZ",
+gDJ:function(){return 3},
 TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
-qc:function(a){var z,y,x,w
-for(z=this.VZ,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.aZ){z=$.xG
-if(z!=null){y=z.kTd
+Ej:function(a){var z,y,x,w
+for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.rf
+if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=w==null?null:P.Ls(null,null,null,null)
-z=new L.zG(w,z,[],null)
-$.xG=z}if(z.kTd==null){z.kTd=w
-z.Fw=P.Ls(null,null,null,null)}z.JD.push(this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}this.hQ(!this.DT)},
-kH:function(){var z,y,x,w
-for(z=0;y=this.VZ,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
+z=new L.Og(w,z,[],null)
+$.rf=z}if(z.Ou==null){z.Ou=w
+z.cE=P.Ls(null,null,null,null)}z.JD.push(this)
+this.VC(z.gUu(z))
+this.IE=null
+break}}this.CG(!this.pu)},
+U9:function(){var z,y,x,w
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
-J.yd(y[w])}this.VZ=null
-this.Wf=null},
-yN:function(a,b){var z=this.KZ
+J.yd(y[w])}this.vl=null
+this.vS=null},
+WX:function(a,b){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
-z=this.VZ
+z=this.vl
 z.push(a)
 z.push(b)
-if(!this.DT)return
-J.bi(this.Wf,b.Tl(a))},
-ti:function(a){return this.yN(a,null)},
-Qs:function(a){var z=this.KZ
+if(!this.pu)return
+J.bi(this.vS,b.WK(a))},
+ti:function(a){return this.WX(a,null)},
+YU:function(a){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Cannot add observers once started."))
-z=this.VZ
+z=this.vl
 z.push(C.aZ)
 z.push(a)
-if(!this.DT)return
-J.bi(this.Wf,J.mu(a,new L.Zu(this)))},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.VZ,x=y.length,z<x;z+=2){w=y[z]
+if(!this.pu)return
+J.bi(this.vS,J.mu(a,new L.bjd(this)))},
+VC:function(a){var z,y,x,w,v
+for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.VZ.length,2))
-for(z=!1,y=null,x=0;w=this.VZ,v=w.length,x<v;x+=2){u=w[x]
+H.Go(y[v],"$isZl").I5(w,a)}}},
+CG:function(a){var z,y,x,w,v,u,t,s,r
+J.wg(this.vS,C.jn.BU(this.vl.length,2))
+for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
 if(u===C.aZ){H.Go(s,"$isAp")
-r=this.KZ===$.jq?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isZl").Tl(u)
-if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
-continue}w=this.Wf
-v=C.jn.cU(x,2)
+r=this.KZ===$.FU?s.TR(0,new L.Xu(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
+if(a){J.kW(this.vS,C.jn.BU(x,2),r)
+continue}w=this.vS
+v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.D2
+w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
+y.u(0,v,J.UQ(this.vS,v))}J.kW(this.vS,v,r)
 z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
+this.vk(this.vS,y,w)
 return!0},
-tF:function(){return this.hQ(!1)},
+mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
-"^":"Xs:13;a",
+bjd:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.SG()
-return},"$1",null,2,0,null,14,"call"],
+if(z.KZ===$.ljh)z.fl()
+return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-cmp:{
-"^":"Xs:13;a",
+Xu:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.SG()
-return},"$1",null,2,0,null,14,"call"],
+if(z.KZ===$.ljh)z.fl()
+return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 lg:{
 "^":"Ap;",
-c8:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-rF:function(a,b){return this.GX.$2(a,b)},
-uC:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8:function(){return this.KZ===$.ljh},
+Yd:function(){return this.zo.$0()},
+d1:function(a){return this.zo.$1(a)},
+qk:function(a,b){return this.zo.$2(a,b)},
+Tu:function(a,b,c){return this.zo.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ljh},
 TR:function(a,b){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Observer has already been opened."))
-if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.D2=P.J(this.gIn(),X.RI(b))
-this.qc(0)
+if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.zo=b
+this.dR=P.J(this.gDJ(),X.aW(b))
+this.Ej(0)
 this.KZ=$.ljh
-return this.Wf},
-gP:function(a){this.hQ(!0)
-return this.Wf},
+return this.vS},
+gP:function(a){this.CG(!0)
+return this.vS},
 xO:function(a){if(this.KZ!==$.ljh)return
-this.kH()
-this.Wf=null
-this.GX=null
+this.U9()
+this.vS=null
+this.zo=null
 this.KZ=$.zk},
-fR:function(){if(this.KZ===$.ljh)this.SG()},
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.D2){case 0:this.c8()
+fR:function(){if(this.KZ===$.ljh)this.fl()},
+fl:function(){var z=0
+while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
+vk:function(a,b,c){var z,y,x,w
+try{switch(this.dR){case 0:this.Yd()
 break
-case 1:this.K0(a)
+case 1:this.d1(a)
 break
-case 2:this.rF(a,b)
+case 2:this.qk(a,b)
 break
-case 3:this.uC(a,b,c)
+case 3:this.Tu(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}}},
-zG:{
-"^":"a;kTd,Fw,JD,rS",
-HF:[function(a,b,c){var z=this.kTd
-if(b==null?z==null:b===z)this.Fw.h(0,c)
+Og:{
+"^":"a;Ou,cE,JD,YR",
+zJ:[function(a,b,c){var z=this.Ou
+if(b==null?z==null:b===z)this.cE.h(0,c)
 z=J.x(b)
-if(!!z.$iswn)this.kl(b.gQV())
-if(!!z.$isd3)this.kl(z.gqh(b))},"$2","gTT",4,0,174,95,175],
-kl:function(a){var z=this.rS
+if(!!z.$iswn)this.hr(b.gXF())
+if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,177,96,178],
+hr:function(a){var z=this.YR
 if(z==null){z=P.YM(null,null,null,null,null)
-this.rS=z}if(!z.x4(0,a))this.rS.u(0,a,a.yI(this.gCP()))},
+this.YR=z}if(!z.NZ(0,a))this.YR.u(0,a,a.yI(this.gCP()))},
 b2:function(a){var z,y,x,w
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.x(y)
-if(!!x.$isqI){if(y.WA!==this.kTd||this.Fw.Gs(0,y.oc))return!1}else if(!!x.$isDA){x=y.WA
-w=this.kTd
-if((x==null?w!=null:x!==w)||this.Fw.Gs(0,y.Ft))return!1}else return!1}return!0},
-t9:[function(a){var z,y,x
+if(!!x.$isqI){if(y.WA!==this.Ou||this.cE.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
+w=this.Ou
+if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
+F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-if(x.ga8())x.nf(this.gTT(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
-if(x.ga8())x.tF()}},"$1","gCP",2,0,20,176],
-static:{"^":"xG",BH:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.kTd
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
+if(x.gB9())x.mX()}},"$1","gCP",2,0,19,179],
+static:{"^":"rf",SE:function(a,b){var z,y
+z=$.rf
+if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=b==null?null:P.Ls(null,null,null,null)
-z=new L.zG(b,z,[],null)
-$.xG=z}if(z.kTd==null){z.kTd=b
-z.Fw=P.Ls(null,null,null,null)}z.JD.push(a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+z=new L.Og(b,z,[],null)
+$.rf=z}if(z.Ou==null){z.Ou=b
+z.cE=P.Ls(null,null,null,null)}z.JD.push(a)
+a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
@@ -14834,11 +15154,11 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
+return x}return a},"$1","Ft",2,0,12,20],
 Qe:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
+"^":"Xs:81;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,135,66,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 Eo:function(a,b,c){if(a==null||$.lx()==null)return
 $.lx().V7("shimStyling",[a,b,c])},
@@ -14847,24 +15167,24 @@
 if($.UG)return""
 w=J.RE(a)
 z=w.gmH(a)
-if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
+if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.Ar.eo(w,"GET",z,!1)
+C.W3.eo(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
-x=new H.XO(v,null)
-$.mw().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+x=new H.oP(v,null)
+$.bm().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
-M8:[function(a){var z,y
-z=$.Mg().H6.af.t(0,a)
+fS:[function(a){var z,y
+z=$.Mg().JE.af.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","tq",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-x9:function(a,b){var z,y,x,w
+H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
+ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
 if($.Ep()===!0)b=document.head
@@ -14874,14 +15194,14 @@
 if(y!=null)z.setAttribute("element",y)
 x=b.firstChild
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
+if(w.gor(w))x=J.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
 YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
+return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!0
+if($.oQ)throw H.b("Initialization was already done.")
+$.oQ=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
@@ -14889,28 +15209,28 @@
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,82,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+J.UQ($.bI(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,84,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
 JP:function(){var z,y,x,w
-z=$.Si()
+z=$.Xw()
 if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
 y=J.UQ(z,"Polymer")
 if(y==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
 x=$.X3
 y.V7("whenPolymerReady",[x.ce(new A.XR())])
-w=J.UQ($.XX(),"register")
+w=J.UQ($.bI(),"register")
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,YT<,kK<,Bj<,Qk,lD,Uj>,eJ<,kX,t4",
+J.kW($.bI(),"register",P.mt(new A.k2(x,w)))},
+So:{
+"^":"a;FL>,t5>,Jh<,oc>,Q7<,jA<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,Sg,vT",
 gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
+z=J.yR(this.FL,"template")
+if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gXj()}x=document
+for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
+y=y.gJh()}x=document
 W.Ct(window,x,a,this.t5,z)},
 Cw:function(a){var z=$.Kc()
 if(z==null)return
@@ -14919,78 +15239,81 @@
 if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-this.Q7=y}if(a.gBj()!=null){z=a.gBj()
+this.Q7=y}if(a.gix()!=null){z=a.gix()
 y=P.Ls(null,null,null,null)
 y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.nT(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.V9()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+this.ix=y}}z=this.t5
+this.en(z)
+x=J.Vs(this.FL).dA.getAttribute("attributes")
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
 if(v==="")continue
-u=$.Mg().H6.NU.t(0,v)
+u=$.Mg().JE.T4.t(0,v)
 t=L.hk([u])
 s=this.Q7
-if(s!=null&&s.x4(0,t))continue
+if(s!=null&&s.NZ(0,t))continue
 r=$.mX().CV(z,u)
-if(r==null||r.gUA()||J.Z6(r)===!0){window
+if(r==null||r.gUA()||J.EMK(r)===!0){window
 s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(s)
 continue}s=this.Q7
 if(s==null){s=P.Fl(null,null)
 this.Q7=s}s.u(0,t,r)}},
-nT:function(a){var z,y,x,w
-for(z=$.mX().fK(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+en:function(a){var z,y,x,w,v
+for(z=$.mX().Me(0,a,C.LM),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
+w=y.gDv()
+v=new H.wb()
+v.$builtinTypeInfo=[H.u3(w,0)]
+w=new H.U5(w,new A.Zd())
+w.$builtinTypeInfo=[H.u3(v,0)]
+if(w.Vr(0,new A.Da())){w=this.ix
 if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.Mg().H6.af.t(0,x))}}},
+this.ix=w}x=x.goc(y)
+w.h(0,$.Mg().JE.af.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.Xj
-if(y!=null)z.FV(0,y.gkK())
+this.CY=z
+y=this.Jh
+if(y!=null)z.FV(0,y.gCY())
 J.Vs(this.FL).aN(0,new A.EB(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
+ka:function(){var z=this.Bg("link[rel=stylesheet]")
+this.y0=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
-OL:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
+this.G9=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+yq:function(){var z,y,x,w,v,u,t,s
+z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[null])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
+for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
+t=w.IN+=typeof u==="string"?u:H.d(u)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.glb(x))}}},
-oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
+z.FO(x,s,z.gNL(x))}}},
+Wz:function(a,b){var z,y,x
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
-Bg:function(a){return this.oP(a,null)},
-kO:function(a){var z,y,x,w,v,u
+Bg:function(a){return this.Wz(a,null)},
+ds:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.u3(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
-u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
-w=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=w+"\n\n"}return z.vM},
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
+u=z.IN+=typeof v==="string"?v:H.d(v)
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+w=z.IN+=typeof v==="string"?v:H.d(v)
+z.IN=w+"\n\n"}return z.IN},
 J3:function(a,b){var z
 if(a==="")return
 z=document.createElement("style",null)
@@ -14998,90 +15321,90 @@
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.HN(),z=$.mX().fK(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
+for(z=$.rt(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.Mg().H6.af.t(0,w)
+v=$.Mg().JE.af.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.Hn(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9:function(){var z,y,x
-for(z=$.mX().fK(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo.gDv()
+this.eJ.u(0,L.hk(v),[x.goc(y)])}},
+I7:function(){var z,y,x
+for(z=$.mX().Me(0,this.t5,C.nk),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
 x=new H.a7(y,y.length,0,null)
 x.$builtinTypeInfo=[H.u3(y,0)]
 for(;x.G();)continue}},
-Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
+jq:function(a){var z=P.L5(null,null,null,P.qU,null)
 a.aN(0,new A.Tj(z))
 return z},
-hW:function(){var z,y,x,w,v,u,t,s,r
+ut:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.mX().fK(0,this.t5,C.rL),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.YT;y.G();){w=y.lo
+for(y=$.mX().Me(0,this.t5,C.ci),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
 v=H.Sz(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
-r=J.zHh(s)
-r=$.mX().dM(u,r)
+r=J.zH(s)
+r=$.mX().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gEV())
+if(u){x.u(0,t,v.gfL())
 z.u(0,t,w)}}},
-$isXP:true,
+$isSo:true,
 static:{"^":"Kb"}},
 Zd:{
-"^":"Xs:13;",
-$1:function(a){return!!J.x(a).$ishG},
+"^":"Xs:12;",
+$1:function(a){return!!J.x(a).$isxn},
 $isEH:true},
 Da:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return a.gvn()},
 $isEH:true},
 EB:{
-"^":"Xs:80;a",
-$2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
+"^":"Xs:81;a",
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).Mw(b,"{{")
+if(z.nC(a,"on-")){y=J.U6(b).OY(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)))}},
 $isEH:true},
 IJ:{
-"^":"Xs:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
+"^":"Xs:12;",
+$1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ua:{
-"^":"Xs:13;a",
+Vi:{
+"^":"Xs:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
-XUG:{
-"^":"Xs:74;",
+eM:{
+"^":"Xs:76;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Xs:177;a",
+"^":"Xs:180;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!1},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,DP",
+"^":"BG9;Mn,oe",
 op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
 return this.Mn.op(a,b,c)},
-static:{"^":"rf,QPA"}},
+static:{"^":"rd0,QPA"}},
 BG9:{
 "^":"VE+d23;"},
 d23:{
 "^":"a;",
 XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
+for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
+a=z.gAd(a)}return!!z.$isI0?a.host:null},
+Z8:function(a,b,c){var z={}
 z.a=a
 return new A.l5(z,this,b,c)},
 CZ:function(a,b,c){var z,y,x,w
@@ -15090,65 +15413,65 @@
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.fE.t(0,x)
+w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
 l5:{
-"^":"Xs:13;a,b,c,d",
+"^":"Xs:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
 if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=y.gey(a)
+if(!!y.$isDG4){w=y.gey(a)
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
-y=y.gSd(a)
+y=y.gCa(a)
 z=z.a
-J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
+J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 liz:{
-"^":"Xs:181;a,b,c",
+"^":"Xs:184;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.bi,x.Ph,W.aF(y),x.Sg),[H.u3(x,0)])
-w.Zz()
+y=this.b.Z8(null,b,z)
+x=J.PB(b).t(0,this.a.a)
+w=H.VM(new W.Ov(0,x.bi,x.fA,W.aF(y),x.el),[H.u3(x,0)])
+w.DN()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,178,179,180,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
 d6:{
-"^":"Ap;Jq,ED",
+"^":"Ap;Sx,ED",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
+xO:function(a){var z=this.Sx
+if(z!=null){z.Gv()
+this.Sx=null}}},
+xn:{
+"^":"iv;vn<",
+$isxn:true},
 xc:{
-"^":"TR0;AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-XI:function(a){this.bp(a)},
+"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+XI:function(a){this.kR(a)},
 static:{G7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.GBL.ZL(a)
+a.n9=x
+a.wy=w
+C.GBL.LX(a)
 C.GBL.XI(a)
 return a}}},
 jpR:{
-"^":"Bo+zs;XG:SD=",
+"^":"M8+zs;Cp:n7=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -15159,93 +15482,94 @@
 "^":"jpR+Pi;",
 $isd3:true},
 zs:{
-"^":"a;XG:SD=",
+"^":"a;Cp:n7=",
 gFL:function(a){return a.IX},
-gUj:function(a){return},
+gwX:function(a){return},
 gRT:function(a){var z,y
 z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
+if(z!=null)return J.DA(z)
+y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
-bp:function(a){var z,y
-z=this.gmSA(a)
+kR:function(a){var z,y
+z=this.gmb(a)
 if(z!=null&&z.k8!=null){window
 y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
 if(typeof console!="undefined")console.warn(y)}this.Ec(a)
-y=this.gM0(a)
+y=this.gJ8(a)
 if(!J.xC($.Ks().t(0,y),!0)||$.Ep()===!0)this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.XY(a)
+return}a.n7=P.XY(a)
 z=this.gRT(a)
 a.IX=$.vE().t(0,z)
-this.nt(a)
-z=a.Ij
-if(z!=null){y=this.gUc(a)
+this.jM(a)
+z=a.MJ
+if(z!=null){y=this.gnu(a)
 z.toString
-L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gPf(a))
-this.Z2(a)
-this.fk(a)
-this.qb(a)},
-rf:function(a){if(a.Ap)return
-a.Ap=!0
-this.Hv(a)
-this.Oh(a,a.IX)
+L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
+this.oR(a)
+this.TK(a)
+this.Uc(a)},
+rf:function(a){if(a.OD)return
+a.OD=!0
+this.bT(a)
+this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-this.e1(a)},
-e1:function(a){},
+$.zG().To(new A.X9(a))
+this.I9(a)},
+I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
-if(!a.oG){a.oG=!0
-this.Gy(a,new A.hp(a))}},
-dQ:function(a){this.d9(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gXj())
-this.aI(a,J.nq(b))}},
+if(!a.kK){a.kK=!0
+this.rW(a,new A.hp(a))}},
+Lx:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Wk(b,"template")
+y=z.XT(b,"template")
 if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
+w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
 if(b==null)return
-z=this.Gj(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.MO(x,a,y==null&&J.qy(x)==null?J.du(a.IX):y)
-v=a.Rr
-u=$.FC().t(0,w)
-C.Nm.FV(v,u!=null?u.gmD():u)
+z=this.er(a)
+y=this.gwX(a)
+x=!!J.x(b).$isvy?b:M.Xi(b)
+w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
+v=a.f4
+u=$.Tn().t(0,w)
+C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
-v=$.CE()
+v=$.Po()
 if(v!=null)v.V7("register",[z])
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
 y.u(0,J.eS(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-Z2:function(a){a.IX.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.gfl(a))},
+oR:function(a){a.IX.gCY().aN(0,new A.Sv(a))},
+TK:function(a){if(a.IX.gjA()==null)return
+this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.wo(c,$.iB())===!0)return
+if(c==null||J.kE(c,$.VCp())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().Tv(a,x)
+w=$.cp().Gp(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.XK(w):v)
+u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gfl",4,0,182],
-B2:function(a,b){var z=a.IX.gNF()
+$.cp().Cq(a,y,u)}},"$2","gCg",4,0,185],
+B2:function(a,b){var z=a.IX.gjA()
 if(z==null)return
 return z.t(0,b)},
 TW:function(a,b){if(b==null)return
@@ -15253,198 +15577,201 @@
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
-z=L.hk(b).Tl(a)
+z=L.hk(b).WK(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
+if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.FS(M.SB(a),b,c,d)
+if(z==null)return J.tf(M.Xi(a),b,c,d)
 else{y=J.RE(z)
-x=this.YV(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Si(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.C5(M.SB(a))==null){w=P.Fl(null,null)
-J.nC(M.SB(a),w)}J.kW(J.C5(M.SB(a)),b,x)}v=a.IX.gBj()
+x=this.Fy(a,y.goc(z),c,d)
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
+J.Rb(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.Mg().H6.af.t(0,y)
-if(v!=null&&v.Gs(0,u))this.QH(a,u)
+u=$.Mg().JE.af.t(0,y)
+if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.SB(a))},
-sCd:function(a,b){J.nC(M.SB(a),b)},
-gmSA:function(a){return J.qb(M.SB(a))},
-d9:function(a){var z,y
-if(a.Uk===!0)return
-$.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gLh(a)
+lL:function(a){return this.rf(a)},
+gCd:function(a){return J.QE(M.Xi(a))},
+sCd:function(a,b){J.Rb(M.Xi(a),b)},
+gmb:function(a){return J.re(M.Xi(a))},
+x3:function(a){var z,y
+if(a.bb===!0)return
+$.iX().J4(new A.N3(a))
+z=a.TT
+y=this.gyz(a)
 if(z==null)z=new A.FT(null,null,null)
 z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
+a.TT=z},
+Iv:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.Uk=!0},"$0","gLh",0,0,18],
+a.bb=!0},"$0","gyz",0,0,17],
 oW:function(a){var z
-if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
+if(a.bb===!0){$.iX().j2(new A.TV(a))
+return}$.iX().J4(new A.ti(a))
+z=a.TT
 if(z!=null){z.nY(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=new L.ww(null,!1,[],null,null,null,$.jq)
-y.Wf=[]
-a.Ij=y
-a.Rr.push(y)
-for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.Fb,x=H.VM(new P.EQ(w,w.Ig(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
-y.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,183],
-Dq:[function(a,b){var z,y,x,w
-for(z=J.mY(b),y=a.iQ;z.G();){x=z.gl()
+a.TT=null}},
+jM:function(a){var z,y,x,w,v
+z=J.WM(a.IX)
+if(z!=null){y=new L.bg(null,!1,[],null,null,null,$.FU)
+y.vS=[]
+a.MJ=y
+a.f4.push(y)
+for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
+y.WX(a,v)
+this.j6(a,v,v.WK(a),null)}}},
+im:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.WM(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,186],
+p7:[function(a,b){var z,y,x,w
+for(z=J.mY(b),y=a.n9;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
 w=x.oc
 if(y.t(0,w)!=null)continue
-this.xD(a,w)}},"$1","gPf",2,0,184,176],
-xD:function(a,b){var z,y
-z=$.Mg().H6.af.t(0,b)
-y=a.IX.gBj()
-if(y!=null&&y.Gs(0,z))this.QH(a,z)},
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
+this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,187,179],
+Dt:function(a,b,c,d){var z,y
+$.Is().To(new A.qW(a,b,c,d))
+z=$.Mg().JE.af.t(0,b)
+y=a.IX.gix()
+if(y!=null&&y.tg(0,z))this.QH(a,z)},
+j6:function(a,b,c,d){var z,y,x,w,v
+z=J.WM(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.dnO()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dnO()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.ps(new A.Y0(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
+if(!!J.x(d).$iswn){$.dnO().J4(new A.Y0(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dnO().J4(new A.kMK(a,b))
+x=c.gXF().k0(new A.xfo(a,d,y),null,null,!1)
+w=H.d(b)+"__array"
+v=a.Bd
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.q9=v}v.u(0,x,w)}},
+a.Bd=v}v.u(0,w,x)}},
 hq:function(a,b,c,d){if(d==null?c==null:d===c)return
-this.xD(a,b)},
-hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=$.cp().H6.II.t(0,b)
+this.Dt(a,b,c,d)},
+hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().JE.II.t(0,b)
 if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
-x=a.iQ.t(0,b)
+x=a.n9.t(0,b)
 if(x==null){w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,y)
 v=new A.lK(a,b,c,null,null)
-w=this.gqh(a)
-u=v.gXQ()
-t=w.w4(!1)
-t.ps(u)
-t.fm(0,null)
-t.y5(null)
-v.Jq=t
-u=J.mu(c,v.gap())
-v.dY=u
-s=$.cp().H6.F8.t(0,b)
-if(s==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
-s.$2(a,u)
-a.Rr.push(v)
-return v}x.pR=c
+v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
+w=J.mu(c,v.gls())
+v.SS=w
+u=$.cp().JE.F8.t(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u.$2(a,w)
+a.f4.push(v)
+return v}x.mn=c
 w=J.RE(c)
-r=w.TR(c,x.gaX())
-if(d){q=r==null?y:r
-if(r==null?y!=null:r!==y){w.sP(c,q)
-r=q}}y=x.VB
+t=w.TR(c,x.gUe())
+if(d){s=t==null?y:t
+if(t==null?y!=null:t!==y){w.sP(c,s)
+t=s}}y=x.VB
 w=x.I6
-u=x.RT
-p=J.RE(w)
-x.VB=p.ct(w,u,y,r)
-p.hq(w,u,r,y)
+r=x.RT
+q=J.RE(w)
+x.VB=q.ct(w,r,y,t)
+q.hq(w,r,t,y)
 v=new A.p0(x)
-a.Rr.push(v)
+a.f4.push(v)
 return v},
-wc:function(a,b,c){return this.hO(a,b,c,!1)},
-vz:function(a,b){var z=a.IX.gYT().t(0,b)
+hH:function(a,b,c){return this.hO(a,b,c,!1)},
+yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.Adk().$3$globals(T.u5().$1(z),a,J.du(a.IX).Mn.nF)},
-Hv:function(a){var z,y,x,w,v,u,t,s
-z=a.IX.gYT()
-for(v=J.iY(z),u=v.Fb,v=H.VM(new P.N6(u,u.zN,null,null),[H.u3(v,0)]),v.zq=v.Fb.H9,u=a.iQ;v.G();){y=v.fD
-try{x=this.vz(a,y)
-if(u.t(0,y)==null){t=new A.Kk(y,J.Vm(x),a,null)
+return T.V4().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+bT:function(a){var z,y,x,w,v,u,t,s
+z=a.IX.gGl()
+for(v=J.mY(J.iY(z)),u=a.n9;v.G();){y=v.gl()
+try{x=this.yO(a,y)
+if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.Rr,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(y!=null)J.yd(y)}a.Rr=[]},
-Mx:function(a,b){var z=a.q9.Rz(0,b)
+for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(y!=null)J.yd(y)}a.f4=[]},
+Mx:function(a,b){var z=a.Bd.Rz(0,b)
 if(z==null)return!1
-z.ed()
+z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.q9
+z=a.Bd
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-YV:function(a,b,c,d){var z=$.aQ()
-if(z.mL(C.t4))z.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(b)+"]")
-if(d){if(!!J.x(c).$isAp)z.j2("bindProperty: expected non-bindable value on a one-time binding to ["+H.d(this.gRT(a))+"].["+H.d(b)+"], but found "+H.d(c)+".")
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
+if(y!=null)y.Gv()}a.Bd.V1(0)
+a.Bd=null},
+Fy:function(a,b,c,d){var z=$.Lu()
+z.J4(new A.aM(a,b,c))
+if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
 $.cp().Cq(a,b,c)
 return}return this.hO(a,b,c,!0)},
-qb:function(a){var z,y
-z=a.IX.geJ()
+Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-y=$.vo()
-if(y.mL(C.t4))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.vo()
-y=z.mL(C.t4)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(c)
-if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
-C.Nm.sB(d,x)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){w=$.Mg().H6.NU.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-Gy:function(a,b){var z
+$.q1().J4(new A.SX(a,z))
+z.aN(0,new A.Jys(a))},
+ea:function(a,b,c,d){var z,y,x
+z=$.q1()
+z.To(new A.od(a,c))
+if(!!J.x(c).$isEH){y=X.aW(c)
+if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
+C.Nm.sB(d,y)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.Mg().JE.T4.t(0,c)
+$.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
+z.J4(new A.cB(a,c))},
+rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.ol.pl(z)
-return C.ol.oB(z,W.aF(b))},
+C.Ui.Wq(z)
+return C.Ui.ne(z,W.aF(b))},
 SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.H2(a,z)
+this.Ph(a,z)
 return z},
-te:function(a,b){return this.SE(a,b,null,null,null,null)},
+ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
 $iszs:true,
 $isvy:true,
 $isd3:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true},
+X9:{
+"^":"Xs:76;a",
+$0:[function(){return"["+J.AG(this.a)+"]: ready"},"$0",null,0,0,null,"call"],
+$isEH:true},
 hp:{
-"^":"Xs:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Sv:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
-if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
+if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"Xs:74;b",
+"^":"Xs:76;b",
 $0:function(){return this.b},
 $isEH:true},
+N3:{
+"^":"Xs:76;a",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
+TV:{
+"^":"Xs:76;a",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
+ti:{
+"^":"Xs:76;b",
+$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
 N4:{
-"^":"Xs:80;a,b,c,d,e,f",
+"^":"Xs:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -15457,97 +15784,129 @@
 if(u==null)return
 for(v=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;v.G();){p=v.gl()
 if(!q.h(0,p))continue
-s.rJ(t,w,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,96,57,"call"],
+s.j6(t,w,y,b)
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,59,"call"],
+$isEH:true},
+qW:{
+"^":"Xs:76;a,b,c,d",
+$0:[function(){return"["+J.AG(this.a)+"]: "+H.d(this.b)+" changed from: "+H.d(this.d)+" to: "+H.d(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
-"^":"Xs:13;a,b,c",
+"^":"Xs:76;a,b",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kMK:{
+"^":"Xs:76;c,d",
+$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+xfo:{
+"^":"Xs:12;e,f,UI",
 $1:[function(a){var z,y,x,w
-for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,185,"call"],
+for(z=J.mY(this.UI),y=this.e,x=this.f;z.G();){w=z.gl()
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,188,"call"],
+$isEH:true},
+aM:{
+"^":"Xs:76;a,b,c",
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$isEH:true},
+aMY:{
+"^":"Xs:76;d,e,f",
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
-"^":"Xs:80;a",
+"^":"Xs:76;a,b",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
+$isEH:true},
+Jys:{
+"^":"Xs:81;c",
 $2:function(a,b){var z,y
-z=this.a
-y=J.Ei(z).t(0,a)
-H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.u3(y,0)]).Zz()},
+z=this.c
+y=J.PB(z).t(0,a)
+H.VM(new W.Ov(0,y.bi,y.fA,W.aF(J.v7(z.IX).Z8(z,z,b)),y.el),[H.u3(y,0)]).DN()},
+$isEH:true},
+od:{
+"^":"Xs:76;a,b",
+$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+cB:{
+"^":"Xs:76;c,d",
+$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
-"^":"Ap;I6,NV,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.NV,a)},"$1","gap",2,0,20,58],
-HX:[function(a){var z,y,x,w,v
-for(z=J.mY(a),y=this.NV;z.G();){x=z.gl()
+"^":"Ap;I6,ko,q0,Sx,SS",
+z9N:[function(a){this.SS=a
+$.cp().Cq(this.I6,this.ko,a)},"$1","gls",2,0,19,60],
+TZ:[function(a){var z,y,x,w,v
+for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().H6.II.t(0,y)
+w=$.cp().JE.II.t(0,y)
 if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
-z=this.dY
+z=this.SS
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,184,176],
+return}}},"$1","gou",2,0,187,179],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
 return b},
-xO:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.yd(this.q0)}},
+xO:function(a){var z=this.Sx
+if(z!=null){z.Gv()
+this.Sx=null}J.yd(this.q0)}},
 p0:{
-"^":"Ap;iL",
+"^":"Ap;pO",
 TR:function(a,b){},
 gP:function(a){return},
 sP:function(a,b){},
 fR:function(){},
 xO:function(a){var z,y
-z=this.iL
-y=z.pR
+z=this.pO
+y=z.mn
 if(y==null)return
 J.yd(y)
-z.pR=null}},
+z.mn=null}},
 FT:{
-"^":"a;jd,oK,lS",
-Ws:function(){return this.jd.$0()},
+"^":"a;Hi,Ar,lS",
+Dj:function(){return this.Hi.$0()},
 t6:function(a,b,c){var z
 this.nY(0)
-this.jd=b
+this.Hi=b
 z=window
-C.ol.pl(z)
-this.lS=C.ol.oB(z,W.aF(new A.K3(this)))},
+C.Ui.Wq(z)
+this.lS=C.Ui.ne(z,W.aF(new A.K3(this)))},
 nY:function(a){var z,y
 z=this.lS
 if(z!=null){y=window
-C.ol.pl(y)
+C.Ui.Wq(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.oK
-if(z!=null){z.ed()
-this.oK=null}}},
+this.lS=null}z=this.Ar
+if(z!=null){z.Gv()
+this.Ar=null}}},
 K3:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.oK!=null||z.lS!=null){z.nY(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
+if(z.Ar!=null||z.lS!=null){z.nY(0)
+z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 XR:{
-"^":"Xs:74;",
-$0:[function(){var z=$.yeH().MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(null)
+"^":"Xs:76;",
+$0:[function(){var z=$.j6().MM
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Xs:188;a,b",
+"^":"Xs:191;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,186,56,187,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,189,58,190,"call"],
 $isEH:true},
 zR:{
-"^":"Xs:74;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+"^":"Xs:76;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
 y=this.d
 x=this.e
@@ -15555,92 +15914,97 @@
 v=P.Fl(null,null)
 u=$.Ak()
 t=P.Fl(null,null)
-v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
 $.vE().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.NF=v.Yl(s)
+if(s!=null)v.jA=v.jq(s)
 v.rH()
-v.I9()
-v.hW()
+v.I7()
+v.ut()
 s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.SB(r),u)
-v.Mi()
+r=s.XT(z,"template")
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
+v.ka()
 v.f6()
-v.OL()
-A.x9(v.J3(v.kO("global"),"global"),document.head)
+v.yq()
+A.ZI(v.J3(v.ds("global"),"global"),document.head)
 v.Cw(z)
 v.Vk()
 v.W3(t)
-q=s.gQg(z).MW.getAttribute("assetpath")
+q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
+p=P.hK(s.gJ8(z).baseURI)
 z=P.hK(q)
 o=z.Fi
-if(o!==""){n=z.ku
+if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
+l=z.QB!=null?z.gtp(z):null}else{n=""
+m=null
+l=null}k=p.jn(z.Ee)
+j=z.xu
+if(j!=null);else j=null}else{o=p.Fi
+if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{u=z.pO
-if(u===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{u=J.co(u,"/")
-t=z.pO
-k=u?p.KO(t):p.KO(p.yM(p.pO,t))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}v.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
+l=P.JF(z.QB!=null?z.gtp(z):null,o)
+k=p.jn(z.Ee)
+j=z.xu
+if(j!=null);else j=null}else{u=z.Ee
+if(u===""){k=p.Ee
+j=z.xu
+if(j!=null);else j=p.xu}else{k=C.xB.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
+j=z.xu
+if(j!=null);else j=null}n=p.ku
+m=p.Kk
+l=p.QB}}i=z.ys
+if(i!=null);else i=null
+v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.Eo(z,y,w!=null?J.O6(w):null)
+A.Eo(z,y,w!=null?J.DA(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true},
-Kk:{
-"^":"a;RT,VB,I6,pR",
-u3:[function(a){var z,y,x,w
+Zw:{
+"^":"a;RT,VB,I6,mn",
+xz:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gaX",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"Kk")},58],
-gP:function(a){var z=this.pR
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
-sP:function(a,b){var z=this.pR
+sP:function(a,b){var z=this.mn
 if(z!=null)J.ta(z,b)
-else this.u3(b)},
+else this.xz(b)},
 bu:[function(a){var z,y
-z=$.Mg().H6.af.t(0,this.RT)
-y=this.pR==null?"(no-binding)":"(with-binding)"
-return"["+new H.cu(H.wO(this),null).bu(0)+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gAY",0,0,74]}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
+z=$.Mg().JE.af.t(0,this.RT)
+y=this.mn==null?"(no-binding)":"(with-binding)"
+return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
 q6:{
-"^":"k5d;Hf,ro,dUC,U3,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gk8:function(a){return J.ZH(a.Hf)},
 gA0:function(a){return J.qy(a.Hf)},
 sA0:function(a,b){J.D4(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.qy(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
+gwX:function(a){return J.qy(a.Hf)},
+v3:function(a,b,c){return J.dv(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
-this.bp(a)
-a.Hf=M.SB(a)
-z=T.GF(null,C.qY)
+this.kR(a)
+a.Hf=M.Xi(a)
+z=T.Mo(null,C.qY)
 J.D4(a.Hf,new Y.zp(a,z,null))
-$.yeH().MM.ml(new Y.lkK(a))},
+$.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
 static:{zE:function(a){var z,y,x,w
@@ -15649,18 +16013,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Gkp.ZL(a)
+a.n9=x
+a.wy=w
+C.Gkp.LX(a)
 C.Gkp.dX(a)
 return a}}},
-RS:{
-"^":"fX+zs;XG:SD=",
+GLL:{
+"^":"fX+zs;Cp:n7=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -15668,234 +16032,234 @@
 $isPZ:true,
 $isKV:true},
 k5d:{
-"^":"RS+d3;R9:ro%,V2:dUC%,me:U3%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
 $isd3:true},
 lkK:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.Sk(z,new Y.Mrx(z))},"$1",null,2,0,null,14,"call"],
+J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.te(z,"template-bound")},"$1",null,2,0,null,14,"call"],
+y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
-"^":"Li;dq,Mn,DP",
-XB:function(a){return this.dq}}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+"^":"Li;dq,Mn,oe",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-Zh:function(a,b,c){var z,y,x
-z=$.Rf().t(0,c)
+fd:function(a,b,c){var z,y,x
+z=$.Al().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.xr.iQ(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"Xs:80;",
+"^":"Xs:81;",
+$2:function(a,b){return a},
+$isEH:true},
+Uf:{
+"^":"Xs:81;",
 $2:function(a,b){return a},
 $isEH:true},
 wJY:{
-"^":"Xs:80;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-W6o:{
-"^":"Xs:80;",
+zOQ:{
+"^":"Xs:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-MdQ:{
-"^":"Xs:80;",
+W6o:{
+"^":"Xs:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
 pp:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-YJG:{
-"^":"Xs:80;",
+MdQ:{
+"^":"Xs:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 Rj:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","PG",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
+return z},"$1","PG6",2,0,52,66],
+SC:[function(a){var z=J.x(a)
+if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.xA(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
+return z},"$1","Oq",2,0,52,66],
 IK:{
-"^":"Xs:13;a",
-$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,189,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,135,"call"],
 $isEH:true},
-k9:{
-"^":"Xs:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,189,"call"],
+xA:{
+"^":"Xs:12;a",
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,135,"call"],
 $isEH:true},
-cP:{
-"^":"VE;BlM,nF,QA,YH,DP",
+QB:{
+"^":"VE;OH,nF,R3,SY,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.OD(a,null).Ti()
+y=T.OD(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
-if(!!z.$isDI)return new T.Xyb(this,y.gF5(),z.gkZ(y))
-else return new T.Ddj(this,y)}z.a=null
+if(!!z.$isDI)return new T.qb(this,y.gxG(),z.gkZ(y))
+else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
-if(x&&J.xC(b,"class"))z.a=T.PG()
-else if(x&&J.xC(b,"style"))z.a=T.Gu()
-return new T.H1B(z,this,y)},
-A5:function(a){var z=this.YH.t(0,a)
-if(z==null)return new T.uKo(this,a)
-return new T.r6k(this,a,z)},
-ZN:function(a){var z,y,x,w,v
+if(x&&J.xC(b,"class"))z.a=T.PG6()
+else if(x&&J.xC(b,"style"))z.a=T.Oq()
+return new T.Ddj(z,this,y)},
+CE:function(a){var z=this.SY.t(0,a)
+if(z==null)return new T.r6(this,a)
+return new T.uKo(this,a,z)},
+jX:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=z.gBy(a)
+y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.SB(a)
+if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
 z=J.RE(x)
-w=z.gmSA(x)
+w=z.gmb(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isGK)return v
-else return this.QA.t(0,a)}return this.ZN(y)},
-JY:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.jX(y)},
+fi:function(a,b){var z,y
 if(a==null)return K.kL(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.QA
+y=this.R3
 if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.r3(z.gBy(a),b)
+return y.t(0,a)}else if(z.gAd(a)!=null)return this.W5(z.gAd(a),b)
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.r3(a,b)}},
-r3:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.SB(a)
+return this.W5(a,b)}},
+W5:function(a,b){var z,y,x
+if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
 y=J.RE(z)
-if(y.gmSA(z)==null)y.gk8(z)
-return this.QA.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.QA.t(0,a)
-return x!=null?x:K.kL(b,this.nF)}else return this.r3(y.gBy(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+if(y.gmb(z)==null)y.gk8(z)
+return this.R3.t(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.R3.t(0,a)
+return x!=null?x:K.kL(b,this.nF)}else return this.W5(y.gAd(a),b)}},
+static:{"^":"rp3",Mo:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.cP(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).Ti()},"$1","u5",2,0,65],CM:[function(a,b,c,d){var z
+x.FV(0,C.mB)
+return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],QP:[function(a,b,c,d){var z
 if(c==null){c=P.L5(null,null,null,null,null)
-c.FV(0,C.va)}z=K.kL(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.CM(a,b,null,!1)},null,function(a,b,c){return T.CM(a,b,null,c)},null,function(a,b,c){return T.CM(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","Adk",4,5,66,23,67]}},
-Xyb:{
-"^":"Xs:190;b,c,d",
+c.FV(0,C.mB)}z=K.kL(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","V4",4,5,68,22,69]}},
+qb:{
+"^":"Xs:192;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.YH.u(0,b,this.c)
+z.SY.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.kL(a,z.nF)
-z.QA.u(0,b,y)
-return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+z.R3.u(0,b,y)
+return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-Ddj:{
-"^":"Xs:190;e,f",
+Xyb:{
+"^":"Xs:192;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.kL(a,z.nF)
-z.QA.u(0,b,y)
+z.R3.u(0,b,y)
 if(c===!0)return T.rD(this.f,y,null)
-return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-H1B:{
-"^":"Xs:190;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.JY(b,a)
+Ddj:{
+"^":"Xs:192;a,UI,bK",
+$3:[function(a,b,c){var z=this.UI.fi(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
-return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-uKo:{
-"^":"Xs:13;a,b",
+r6:{
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
-x=z.QA.t(0,y)
+x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.kL(a,z.nF)}else return z.JY(y,a)},"$1",null,2,0,null,178,"call"],
+return K.kL(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-r6k:{
-"^":"Xs:13;c,d,e",
+uKo:{
+"^":"Xs:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
-x=z.QA.t(0,y)
+x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.ZN(y).t1(w,a)},"$1",null,2,0,null,178,"call"],
+else return z.jX(y).t1(w,a)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;yr,wx,n4,Fg,JX,zr,HR",
-Gb:function(a){return this.wx.$1(a)},
-WV:function(a){return this.Fg.$1(a)},
-na:[function(a,b){var z,y
+"^":"Ap;Hk,mo,n4,Fg,JX,dD,HR",
+Ko:function(a){return this.mo.$1(a)},
+Gn:function(a){return this.Fg.$1(a)},
+ia:[function(a,b){var z,y
 z=this.HR
-y=this.wx==null?a:this.Gb(a)
+y=this.mo==null?a:this.Ko(a)
 this.HR=y
-if(b!==!0&&this.Fg!=null&&!J.xC(z,y)){this.WV(this.HR)
-return!0}return!1},function(a){return this.na(a,!1)},"ijz","$2$skipChanges","$1","gTx",2,3,191,67,58,192],
-gP:function(a){if(this.Fg!=null){this.QM(!0)
-return this.HR}return T.rD(this.n4,this.yr,this.wx)},
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y)){this.Gn(this.HR)
+return!0}return!1},function(a){return this.ia(a,!1)},"Eu0","$2$skipChanges","$1","gGX",2,3,193,69,60,194],
+gP:function(a){if(this.Fg!=null){this.Ix(!0)
+return this.HR}return T.rD(this.n4,this.Hk,this.mo)},
 sP:function(a,b){var z,y,x,w
-try{K.jXm(this.n4,b,this.yr,!1)}catch(x){w=H.Ru(x)
+try{K.jXm(this.n4,b,this.Hk,!1)}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(z),y)}},
 TR:function(a,b){var z,y
 if(this.Fg!=null)throw H.b(P.w("already open"))
 this.Fg=b
 z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 y=J.okV(this.n4,new K.Oy(z))
-this.zr=y
-z=y.gqM().yI(this.gTx())
-z.fm(0,new T.pI(this))
+this.dD=y
+z=y.gju().yI(this.gGX())
+z.fm(0,new T.yF(this))
 this.JX=z
-this.QM(!0)
+this.Ix(!0)
 return this.HR},
-QM:function(a){var z,y,x,w,v
-try{x=this.zr
-J.okV(x,new K.Edh(this.yr,a))
-x.gK3()
-x=this.na(this.zr.gK3(),a)
+Ix:function(a){var z,y,x,w,v
+try{x=this.dD
+J.okV(x,new K.Edh(this.Hk,a))
+x.gJb()
+x=this.ia(this.dD.gJb(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.zr)+"': "+H.d(z)
-if(x.Gv!==0)H.vh(P.w("Future already completed"))
-x.CG(v,y)
+v="Error evaluating expression '"+H.d(this.dD)+"': "+H.d(z)
+if(x.YM!==0)H.vh(P.w("Future already completed"))
+x.Nk(v,y)
 return!1}},
-bE:function(){return this.QM(!1)},
+bE:function(){return this.Ix(!1)},
 xO:function(a){var z,y
 if(this.Fg==null)return
-this.JX.ed()
+this.JX.Gv()
 this.JX=null
 this.Fg=null
-z=$.Cs()
-y=this.zr
+z=$.Pk()
+y=this.dD
 z.toString
 J.okV(y,z)
-this.zr=null},
+this.dD=null},
 fR:function(){if(this.Fg!=null)this.TC()},
 TC:function(){var z=0
 while(!0){if(!(z<1000&&this.bE()===!0))break;++z}return z>0},
@@ -15904,46 +16268,46 @@
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-pI:{
-"^":"Xs:80;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zr)+"': "+H.d(a),b)},"$2",null,4,0,null,1,156,"call"],
+yF:{
+"^":"Xs:81;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.dD)+"': "+H.d(a),b)},"$2",null,4,0,null,2,160,"call"],
 $isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
+hC:{
+"^":"a;"}}],["","",,B,{
 "^":"",
-De:{
-"^":"xhq;vq>,DA,AP,fn",
+LL:{
+"^":"xhq;vq>,Xq,Vg,fn",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{z4Z:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
+static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
 "^":"Xs;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.zdr,z.DA,a)},"$1",null,2,0,null,96,"call"],
+z.Xq=F.Wi(z,C.zdr,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
 "^":"",
 jXm:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
+for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$iselO){x=y.gP(a)
-w=C.OL
-v=!1}else if(!!y.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isrX){w=a.gTf()
+a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
+w=C.x4
+v=!1}else if(!!y.$isvn){w=a.gTf()
+x=a.gmU()
+v=!0}else{if(!!y.$isx9){w=a.gTf()
 x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
 J.okV(u,new K.GQ(c))
 if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
 if(t==null)return
 if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.Mg().H6.NU.t(0,x)
+else{y=$.Mg().JE.T4.t(0,x)
 $.cp().Cq(t,y,b)}return b},
 kL:function(a,b){var z,y,x
 z=new K.ug(a)
@@ -15951,85 +16315,85 @@
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
 x=new K.Ph(z,y)
-if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 y=x}return y},
 w11:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
 w12:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 w13:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w14:{
-"^":"Xs:80;",
-$2:function(a,b){return J.X9(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w15:{
-"^":"Xs:80;",
-$2:function(a,b){return J.hh(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
 w16:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w17:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w18:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w19:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w20:{
-"^":"Xs:80;",
-$2:function(a,b){return J.z8(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w21:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w22:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w23:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w24:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w25:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w26:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z=H.GO(P.a)
-z=H.KT(z,[z]).BD(b)
+z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
 throw H.b(K.zq("Filters must be a one-argument function."))},
 $isEH:true},
-w0:{
-"^":"Xs:13;",
+Raa:{
+"^":"Xs:12;",
 $1:function(a){return a},
 $isEH:true},
 w5:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return J.jzo(a)},
 $isEH:true},
 w10:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 GK:{
@@ -16044,414 +16408,414 @@
 "^":"GK;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.Mg().H6.NU.t(0,b)
+z=$.Mg().JE.T4.t(0,b)
 y=this.k8
 if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().Tv(y,z)
-return!!J.x(y).$iswS?B.z4Z(y,null):y},
-AC:function(a){return!J.xC(a,"this")},
-bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,71]},
+y=$.cp().Gp(y,z)
+return!!J.x(y).$iswS?B.Ha(y,null):y},
+tc:function(a){return!J.xC(a,"this")},
+bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Y1:{
-"^":"GK;eT>,Z0,P>",
+"^":"GK;eT>,hI,P>",
 gk8:function(a){var z=this.eT
 z=z.gk8(z)
 return z},
 t:function(a,b){var z
-if(J.xC(this.Z0,b)){z=this.P
-return!!J.x(z).$iswS?B.z4Z(z,null):z}return this.eT.t(0,b)},
-AC:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.AC(a)},
-bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,71]},
+if(J.xC(this.hI,b)){z=this.P
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+tc:function(a){if(J.xC(this.hI,a))return!1
+return this.eT.tc(a)},
+bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
 Ph:{
 "^":"GK;eT>,Z3<",
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
-if(z.x4(0,b)){z=z.t(0,b)
-return!!J.x(z).$iswS?B.z4Z(z,null):z}return this.eT.t(0,b)},
-AC:function(a){if(this.Z3.x4(0,a))return!1
+if(z.NZ(0,b)){z=z.t(0,b)
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;fT?,Gl<",
-gqM:function(){var z=this.k6
+"^":"a;VO?,Xl<",
+gju:function(){var z=this.vO
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gEV:function(){return this.KL},
-gK3:function(){return this.Gl},
-Qh:function(a){},
-ub:function(a){var z
-this.qf(0,a,!1)
-z=this.fT
-if(z!=null)z.ub(a)},
+gfL:function(){return this.KL},
+gJb:function(){return this.Xl},
+MN:function(a){},
+BZ:function(a){var z
+this.jK(0,a,!1)
+z=this.VO
+if(z!=null)z.BZ(a)},
 fs:function(){var z=this.tj
-if(z!=null){z.ed()
+if(z!=null){z.Gv()
 this.tj=null}},
-qf:function(a,b,c){var z,y,x
+jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.Gl
-this.Qh(b)
-if(!c){y=this.Gl
+z=this.Xl
+this.MN(b)
+if(!c){y=this.Xl
 y=y==null?z!=null:y!==z}else y=!1
-if(y){y=this.k6
-x=this.Gl
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(x)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,71],
+if(y){y=this.vO
+x=this.Xl
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(x)}},
+bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
 $isIp:true},
 Edh:{
-"^":"cfS;qu,n7",
-xn:function(a){a.qf(0,this.qu,this.n7)}},
+"^":"cfS;ms,xZ",
+xn:function(a){a.jK(0,this.ms,this.xZ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
-static:{"^":"ln"}},
+static:{"^":"jC"}},
 GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y,x
+"^":"P55;ms",
+W9:function(a){return J.ZH(this.ms)},
+Hs:function(a){return a.wz.RR(0,this)},
+Ci:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.Mg().H6.NU.t(0,y)
-return $.cp().Tv(z,x)},
+x=$.Mg().JE.T4.t(0,y)
+return $.cp().Gp(z,x)},
 CU:function(a){var z=J.okV(a.gTf(),this)
 if(z==null)return
-return J.UQ(z,J.okV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
+return J.UQ(z,J.okV(a.gmU(),this))},
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.eC(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.Mg().H6.NU.t(0,x)
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
+x=a.gnK(a)
+v=$.Mg().JE.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
 oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
+Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-z.u(0,J.okV(J.A6(x),this),J.okV(x.gv4(),this))}return z},
-EZ:function(a){return H.vh(P.f("should never be called"))},
-qs:function(a){return J.UQ(this.qu,a.gP(a))},
+for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
+YV:function(a){return H.vh(P.f("should never be called"))},
+qv:function(a){return J.UQ(this.ms,a.gP(a))},
 ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
+z=a.gxS(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.Rab().t(0,z)
+w=$.YP().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-xN:function(a){var z,y
+kb:function(a){var z,y
 z=J.okV(a.gwz(),this)
-y=$.fs().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
+y=$.fs().t(0,a.gxS(a))
+if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
 ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
 Vw:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
 W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
-LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
+Hs:function(a){return a.wz.RR(0,this)},
+Ci:function(a){var z,y
 z=J.okV(a.gTf(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(y)
+z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
-y=J.okV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+y=J.okV(a.gmU(),this)
+x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sVO(x)
+y.sVO(x)
 return x},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(v)
+z.sVO(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 oD:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.le(z,a,null,null,null,P.bK(null,null,!1,null))
+z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
+y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
-EZ:function(a){var z,y,x
-z=J.okV(a.gG3(a),this)
+YV:function(a){var z,y,x
+z=J.okV(a.gnl(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+z.sVO(x)
+y.sVO(x)
 return x},
-qs:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sVO(x)
+y.sVO(x)
 return x},
-xN:function(a){var z,y
+kb:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(y)
+z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
-y=J.okV(a.gSl(),this)
-x=J.okV(a.gru(),this)
+y=J.okV(a.gav(),this)
+x=J.okV(a.geE(),this)
 w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(w)
-y.sfT(w)
-x.sfT(w)
+z.sVO(w)
+y.sVO(w)
+x.sVO(w)
 return w},
 ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
 Vw:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 XV:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 Il:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=J.ZH(a)},
+"^":"Ay0;KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
 $asAy0:function(){return[U.EO]},
 $isEO:true,
 $isIp:true},
 x5:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-Qh:function(a){var z=this.KL
-this.Gl=z.gP(z)},
+MN:function(a){var z=this.KL
+this.Xl=z.gP(z)},
 RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.Dv]},
-$asDv:function(){return[null]},
-$isDv:true,
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
 $isIp:true},
 UF:{
-"^":"Ay0;hL<,KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;lm<,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
 $asAy0:function(){return[U.c0]},
 $isc0:true,
 $isIp:true},
 Hv:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGl()},"$1",null,2,0,null,96,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-le:{
-"^":"Ay0;Rl>,KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+ED:{
+"^":"Ay0;Rl>,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
-Ku:{
-"^":"Xs:80;",
-$2:function(a,b){J.kW(a,J.A6(b).gGl(),b.gv4().gGl())
+Kv:{
+"^":"Xs:81;",
+$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;G3>,v4<,KL,fT,tj,Gl,k6",
-RR:function(a,b){return b.EZ(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
+"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+RR:function(a,b){return b.YV(this)},
+$asAy0:function(){return[U.nu]},
+$isnu:true,
 $isIp:true},
 ek:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-Qh:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Gl=y.t(a,z.gP(z))
-if(!a.AC(z.gP(z)))return
+this.Xl=y.t(a,z.gP(z))
+if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.Mg().H6.NU.t(0,z)
-this.tj=y.gqh(x).yI(new K.V8(this,a,w))},
-RR:function(a,b){return b.qs(this)},
-$asAy0:function(){return[U.elO]},
-$iselO:true,
+w=$.Mg().JE.T4.t(0,z)
+this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+RR:function(a,b){return b.qv(this)},
+$asAy0:function(){return[U.fp]},
+$isfp:true,
 $isIp:true},
-V8:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+OC:{
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 GC:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,fT,tj,Gl,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y
+"^":"Ay0;wz<,KL,VO,tj,Xl,vO",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
+MN:function(a){var z,y
 z=this.KL
-y=$.fs().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gGl()
-this.Gl=y.$1(z==null?!1:z)}else{z=this.wz
-this.Gl=z.gGl()==null?null:y.$1(z.gGl())}},
-RR:function(a,b){return b.xN(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
+y=$.fs().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.wz.gXl()
+this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
+this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.kb(this)},
+$asAy0:function(){return[U.FH]},
+$isFH:true,
 $isIp:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,fT,tj,Gl,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y,x
+ky:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
+MN:function(a){var z,y,x
 z=this.KL
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gGl()
+y=$.YP().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
-x=this.T8.gGl()
-this.Gl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Gl=y.$2(this.Bb.gGl(),this.T8.gGl())
+x=this.T8.gXl()
+this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
 else{x=this.Bb
-if(x.gGl()==null||this.T8.gGl()==null)this.Gl=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gGl()).$iswn)this.tj=H.Go(x.gGl(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Gl=y.$2(x.gGl(),this.T8.gGl())}}},
+if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
+this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
 $isIp:true},
 P8:{
-"^":"Xs:13;a,b",
-$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
-"^":"Ay0;dc<,Sl<,ru<,KL,fT,tj,Gl,k6",
-Qh:function(a){var z=this.dc.gGl()
-this.Gl=(z==null?!1:z)===!0?this.Sl.gGl():this.ru.gGl()},
+"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
+MN:function(a){var z=this.dc.gXl()
+this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
 $isIp:true},
 vl:{
-"^":"Ay0;Tf<,KL,fT,tj,Gl,k6",
+"^":"Ay0;Tf<,KL,VO,tj,Xl,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-Qh:function(a){var z,y,x
-z=this.Tf.gGl()
-if(z==null){this.Gl=null
+MN:function(a){var z,y,x
+z=this.Tf.gXl()
+if(z==null){this.Xl=null
 return}y=this.KL
 y=y.goc(y)
-x=$.Mg().H6.NU.t(0,y)
-this.Gl=$.cp().Tv(z,x)
+x=$.Mg().JE.T4.t(0,y)
+this.Xl=$.cp().Gp(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
-RR:function(a,b){return b.T7(this)},
-$asAy0:function(){return[U.rX]},
-$isrX:true,
+RR:function(a,b){return b.Ci(this)},
+$asAy0:function(){return[U.x9]},
+$isx9:true,
 $isIp:true},
 Vw:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 WKb:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,KL,fT,tj,Gl,k6",
-Qh:function(a){var z,y,x
-z=this.Tf.gGl()
-if(z==null){this.Gl=null
-return}y=this.Jn.gGl()
+iTN:{
+"^":"Ay0;Tf<,mU<,KL,VO,tj,Xl,vO",
+MN:function(a){var z,y,x
+z=this.Tf.gXl()
+if(z==null){this.Xl=null
+return}y=this.mU.gXl()
 x=J.U6(z)
-this.Gl=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
+this.Xl=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
+$asAy0:function(){return[U.vn]},
+$isvn:true,
 $isIp:true},
 tE:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.Ku(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
-zw:{
-"^":"Xs:13;d",
-$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,85,"call"],
+Ku:{
+"^":"Xs:12;d",
+$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-jai:{
-"^":"Xs:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,185,"call"],
+z5:{
+"^":"Xs:12;e,f,UI",
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 ey:{
-"^":"Xs:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,85,"call"],
+"^":"Xs:12;bK",
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 c3:{
-"^":"Ay0;Tf<,re<,KL,fT,tj,Gl,k6",
-gSf:function(a){var z=this.KL
-return z.gSf(z)},
-Qh:function(a){var z,y,x,w
+"^":"Ay0;Tf<,re<,KL,VO,tj,Xl,vO",
+gnK:function(a){var z=this.KL
+return z.gnK(z)},
+MN:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gGl()
-if(x==null){this.Gl=null
+y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
+x=this.Tf.gXl()
+if(x==null){this.Xl=null
 return}z=this.KL
-if(z.gSf(z)==null){z=H.eC(x,y,P.Te(null))
-this.Gl=!!J.x(z).$iswS?B.z4Z(z,null):z}else{z=z.gSf(z)
-w=$.Mg().H6.NU.t(0,z)
-this.Gl=$.cp().Ck(x,w,y,!1,null)
+if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
+this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
+w=$.Mg().JE.T4.t(0,z)
+this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Xh(this,a,w))}},
+RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
 $isIp:true},
+vQ:{
+"^":"Xs:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
+$isEH:true},
 Xh:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGl()},"$1",null,2,0,null,46,"call"],
+"^":"Xs:195;a,b,c",
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
-BGc:{
-"^":"Xs:193;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
-$isEH:true},
-vk:{
-"^":"Xs:13;d",
+ho:{
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-B03:{
+XX:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
-static:{zq:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
+static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -16471,9 +16835,9 @@
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
 return 536870911&a+((16383&a)<<15>>>0)},
-Fs:{
+tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,194,1,46]},
+Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,196,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -16481,112 +16845,112 @@
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
 $isEO:true},
-Dv:{
+noG:{
 "^":"Ip;P>",
 RR:function(a,b){return b.oD(this)},
 bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isDv:true},
+$isnoG:true},
 c0:{
-"^":"Ip;hL<",
+"^":"Ip;lm<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,71],
+bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.pz(this.hL)},
+return!!J.x(b).$isc0&&U.Pu(b.glm(),this.lm)},
+giO:function(a){return U.pz(this.lm)},
 $isc0:true},
 Mm:{
 "^":"Ip;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,71],
+bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
 giO:function(a){return U.pz(this.Rl)},
 $isMm:true},
-ae:{
-"^":"Ip;G3>,v4<",
-RR:function(a,b){return b.EZ(this)},
-bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
+nu:{
+"^":"Ip;nl>,v4<",
+RR:function(a,b){return b.YV(this)},
+bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
+return!!z.$isnu&&J.xC(z.gnl(b),this.nl)&&J.xC(b.gv4(),this.v4)},
 giO:function(a){var z,y
-z=J.v1(this.G3.P)
+z=J.v1(this.nl.P)
 y=J.v1(this.v4)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
+$isnu:true},
 XC:{
 "^":"Ip;wz",
-RR:function(a,b){return b.LT(this)},
-bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,71],
+RR:function(a,b){return b.Hs(this)},
+bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
-elO:{
+fp:{
 "^":"Ip;P>",
-RR:function(a,b){return b.qs(this)},
-bu:[function(a){return this.P},"$0","gAY",0,0,71],
+RR:function(a,b){return b.qv(this)},
+bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iselO&&J.xC(z.gP(b),this.P)},
+return!!z.$isfp&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$iselO:true},
-cJ:{
-"^":"Ip;kp>,wz<",
-RR:function(a,b){return b.xN(this)},
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,71],
+$isfp:true},
+FH:{
+"^":"Ip;xS>,wz<",
+RR:function(a,b){return b.kb(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.wz)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gwz(),this.wz)},
 giO:function(a){var z,y
-z=J.v1(this.kp)
+z=J.v1(this.xS)
 y=J.v1(this.wz)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
+$isFH:true},
 uku:{
-"^":"Ip;kp>,Bb>,T8>",
+"^":"Ip;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isuku&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y,x
-z=J.v1(this.kp)
+z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-mc:{
-"^":"Ip;dc<,Sl<,ru<",
+Dc:{
+"^":"Ip;dc<,av<,eE<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
-y=J.v1(this.Sl)
-x=J.v1(this.ru)
+y=J.v1(this.av)
+x=J.v1(this.eE)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
+$isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
-gF5:function(){var z=this.Bb
+gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
 giO:function(a){var z,y
@@ -16599,10 +16963,10 @@
 px:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.Vw(this)},
-gF5:function(){var z=this.T8
+gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
-bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
@@ -16612,258 +16976,258 @@
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
 $isDI:true},
-zX:{
-"^":"Ip;Tf<,Jn<",
+vn:{
+"^":"Ip;Tf<,mU<",
 RR:function(a,b){return b.CU(this)},
-bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,71],
+bu:[function(a){return H.d(this.Tf)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
+return!!J.x(b).$isvn&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gmU(),this.mU)},
 giO:function(a){var z,y
 z=J.v1(this.Tf)
-y=J.v1(this.Jn)
+y=J.v1(this.mU)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-rX:{
+$isvn:true},
+x9:{
 "^":"Ip;Tf<,oc>",
-RR:function(a,b){return b.T7(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
+RR:function(a,b){return b.Ci(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isrX&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.Tf)
 y=J.v1(this.oc)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isrX:true},
+$isx9:true},
 RWc:{
-"^":"Ip;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,71],
+"^":"Ip;Tf<,nK>,re<",
+RR:function(a,b){return b.Y7(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isRWc&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isRWc&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gnK(b),this.nK)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.Tf)
-y=J.v1(this.Sf)
+y=J.v1(this.nK)
 x=U.pz(this.re)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
-KR:{
-"^":"a;rR,Yf,jQ,R3",
-gQi:function(){return this.R3.lo},
-Ti:function(){var z=this.Yf.zl()
-this.jQ=z
-this.R3=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
-this.Bp()
-return this.Te()},
-lx:function(a,b){var z
-if(a!=null){z=this.R3.lo
+FX:{
+"^":"a;Wi,f7,JR,V6",
+gVd:function(){return this.V6.Ff},
+oK:function(){var z=this.f7.zl()
+this.JR=z
+this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
+this.jz()
+return this.VK()},
+Jn:function(a,b){var z
+if(a!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.R3.lo
+if(!z)if(b!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
-if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.R3.G()},
-Bp:function(){return this.lx(null,null)},
-Ha:function(a){return this.lx(a,null)},
-Te:function(){if(this.R3.lo==null){this.rR.toString
-return C.OL}var z=this.ia()
-return z==null?null:this.mi(z,0)},
-mi:function(a,b){var z,y,x,w,v,u
-for(;z=this.R3.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.R3.lo),"(")){y=this.rD()
-this.rR.toString
-a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.R3.lo),"[")){x=this.IM()
-this.rR.toString
-a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.R3.lo),3)){this.Bp()
-a=this.F0(a,this.ia())}else if(J.xC(J.Iz(this.R3.lo),10))if(J.xC(J.Vm(this.R3.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rR.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.R3.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$iselO)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rR.toString
+if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gVd())))
+this.V6.G()},
+jz:function(){return this.Jn(null,null)},
+IH:function(a){return this.Jn(a,null)},
+VK:function(){if(this.V6.Ff==null){this.Wi.toString
+return C.x4}var z=this.ZR()
+return z==null?null:this.Ay(z,0)},
+Ay:function(a,b){var z,y,x,w,v,u
+for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
+this.Wi.toString
+a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.FD()
+this.Wi.toString
+a=new U.vn(a,x)}else break
+else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+this.jz()
+w=this.VK()
+this.Wi.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
+w=this.VK()
+if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.Wi.toString
 a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.R3.lo),8)){z=this.R3.lo.gnS()
+else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.R3.lo),"?")){this.lx(8,"?")
-v=this.Te()
-this.Ha(5)
-u=this.Te()
-this.rR.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
+if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
+v=this.VK()
+this.IH(5)
+u=this.VK()
+this.Wi.toString
+a=new U.Dc(a,v,u)}else a=this.Ax(a)
 else break}return a},
-F0:function(a,b){var z,y
+JuP:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$iselO){z=z.gP(b)
-this.rR.toString
-return new U.rX(a,z)}else if(!!z.$isRWc&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
+if(!!z.$isfp){z=z.gP(b)
+this.Wi.toString
+return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
 y=b.gre()
-this.rR.toString
+this.Wi.toString
 return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.R3.lo
+Ax:function(a){var z,y,x,w,v
+z=this.V6.Ff
 y=J.RE(z)
-if(!C.Nm.Gs(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.ia()
-while(!0){w=this.R3.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.R3.lo),3)||J.xC(J.Iz(this.R3.lo),9)){w=this.R3.lo.gnS()
-v=z.gnS()
+if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
+this.jz()
+x=this.ZR()
+while(!0){w=this.V6.Ff
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
+v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
 v=w>v
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.mi(x,this.R3.lo.gnS())}y=y.gP(z)
-this.rR.toString
+x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
+this.Wi.toString
 return new U.uku(y,a,x)},
-ia:function(){var z,y,x,w
-if(J.xC(J.Iz(this.R3.lo),8)){z=J.Vm(this.R3.lo)
+ZR:function(){var z,y,x,w
+if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
 y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.R3.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.R3.lo)),null,null)
-this.rR.toString
-z=new U.Dv(y)
+if(y.n(z,"+")||y.n(z,"-")){this.jz()
+if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rR
-if(J.xC(J.Iz(this.R3.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.R3.lo)),null)
+this.jz()
+return z}else{y=this.Wi
+if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
 y.toString
-z=new U.Dv(x)
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.mi(this.fq(),11)
+this.jz()
+return z}else{w=this.Ay(this.LE(),11)
 y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.mi(this.fq(),11)
-this.rR.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.fq()},
-fq:function(){var z,y
-switch(J.Iz(this.R3.lo)){case 10:z=J.Vm(this.R3.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rR.toString
-return new U.elO("this")}else if(C.Nm.Gs(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
+w=this.Ay(this.LE(),11)
+this.Wi.toString
+return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+LE:function(){var z,y
+switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
+if(J.xC(z,"this")){this.jz()
+this.Wi.toString
+return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
-case 1:return this.ef()
-case 6:return this.PP()
-case 7:return this.xJ()
-case 9:if(J.xC(J.Vm(this.R3.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rR.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.R3.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.R3.lo),"["))return this.S9()
+case 2:return this.xh()
+case 1:return this.Dy()
+case 6:return this.Dp()
+case 7:return this.eD()
+case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
+y=this.VK()
+this.Jn(9,")")
+this.Wi.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
+else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
-S9:function(){var z,y
+U3:function(){var z,y
 z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"]"))break
-z.push(this.Te())
-y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
+z.push(this.VK())
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+this.Jn(9,"]")
 return new U.c0(z)},
-pH:function(){var z,y,x
+hR:function(){var z,y,x
 z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"}"))break
-y=J.Vm(this.R3.lo)
-this.rR.toString
-x=new U.Dv(y)
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
+y=J.Vm(this.V6.Ff)
+this.Wi.toString
+x=new U.noG(y)
 x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
+this.jz()
+this.Jn(5,":")
+z.push(new U.nu(x,this.VK()))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+this.Jn(9,"}")
 return new U.Mm(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.R3.lo),"true")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.R3.lo),"false")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.R3.lo),"null")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.R3.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.R3.lo)
-this.Bp()
-this.rR.toString
-y=new U.elO(z)
-x=this.rD()
+xh:function(){var z,y,x
+if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.Ff)
+this.jz()
+this.Wi.toString
+y=new U.fp(z)
+x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
-rD:function(){var z,y
-z=this.R3.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"(")){y=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),")"))break
-y.push(this.Te())
-z=this.R3.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
+Hr:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
+y.push(this.VK())
+z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
+this.Jn(9,")")
 return y}return},
-IM:function(){var z,y
-z=this.R3.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"[")){this.Bp()
-y=this.Te()
-this.lx(9,"]")
+FD:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
+y=this.VK()
+this.Jn(9,"]")
 return y}return},
-ef:function(){var z,y
-z=J.Vm(this.R3.lo)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Dy:function(){var z,y
+z=J.Vm(this.V6.Ff)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-Nt:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.R3.lo)),null,null)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Rb:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-PP:function(){return this.Nt("")},
-cp:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.R3.lo)),null)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Dp:function(){return this.Rb("")},
+FM:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-xJ:function(){return this.cp("")},
+eD:function(){return this.FM("")},
 static:{OD:function(a,b){var z,y,x
 z=H.VM([],[Y.qS])
 y=P.p9("")
-x=new U.Fs()
-return new T.KR(x,new Y.xv(z,y,new P.WU(a,0,0,null),null),null,null)}}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+x=new U.tu()
+return new T.FX(x,new Y.xv(z,y,new P.Xa(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,68,69],
+eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","FLA",2,0,70,71],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
 $isAep:true},
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
+"^":"mW;K9",
+gA:function(a){var z=new K.vR(J.mY(this.K9),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
+gB:function(a){return J.q8(this.K9)},
+gl0:function(a){return J.FN(this.K9)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.K9
 y=J.U6(z)
 z=new K.Aep(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -16871,13 +17235,13 @@
 $asmW:function(a){return[[K.Aep,a]]},
 $asQV:function(a){return[[K.Aep,a]]}},
 vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
+"^":"Anv;GZ,ir,WV",
+gl:function(){return this.WV},
+G:function(){var z=this.GZ
+if(z.G()){this.WV=H.VM(new K.Aep(this.ir++,z.gl()),[null])
+return!0}this.WV=null
 return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16886,59 +17250,59 @@
 case 118:return 11
 default:return a}},
 qS:{
-"^":"a;fY>,P>,nS<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
+"^":"a;fY>,P>,G8<",
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
 $isqS:true},
 xv:{
-"^":"a;dE,zy,jI,x0",
+"^":"a;dE,Lz,Te,x0",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
+z=this.Te
+this.x0=z.G()?z.ft:null
+for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.ft:null
+else if(x===34||x===39)this.DS()
 else{if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
 else w=!0
-if(w)this.zI()
+if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.Wn:null
+else if(x===46){x=z.G()?z.ft:null
 this.x0=x
 if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.qv()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.Gs(C.bg,x)){v=this.x0
-x=z.G()?z.Wn:null
+if(48<=x&&x<=57)this.e1()
+else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.ft:null
+y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.ft:null
+y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.mk,x)){v=this.x0
+x=z.G()?z.ft:null
 this.x0=x
-if(C.Nm.Gs(C.bg,x)){x=this.x0
-u=H.LY([v,x])
-if(C.Nm.Gs(C.Fn,u)){x=z.G()?z.Wn:null
+if(C.Nm.tg(C.mk,x)){x=this.x0
+u=H.eT([v,x])
+if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
 this.x0=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.LyD.t(0,t)))}else if(C.Nm.Gs(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.LyD.t(0,s)))
-this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
-WG:function(){var z,y,x,w
+this.x0=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.qS(8,t,C.iM.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
+y.push(new Y.qS(9,s,C.iM.t(0,s)))
+this.x0=z.G()?z.ft:null}else this.x0=z.G()?z.ft:null}return y},
+DS:function(){var z,y,x,w
 z=this.x0
-y=this.jI
-x=y.G()?y.Wn:null
+y=this.Te
+x=y.G()?y.ft:null
 this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
+for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+if(x===92){x=y.G()?y.ft:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
 x=H.mx(Y.wX(x))
-w.vM+=x}else{x=H.mx(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.dE.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
+w.IN+=x}else{x=H.mx(x)
+w.IN+=x}x=y.G()?y.ft:null
+this.x0=x}this.dE.push(new Y.qS(1,w.IN,0))
+w.IN=""
+this.x0=y.G()?y.ft:null},
+y3:function(){var z,y,x,w,v
+z=this.Te
+y=this.Lz
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16946,93 +17310,93 @@
 else w=!0}else w=!1
 if(!w)break
 x=H.mx(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
+y.IN+=x
+this.x0=z.G()?z.ft:null}v=y.IN
 z=this.dE
-if(C.Nm.Gs(C.oP,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
 else z.push(new Y.qS(2,v,0))
-y.vM=""},
+y.IN=""},
 jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
+z=this.Te
+y=this.Lz
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
+y.IN+=x
+this.x0=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
 this.x0=z
 if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.qv()
-else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-qv:function(){var z,y,x,w
-z=this.zy
+if(48<=z&&z<=57)this.e1()
+else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.IN,0))
+y.IN=""}},
+e1:function(){var z,y,x,w
+z=this.Lz
 z.KF(H.mx(46))
-y=this.jI
+y=this.Te
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.dE.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
+z.IN+=x
+this.x0=y.G()?y.ft:null}this.dE.push(new Y.qS(7,z.IN,0))
+z.IN=""}},
 hAN:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gay",2,0,195,156]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,197,160]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
+Hs:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.okV(a.gTf(),this)
+Ci:function(a){J.okV(a.gTf(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.gTf(),this)
-J.okV(a.gJn(),this)
+J.okV(a.gmU(),this)
 this.xn(a)},
-ZR:function(a){var z
+Y7:function(a){var z
 J.okV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 oD:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
-EZ:function(a){J.okV(a.gG3(a),this)
+YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
 this.xn(a)},
-qs:function(a){this.xn(a)},
+qv:function(a){this.xn(a)},
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-xN:function(a){J.okV(a.gwz(),this)
+kb:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
-J.okV(a.gSl(),this)
-J.okV(a.gru(),this)
+J.okV(a.gav(),this)
+J.okV(a.geE(),this)
 this.xn(a)},
 ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
 Vw:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V45;oX,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V47;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gtu:function(a){return a.Ny},
+stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
 gGV:function(a){return a.fI},
@@ -17051,47 +17415,47 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,15,196],
-SQ:function(a){var z,y
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+W7:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-ib:[function(a,b,c){this.SQ(a)},"$2","gFG",4,0,197,198,199],
+qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,198,199,200],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.gFG(a))
-a.nu=y
+if(z!=null){y=W.Ws(this.giH(a))
+a.Nf=y
 C.S2.OT(y,z,!0)}},
-dQ:function(a){var z=a.nu
+Lx:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)
-this.SQ(a)},"$1","goL",2,0,20,57],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,20,57],
-nb:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
-ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,20,57],
-mC:function(a){var z,y,x
+a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+Ecy:[function(a,b){this.Um(a)
+this.W7(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
+ib:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
+Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
+Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
-if(a.Oq!=null)return
-z=a.oX
+if(a.D6!=null)return
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
 z=a.cI
-y=a.oX
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
 J.Z8(a.Kf)
-for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.oX),x))
+for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
-static:{T5i:function(a){var z,y,x,w,v
+static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -17101,92 +17465,92 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.za.ZL(a)
+a.n9=w
+a.wy=v
+C.za.LX(a)
 C.za.XI(a)
 return a}}},
-V45:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
+if(J.iS(z.Ny)===!0){z.D6=null
+J.XP(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V46;X9,xt,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V48;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
-gv8:function(a){return a.xt},
-sv8:function(a,b){a.xt=this.ct(a,C.S4,a.xt,b)},
-vW:[function(a,b,c,d){var z,y
-z=a.xt
+gO9:function(a){return a.pL},
+sO9:function(a,b){a.pL=this.ct(a,C.S4,a.pL,b)},
+SC:[function(a,b,c,d){var z,y
+z=a.pL
 if(z===!0)return
-a.xt=this.ct(a,C.S4,z,!0)
+a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.aT(J.zH(y)).G5(J.zH(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.aT(J.zH(y)).h4(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,46,47,85],
-static:{xA:function(a){var z,y,x,w
+if(z==null)J.aT(J.KL(y)).G5(J.KL(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.KL(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.xt=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.pL=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.QLX.ZL(a)
-C.QLX.XI(a)
+a.n9=x
+a.wy=w
+C.FC.LX(a)
+C.FC.XI(a)
 return a}}},
-V46:{
+V48:{
 "^":"uL+Pi;",
 $isd3:true},
 eE:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,14,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:[function(a){var z=this.b
-z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"qeq;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
-gJp:function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gTX()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-r6:[function(a,b){var z=a.tY
+gXt:function(a){var z=a.tY
+if(z==null)return Q.xI.prototype.gXt.call(this,a)
+return z.gTE()},
+fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
+at:[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,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
 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)},
+else J.SK(y).ml(this.gRy(a))}return Q.xI.prototype.goc.call(this,a)},
 gO3:function(a){if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0))if(J.iS(a.tY)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.jJ)
-else J.SK(a.tY).ml(this.gvo(a))
+else J.SK(a.tY).ml(this.gRy(a))
 return Q.xI.prototype.gO3.call(this,a)},
-static:{Thl:function(a){var z,y,x,w
+static:{TQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -17194,52 +17558,52 @@
 w=P.Fl(null,null)
 a.jJ=-1
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Wa.ZL(a)
-C.Wa.XI(a)
+a.n9=x
+a.wy=w
+C.c07.LX(a)
+C.c07.XI(a)
 return a}}},
-oEY:{
+qeq:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V47;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
+"^":"V49;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gtu:function(a){return a.Uz},
+stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.Uz).YM(b)},"$1","gWp",2,0,20,101],
-static:{dI:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{TXt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.cJ0.ZL(a)
+a.n9=x
+a.wy=w
+C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V47:{
+V49:{
 "^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -17247,32 +17611,27 @@
 if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
 y=J.UQ(b,"type")
 z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
+switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.vO
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=D.dy
+z=D.Kp
 w=[]
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.vO
+z=D.dy
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[z]
-z=D.Kp
+z=D.dy
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+t=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,w,null,v,u,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.Fc]
@@ -17285,13 +17644,13 @@
 v.$builtinTypeInfo=[w]
 w=P.KN
 u=D.Db
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new V.qC(P.YM(null,null,null,w,u),null,null)
+s.$builtinTypeInfo=[w,u]
+t=new D.kx(null,0,0,0,0,0,z,x,v,s,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Error":t=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Function":s=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Function":t=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=J.I2(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
@@ -17301,19 +17660,19 @@
 v.$builtinTypeInfo=[P.qU]
 u=[]
 u.$builtinTypeInfo=[D.ER]
-t=D.dy
+s=D.dy
 r=[]
-r.$builtinTypeInfo=[t]
+r.$builtinTypeInfo=[s]
 r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[t]
-t=D.U4
+r.$builtinTypeInfo=[s]
+s=D.U4
 q=[]
-q.$builtinTypeInfo=[t]
+q.$builtinTypeInfo=[s]
 q=new Q.wn(null,null,q,null,null)
-q.$builtinTypeInfo=[t]
-t=P.L5(null,null,null,P.qU,P.Vf)
-t=R.tB(t)
-s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
+q.$builtinTypeInfo=[s]
+s=P.L5(null,null,null,P.qU,P.Vf)
+s=R.tB(s)
+t=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,s,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -17336,32 +17695,32 @@
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
 z=D.Kp
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+s=[]
+s.$builtinTypeInfo=[z]
+s=new Q.wn(null,null,s,null,null)
+s.$builtinTypeInfo=[z]
+t=new D.U4(null,x,w,v,u,s,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceError":t=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceEvent":s=new D.Mk(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceEvent":t=new D.Mk(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceException":t=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Script":z=D.c2
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
+t=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Socket":t=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
-return s},
-UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.mQ,"Null"))return
+t=new D.vO(z,a,null,null,!1,null,null,null,null,null)}t.eC(b)
+return t},
+UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.Fz,"Null"))return
 return a},
 bF:function(a){var z
 if(a!=null){z=J.U6(a)
@@ -17373,7 +17732,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+for(z=a.XH,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -17383,67 +17742,67 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.P3},
-gwv:function(a){return J.I2(this.P3)},
-god:function(a){return J.aT(this.P3)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.P3.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
+gXP:function(){return this.x8},
+gwv:function(a){return J.I2(this.x8)},
+god:function(a){return J.aT(this.x8)},
+gjO:function(a){return this.TU},
+gzS:function(){return this.Fz},
+gPj:function(a){return this.x8.YC(this.TU)},
+gox:function(a){return this.qu},
+gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gTX:function(){return this.gGR()},
-sTX:function(a){this.sGR(this.ct(this,C.Tc,this.gGR(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gM8())return P.Ab(this,null)
-z=this.v7
-if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.Bf(this)).YM(new D.n1(this))
-this.v7=z}return z},
+gTE:function(){return this.gGR()},
+sTE:function(a){this.sGR(this.ct(this,C.Tc,this.gGR(),a))},
+xW:function(a){if(this.qu)return P.Ab(this,null)
+return this.VD(0)},
+VD:function(a){var z
+if(J.xC(this.TU,""))return P.Ab(this,null)
+if(this.qu&&this.gM8())return P.Ab(this,null)
+z=this.mQ
+if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.Bf(this)).wM(new D.n1(this))
+this.mQ=z}return z},
 eC:function(a){var z,y,x,w
 z=J.U6(a)
 y=J.co(z.t(a,"type"),"@")
 x=z.t(a,"type")
 w=J.rY(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,165,200],
+w=this.TU
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
+this.Fz=x
+this.R5(0,a,y)},
+YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,169,201],
 $isaf:true},
 Bf:{
-"^":"Xs:202;a",
+"^":"Xs:203;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
+if(!J.xC(z,y.Fz))return D.Nl(y.x8,a)
 y.eC(a)
-return y},"$1",null,2,0,null,201,"call"],
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 n1:{
-"^":"Xs:74;b",
-$0:[function(){this.b.v7=null},"$0",null,0,0,null,"call"],
+"^":"Xs:76;b",
+$0:[function(){this.b.mQ=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5())},
-lh:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gWp",0,0,203]},
+O5:function(a){J.Me(a,new D.P5(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,204]},
 P5:{
-"^":"Xs:13;",
+"^":"Xs:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,204,"call"],
+z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,205,"call"],
 $isEH:true},
 Rv:{
-"^":"Xs:202;a",
+"^":"Xs:203;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,201,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -17451,73 +17810,74 @@
 "^":"O1w;Li<,G2<,Rk>",
 gwv:function(a){return this},
 god:function(a){return},
-giR:function(){var z=this.z7
+gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gua",2,0,165,200],
+gPj:function(a){return H.d(this.TU)},
+YC:[function(a){return H.d(a)},"$1","gua",2,0,169,201],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gcD:function(){return this.kU},
+gdW:function(){return this.Va},
+gU6:function(){return this.kU},
 gPE:function(){return this.l7},
-EM:function(a){var z,y,x,w,v
+hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
-try{y=this.ng(a)
+try{y=this.hb(a)
 z.a=y
-x=y}catch(w){H.Ru(w)
+if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
 N.QM("").YX("Ignoring malformed event message: "+H.d(a))
-return}if(!J.xC(J.UQ(x,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
-return}v=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.B7(v).ml(new D.jy(z,this,v))},
-jq:function(a){var z,y,x,w
+return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
+return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
+this.wD(w).ml(new D.jy(z,this,w))},
+EM:function(a){return this.hQ(a,null)},
+BC:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
-y=z.QK
+y=z.pX
 x=y.input
 w=y.index
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
-jz:function(a){var z,y,x
+ZS:function(a){var z,y,x
 z=$.fA().R4(0,a)
 if(z==null)return""
-y=z.QK
+y=z.pX
 x=y.index
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.nO(null))},
-B7:function(a){var z
+wD:function(a){var z
 if(J.xC(a,""))return P.Ab(null,null)
-z=this.z7.t(0,a)
+z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
+return this.VD(0).ml(new D.MZ(this,a))},
 cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.jz(a)
-y=this.jq(a)
-return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
-if(x!=null)return J.cI(x)
-return this.jU(a).ml(new D.aEE(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,80],
-ng:function(a){var z,y,x
+if(J.co(a,"isolates/")){z=this.ZS(a)
+y=this.BC(a)
+return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
+if(x!=null)return J.LE(x)
+return this.jU(a).ml(new D.oew(this,a))},
+B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gcO())
+try{y=new P.c5(this.gJ2())
 z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
 return}return R.tB(z)},
-N7:function(a){var z
+OJ:function(a){var z
 if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
 return P.Vu(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
 if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.Nl(this,a),null,null)
 else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
-bF:function(a,b,c){var z,y
+jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.bp(this),new D.hc())},
+R5:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -17533,9 +17893,9 @@
 this.kU=F.Wi(this,C.uI,this.kU,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
+this.y8(z.t(b,"isolates"))},
+y8:function(a){var z,y,x,w,v,u
+z=this.Qi
 y=P.L5(null,null,null,P.qU,D.bv)
 for(x=J.mY(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
@@ -17543,11 +17903,11 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
-this.z7=y},
+N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
+this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.Tc,this.GR,"vm")
-this.Qy.u(0,"vm",this)
+this.uj.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.tB(z))},
 $iswv:true},
@@ -17555,91 +17915,91 @@
 "^":"xm+Pi;",
 $isd3:true},
 jy:{
-"^":"Xs:13;a,b,c",
+"^":"Xs:12;a,b,c",
 $1:[function(a){var z,y
 if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
 else{z=D.Nl(a,this.a.a)
 y=this.b.Rk
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)}},"$1",null,2,0,null,205,"call"],
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(z)}},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 MZ:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,143,"call"],
+return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-it:{
-"^":"Xs:13;a,b",
+aEE:{
+"^":"Xs:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
 z=this.b
-if(z==null)return J.cI(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+if(z==null)return J.LE(a)
+else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-aEE:{
-"^":"Xs:202;c,d",
+oew:{
+"^":"Xs:203;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
-if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,201,"call"],
+if(y.gjm())z.uj.to(0,this.d,new D.QZ(y))
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 QZ:{
-"^":"Xs:74;e",
+"^":"Xs:76;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
-y=z.ng(a)
+y=z.hb(a)
 x=$.ax
-if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
-return z.N7(y)},"$1",null,2,0,null,146,"call"],
+if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
+return z.OJ(y)},"$1",null,2,0,null,150,"call"],
 $isEH:true},
 tm:{
-"^":"Xs:13;c",
+"^":"Xs:12;c",
 $1:[function(a){var z=this.c.G2
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Vu(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
-"^":"Xs:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 bp:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){var z=this.d.Li
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,89,"call"],
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 hc:{
-"^":"Xs:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Yu:{
-"^":"Xs:80;",
-$2:function(a,b){J.cI(b)},
+"^":"Xs:81;",
+$2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
-"^":"a;SP,XE>,OQ",
+"^":"a;SP,XE>,jf",
 eK:function(a){var z,y,x,w,v
 z=this.XE
-H.na(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.OQ
+H.h8(z,0,a)
+for(y=z.length,x=0;x<y;++x){w=this.jf
 v=z[x]
 if(typeof v!=="number")return H.s(v)
-this.OQ=w+v}},
-y8:function(a,b){var z,y,x,w,v,u,t
+this.jf=w+v}},
+pg:function(a,b){var z,y,x,w,v,u,t
 for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.Hn(u,b[v])
 z[v]=u
-t=this.OQ
+t=this.jf
 if(typeof u!=="number")return H.s(u)
-this.OQ=t+u}},
+this.jf=t+u}},
 k5:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
@@ -17650,58 +18010,60 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+y[w]=J.xZ(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,Hx,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=a
+"^":"a;af<,Fw<,u1,Ob,Eq,kL",
+gvh:function(){return this.u1},
+Qv:function(a,b){var z,y,x,w,v,u
+this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
-this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
+this.kL=J.q8(z.t(b,"counters"))
+for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
+if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
+x.push(u)}z=this.kL
+if(typeof z!=="number")return H.s(z)
+z=Array(z)
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.Hx=z
+this.Ob=z
 z.eK(y)
-return}z=this.QS
+return}z=this.kL
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.Hx.XE)
-this.Hx.k5(0,y)
-z=this.lI
+u.pg(y,this.Ob.XE)
+this.Ob.k5(0,y)
+z=this.Fw
 z.push(u)
-if(z.length>this.hD)C.Nm.W4(z,0)}},
+if(z.length>this.Eq)C.Nm.W4(z,0)}},
 eK:{
-"^":"Pi;mV,ob,pX,yp,Og,hu,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
+"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
+gSU:function(){return this.zd},
+gkV:function(){return this.ob},
+gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
 gqZ:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
+this.zd=F.Wi(this,C.LP,this.zd,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
+this.j8=F.Wi(this,C.h7,this.j8,y)
 y=z.t(a,"collections")
 this.yp=F.Wi(this,C.J6,this.yp,y)
 y=z.t(a,"time")
@@ -17709,71 +18071,71 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,ip,yv,BC<,FF,bj,iD<,QR,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gwv:function(a){return this.P3},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gwv:function(a){return this.x8},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
+gPj:function(a){return"/"+H.d(this.TU)},
 gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
+gGL:function(){return this.EY},
 gaj:function(){return this.eU},
-gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,165,200],
+gn0:function(){return this.yP},
+YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,169,201],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.hr(a,z)
+this.I1()
+this.nN(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.aU(w,z)},
-c2:function(){var z=this.Qy
+if(w!=null)this.qo=this.Jm(w,z)},
+I1:function(){var z=this.uj
 z.gUQ(z).aN(0,new D.iz())},
-hr:function(a,b){var z,y,x,w
+nN:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").Il(w,b,x)}},
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gMh())},
-ND:[function(a){var z,y,x,w
+WR:function(){return this.cv("classes").ml(this.gLG()).ml(this.gHB())},
+d8:[function(a){var z,y,x,w
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,206,207],
-Nz:[function(a){var z,y,x,w
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,207,208],
+lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
 this.Wm=F.Wi(this,C.jo,this.Wm,null)
 for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
+if(x.gAY()==null)z.h(0,x)
+if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,208,209],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,209,210],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
-y=this.Qy
+y=this.uj
 x=y.t(0,z)
 if(x!=null)return x
 x=D.Nl(this,a)
-if(x!=null&&x.gUm())y.u(0,z,x)
+if(x!=null&&x.gjm())y.u(0,z,x)
 return x},
-cv:function(a){var z=this.Qy.t(0,a)
-if(z!=null)return J.cI(z)
-return this.P3.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gmq:function(){return this.Wm},
+cv:function(a){var z=this.uj.t(0,a)
+if(z!=null)return J.LE(z)
+return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.Wm},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
 gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gTX:function(){return this.f5},
-sTX:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
+gTE:function(){return this.f5},
+sTE:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
+gIT:function(){return this.i9},
 gw2:function(){return this.cL},
 sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gkc:function(a){return this.yv},
@@ -17781,7 +18143,7 @@
 Bs:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o
+R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.i9=F.Wi(this,C.wT,this.i9,y)
@@ -17790,7 +18152,7 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.Tc,this.f5,y)
 if(c)return
-this.kT=!0
+this.qu=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 x=z.t(b,"pauseEvent")
@@ -17827,7 +18189,7 @@
 while(!0){q=r.gB(v)
 if(typeof q!=="number")return H.s(q)
 if(!(s<q))break
-J.kW(this.V3,r.t(v,s),C.CD.Sy(J.X9(y.t(u,s),t)*100,2)+"%");++s}}}p=P.Fl(null,null)
+J.kW(this.V3,r.t(v,s),C.CD.Sy(J.L9(y.t(u,s),t)*100,2)+"%");++s}}}p=P.Fl(null,null)
 J.Me(z.t(b,"timers"),new D.Qq(p))
 y=this.Y8
 r=J.w1(y)
@@ -17854,42 +18216,42 @@
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
-m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-aU:function(a,b){this.FF=0
-this.bj=a
+xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.n5=0
+this.l9=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.tw(b)},
-tw:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
+return this.ci(b)},
+ci:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.l9
+y=this.n5
 if(typeof y!=="number")return y.g()
-this.FF=y+1
+this.n5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.bj
-z=this.FF
+y=this.l9
+z=this.n5
 if(typeof z!=="number")return z.g()
-this.FF=z+1
+this.n5=z+1
 v=J.UQ(y,z)
 z=[]
 z.$builtinTypeInfo=[D.D5]
 u=new D.D5(w,v,z,0)
-y=this.bj
-t=this.FF
+y=this.l9
+t=this.n5
 if(typeof t!=="number")return t.g()
-this.FF=t+1
+this.n5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.tw(a)
+for(;r<s;++r){q=this.ci(a)
 z.push(q)
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
 u.Jv=y+t}return u},
-pU:function(a){var z,y,x,w,v,u
+Eb:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=J.UQ(z.t(a,"location"),"script")
 x=J.UQ(z.t(a,"location"),"tokenPos")
@@ -17898,10 +18260,10 @@
 J.UQ(z.gGd(y),J.Hn(w,1)).sqr(a)}else{z=z.xW(y)
 z.toString
 v=$.X3
-u=new P.Gc(0,v,null,null,v.wY(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
+u=new P.Gc(0,v,null,null,v.cR(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
 u.$builtinTypeInfo=[null]
-z.au(u)}},
-CE:function(a){var z,y,x,w,v,u
+z.xf(u)}},
+eF:function(a){var z,y,x,w,v,u
 z=this.iD
 if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -17909,19 +18271,20 @@
 v=J.UQ(x.t(y,"location"),"tokenPos")
 x=J.RE(w)
 if(x.gox(w)===!0){u=w.q6(v)
-J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.pU(z.gl())
+J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.Eb(z.gl())
 this.iD=a},
-Xb:function(){var z=this.QR
-if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).YM(new D.Cm(this))
-this.QR=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.fx(this,a,b))},
-h4:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-yy:[function(a){return this.cv("debug/pause").ml(new D.ry(this))},"$0","gX0",0,0,203],
-QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,203],
-fV:[function(a){P.FL("isolate.stepInto")
-return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,203],
-PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.bP(this))},"$0","gqF",0,0,203],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gVX",0,0,203],
+Xb:function(){var z=this.hz
+if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
+this.hz=z}return z},
+G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
+WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,204],
+QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,204],
+Lg:[function(a){P.FL("isolate.stepInto")
+return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,204],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,204],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,204],
+bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -17930,142 +18293,142 @@
 "^":"PKX+Pi;",
 $isd3:true},
 iz:{
-"^":"Xs:13;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
+"^":"Xs:12;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,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,"")
 C.Nm.sB(a.VS,0)
 C.Nm.sB(a.hw,0)
-a.Oo.V1(0)}},
+a.n3.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"Xs:202;a,b",
+"^":"Xs:203;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
-if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,201,"call"],
+if(y.gjm())z.uj.to(0,this.b,new D.Ea(y))
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 Ea:{
-"^":"Xs:74;c",
+"^":"Xs:76;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Xs:13;a",
+"^":"Xs:12;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,210,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,211,"call"],
 $isEH:true},
-AP:{
-"^":"Xs:202;a",
+O5:{
+"^":"Xs:203;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
-y=this.a.GH
-y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,159,"call"],
+y=this.a.KJ
+y.Qv(z/1000,a)
+return y},"$1",null,2,0,null,163,"call"],
 $isEH:true},
 Ye:{
-"^":"Xs:13;a,b",
-$1:[function(a){this.a.pU(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){this.a.Eb(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 y4:{
-"^":"Xs:13;a",
-$1:[function(a){this.a.CE(a)},"$1",null,2,0,null,211,"call"],
+"^":"Xs:12;a",
+$1:[function(a){this.a.eF(a)},"$1",null,2,0,null,212,"call"],
 $isEH:true},
 Cm:{
-"^":"Xs:74;b",
-$0:[function(){this.b.QR=null},"$0",null,0,0,null,"call"],
+"^":"Xs:76;b",
+$0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-fx:{
-"^":"Xs:13;a,b,c",
+ad:{
+"^":"Xs:12;a,b,c",
 $1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.Hn(this.c,1)).sj9(!1)
-return this.a.Xb()},"$1",null,2,0,null,143,"call"],
+return this.a.Xb()},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 fw:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y
 if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.RE(0)
-else return z.Xb()},"$1",null,2,0,null,143,"call"],
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+else return z.Xb()},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-ry:{
-"^":"Xs:13;a",
+G4:{
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 LO:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 qD:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-bP:{
-"^":"Xs:13;a",
+A6:{
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 xK:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;RF,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return(J.xC(this.Fz,"Class")||J.xC(this.Fz,"Function")||J.xC(this.Fz,"Field"))&&!J.co(this.TU,$.RQ)},
 gM8:function(){return!1},
-bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,71],
-bF:function(a,b,c){var z,y,x
-this.kT=!c
+R5:function(a,b,c){var z,y,x
+this.qu=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
+y=z.LL
+x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
-y=y.t(0,"name")
+y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.Tc,this.GR,y)
-D.kT(z,this.P3)},
+D.kT(z,this.x8)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-x4:function(a,b){return this.RF.Zp.x4(0,b)},
-aN:function(a,b){return this.RF.Zp.aN(0,b)},
+NZ:function(a,b){return this.RF.LL.NZ(0,b)},
+aN:function(a,b){return this.RF.LL.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.Zp.t(0,b)},
+t:function(a,b){return this.RF.LL.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.Zp
+gl0:function(a){var z=this.RF.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.Zp
+gor:function(a){var z=this.RF.LL
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.Zp
+gvc:function(a){var z=this.RF.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.Zp
+gUQ:function(a){var z=this.RF.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.Zp
+gB:function(a){var z=this.RF.LL
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,123],
+return z.HC(z)},"$0","gDx",0,0,125],
 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)},
-Tr:[function(a){return},"$0","gqw",0,0,18],
-dt:[function(a){this.RF.AP=null
-return},"$0","gym",0,0,18],
+w37:[function(a){return},"$0","gcm",0,0,17],
+dt:[function(a){this.RF.Vg=null
+return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.AP
+z=this.RF.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
+bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -18074,18 +18437,18 @@
 $isd3:true,
 static:{"^":"RQ"}},
 pD:{
-"^":"wVq;I0,LD,jo,Ne,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
-y=this.P3
+y=this.x8
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -18094,16 +18457,17 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.Tc,this.GR,z)},
+bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $ispD:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"dZL;I0,LD,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.kT=!0
+R5:function(a,b,c){var z,y
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -18113,16 +18477,17 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.Tc,this.GR,z)},
+bu:[function(a){return"ServiceError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $isN7:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"w8F;I0,LD,IV,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -18139,14 +18504,15 @@
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfG:function(a){return this.eq},
 gQ1:function(){return this.HQ},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y
-this.kT=!0
-D.kT(b,this.P3)
+gRn:function(a){return this.ZK},
+R5:function(a,b,c){var z,y
+this.qu=!0
+D.kT(b,this.x8)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -18156,18 +18522,23 @@
 this.bN=y
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){z=z.t(b,"exception")
-this.jo=F.Wi(this,C.ne,this.jo,z)}},
+this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
+this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
+bu:[function(a){var z,y
+z="ServiceEvent of type "+H.d(this.eq)+" with "
+y=this.ZK
+return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,73],
 $isMk:true},
 V4b:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gO3:function(a){return this.dj},
-gUm:function(){return!0},
+gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
+R5:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
@@ -18176,24 +18547,24 @@
 w=J.U6(y)
 v=w.cn(y,"/")
 if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"user_name")
+x=w.yn(y,v+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
-y=z.t(b,"name")
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=this.Bm
 y.V1(y)
 w=J.dF(z.t(b,"imports")).br(0)
-H.rd(w,D.E0())
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
 w=J.dF(z.t(b,"scripts")).br(0)
-H.rd(w,D.E0())
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
@@ -18207,6 +18578,7 @@
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())},
+bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
@@ -18214,83 +18586,82 @@
 "^":"T5W+Pi;",
 $isd3:true},
 mT:{
-"^":"Pi;wf,rT,AP,fn",
+"^":"Pi;wf,wY,Vg,fn",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gfj:function(){return this.rT}},
+gfj:function(){return this.wY}},
 Iy:{
-"^":"a;hb<,l<",
+"^":"a;EJ<,l<",
 eC:function(a){var z,y,x
-z=this.hb
+z=this.EJ
 y=J.U6(a)
 x=y.t(a,6)
 z.wf=F.Wi(z,C.yB,z.wf,x)
 x=y.t(a,7)
-z.rT=F.Wi(z,C.hN,z.rT,x)
+z.wY=F.Wi(z,C.hN,z.wY,x)
 x=this.l
 z=J.WB(y.t(a,2),y.t(a,4))
 x.wf=F.Wi(x,C.yB,x.wf,z)
 y=J.WB(y.t(a,3),y.t(a,5))
-x.rT=F.Wi(x,C.hN,x.rT,y)},
-static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
+x.wY=F.Wi(x,C.hN,x.wY,y)},
+static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,kJ,f2,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.kJ},
-suj:function(a){this.kJ=F.Wi(this,C.Cw,this.kJ,a)},
-gVM:function(){return this.f2},
-gRs:function(){return this.vY},
-gi2:function(){return this.J1},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVM:function(){return this.Lh},
+gRs:function(){return this.GQ},
+geh:function(){return this.J1},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 gMp:function(){var z,y
 z=this.UY
-y=z.hb
-if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1
+y=z.EJ
+if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
+z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1
 if(z){z=this.xQ
-y=z.hb
-if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1}else z=!1
+y=z.EJ
+if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
+z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1}else z=!1
 return z},
-gUm:function(){return!0},
+gAY:function(){return this.k9},
+sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
+gjm:function(){return!0},
 gM8:function(){return!1},
-bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,71],
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x,w
 z=J.U6(b)
-y=z.t(b,"user_name")
-this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"abstract")
-this.f2=F.Wi(this,C.XH,this.f2,y)
+this.Lh=F.Wi(this,C.XH,this.Lh,y)
 y=z.t(b,"const")
-this.vY=F.Wi(this,C.Nr,this.vY,y)
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
 y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,y)
+this.GU=F.Wi(this,C.WV,this.GU,y)
 y=z.t(b,"patch")
 this.J1=F.Wi(this,C.XL,this.J1,y)
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.S5
+y=this.LT
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
 y.GT(y,D.E0())
@@ -18303,19 +18674,26 @@
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())
 y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.kJ,y)
-this.kJ=y
-if(y!=null)y.Ib(this)
+y=F.Wi(this,C.FZ,this.k9,y)
+this.k9=y
+if(y!=null&&J.xC(J.DA(y),"Object"))this.k9.u2(this)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.yh,this.yv,y)
 x=z.t(b,"allocationStats")
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.Gs(z,a))return
-z.h(0,a)},
-cv:function(a){return J.aT(this.P3).cv(J.WB(this.r0,"/"+H.d(a)))},
+this.xQ.eC(z.t(x,"old"))
+y=this.dQ
+w=z.t(x,"promotedInstances")
+y.wf=F.Wi(y,C.yB,y.wf,w)
+z=z.t(x,"promotedBytes")
+y.wY=F.Wi(y,C.hN,y.wY,z)}},
+u2:function(a){var z=this.LT
+if(z.tg(z,a))return
+z.h(0,a)
+z.GT(z,D.E0())},
+cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
+bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
 "^":"af+boh;"},
@@ -18323,16 +18701,16 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 ma:{
-"^":"a;zt",
-bu:[function(a){return this.zt},"$0","gAY",0,0,74],
-Q2:function(){return C.Nm.Gs([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.YF()
+"^":"a;Sf",
+bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
+Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
 case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.GG()
+case"kGetterFunction":return $.xW()
 case"kSetterFunction":return $.Kw()
 case"kConstructor":return $.kj()
-case"kImplicitGetterFunction":return $.d9()
-case"kImplicitSetterFunction":return $.AH()
+case"kImplicitGetter":return $.d9()
+case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
@@ -18342,23 +18720,23 @@
 case"Tag":return $.zx()
 case"Reused":return $.MQ()}return $.lC()}}},
 Kp:{
-"^":"S6L;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"S6L;MD,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gEl:function(){return this.MD},
 sEl:function(a){this.MD=F.Wi(this,C.YV,this.MD,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRs:function(){return this.vY},
+gRs:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
-gtT:function(a){return this.TD},
-stT:function(a,b){this.TD=F.Wi(this,C.i4,this.TD,b)},
+gtT:function(a){return this.v5},
+stT:function(a,b){this.v5=F.Wi(this,C.i4,this.v5,b)},
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
@@ -18368,16 +18746,16 @@
 gUx:function(){return this.Ni},
 gSu:function(){return this.kE},
 gni:function(){return this.Z4},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
-y=z.t(b,"user_name")
-this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
-D.kT(b,J.aT(this.P3))
-y=z.x4(b,"owningClass")===!0?z.t(b,"owningClass"):null
+D.kT(b,J.aT(this.x8))
+y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.MD=F.Wi(this,C.YV,this.MD,y)
-y=z.x4(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
+y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
 this.EG=F.Wi(this,C.If,this.EG,y)
 y=D.Ez(z.t(b,"kind"))
 y=F.Wi(this,C.Lc,this.I0,y)
@@ -18385,33 +18763,33 @@
 y=y.Q2()
 this.Z4=F.Wi(this,C.a0,this.Z4,!y)
 if(c)return
-y=z.t(b,"isStatic")
+y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"isConst")
-this.vY=F.Wi(this,C.Nr,this.vY,y)
+y=z.t(b,"const")
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
 y=z.t(b,"parent")
 this.fd=F.Wi(this,C.nX,this.fd,y)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
 y=D.UW(z.t(b,"code"))
-this.TD=F.Wi(this,C.i4,this.TD,y)
-y=D.UW(z.t(b,"unoptimized_code"))
+this.v5=F.Wi(this,C.i4,this.v5,y)
+y=D.UW(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
-y=z.t(b,"is_optimizable")
+y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
-y=z.t(b,"is_inlinable")
+y=z.t(b,"inlinable")
 this.H7=F.Wi(this,C.MY,this.H7,y)
 y=z.t(b,"deoptimizations")
 this.XN=F.Wi(this,C.eR,this.XN,y)
-z=z.t(b,"usage_counter")
+z=z.t(b,"usageCounter")
 this.kE=F.Wi(this,C.yv,this.kE,z)
 z=this.fd
 if(z==null){z=this.MD
-z=z!=null?H.d(J.O6(z))+"."+H.d(this.bN):this.bN
+z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
@@ -18421,9 +18799,9 @@
 "^":"wvY+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;Is>,Rd>,a4>,x9,Yp,am,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
+gc1:function(){return this.x9},
+sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
 sqr:function(a){var z=this.Yp
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
@@ -18434,7 +18812,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.Is,y=J.mY(J.UQ(J.aT(z.P3).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -18449,55 +18827,55 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
 z=J.It(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.lo,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
-gUm:function(){return!0},
+gjm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.Hn(a,1)
-y=this.Gd.ao
+y=this.Gd.XH
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
-q6:function(a){return this.y6.t(0,a)},
-bF:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.P3))
+q6:function(a){return this.MO.t(0,a)},
+R5:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
-this.wA=y
+this.zD=y
 x=J.U6(y)
 w=x.cn(y,"/")
 if(typeof w!=="number")return w.g()
 w=x.yn(y,w+1)
-this.Ge=w
+this.yc=w
 this.bN=this.ct(this,C.YS,this.bN,w)
-w=this.wA
+w=this.zD
 this.GR=this.ct(this,C.Tc,this.GR,w)
 if(c)return
-this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))
-z=z.t(b,"owning_library")
+this.Aj(z.t(b,"source"))
+this.YG(z.t(b,"tokenPosTable"))
+z=z.t(b,"owningLibrary")
 this.EG=F.Wi(this,C.If,this.EG,z)},
-PT:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+YG:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
-z=this.y6
+z=this.MO
 z.V1(0)
-y=this.FB
+y=this.aQ
 y.V1(0)
-this.U9=F.Wi(this,C.Gd,this.U9,null)
+this.E4=F.Wi(this,C.Gd,this.E4,null)
 this.nE=F.Wi(this,C.kA,this.nE,null)
 x=P.Ls(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
@@ -18510,29 +18888,29 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.U9
+r=this.E4
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=q
+this.nq(this,r)}this.E4=q
 r=this.nE
 if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.U9:q
-o=this.U9
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
+o=this.E4
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.U9=r
+this.nq(this,o)}this.E4=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
-if(!x.Gs(0,J.f2(v)))v.sj9(!1)}},
-SC:function(a){var z,y,x,w,v,u,t
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
+if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
+lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
-y=this.d6
+y=this.p3
 x=0
 while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
@@ -18541,21 +18919,21 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
+x+=2}this.f2()},
+Aj:function(a){var z,y,x,w
+this.qu=!1
 if(a==null)return
 z=J.It(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.qu=!0
 y=this.Gd
 y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.zL()},
-zL:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,J.f2(x)))}},
+y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+f2:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
+x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
@@ -18566,15 +18944,15 @@
 "^":"a;Yu<,Du<,fF<",
 $isDb:true},
 Z9:{
-"^":"Pi;Yu<,LR,VF<,Yn,fY>,ar,up,AP,fn",
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gJz:function(){return this.up},
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gmE:function(){return this.up},
 JM:[function(){var z,y
-z=this.LR
+z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,71],
+return y.bu(z)},"$0","gkA",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -18586,28 +18964,28 @@
 this.up=F.Wi(this,C.oI,this.up,z)},
 $isZ9:true},
 Q4:{
-"^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
+gX1:function(){return this.uH.XH.length>0},
 dV:[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,71],
-io:[function(a){var z
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,73],
+tU:[function(a){var z
 if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,212,76],
-HU:[function(a){var z
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,213,78],
+P7:[function(a){var z
 if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,212,76],
-eQ:function(){var z,y,x,w
-y=J.It(this.L4," ")
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,213,78],
+lF:function(){var z,y,x,w
+y=J.It(this.u0," ")
 x=y.length
 if(x!==2)return 0
 if(1>=x)return H.e(y,1)
@@ -18616,23 +18994,23 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-ju:function(a){var z,y,x,w,v
-z=this.L4
+pj:function(a){var z,y,x,w,v
+z=this.u0
 if(!J.co(z,"j"))return
-y=this.eQ()
+y=this.lF()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.XH,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
 return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{dJ:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{dJ:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,71],
+bu:[function(a){return this.uX},"$0","gCR",0,0,73],
 static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
@@ -18648,32 +19026,32 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $isD5:true},
 kx:{
-"^":"Zqa;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,qH,JK,uG,ar,MH,oc*,TE@,Mk,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
 gan:function(){return this.qH},
 gL1:function(){return this.JK},
 sL1:function(a){this.JK=F.Wi(this,C.zO,this.JK,a)},
-gig:function(a){return this.MO},
-sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gYG:function(){return this.MH},
-gUm:function(){return!0},
+gig:function(a){return this.uG},
+sig:function(a,b){this.uG=F.Wi(this,C.nf,this.uG,b)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+goF:function(){return this.MH},
+gjm:function(){return!0},
 gM8:function(){return!0},
-tx:[function(a){var z,y
+P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,213,214],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,214,215],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
-var z=this.MO
+var z=this.uG
 if(z==null)return
-if(J.zH(z)==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.zH(this.MO)).ml(this.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
+if(J.KL(z)==null){J.SK(this.uG).ml(new D.Em(this))
+return}J.SK(J.KL(this.uG)).ml(this.gH8())},
+VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-bd:function(a,b,c){var z,y,x,w,v
+ui:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -18683,46 +19061,46 @@
 v=H.BU(z.t(b,y+1),null,null)
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.Fc(c[w],v))
-y+=2}H.rd(a,new D.Cq())},
+y+=2}H.ig(a,new D.fx())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,c)
+this.xM=F.Wi(this,C.kr,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.hw,z.t(a,"callees"),b)
+this.ui(this.VS,z.t(a,"callers"),b)
+this.ui(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
-if(y!=null)this.qL(y)
+if(y!=null)this.Zk(y)
 z=D.RA(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.RA(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v,u
+R5:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.TX=z.t(b,"name")
-y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.oc=z.t(b,"name")
+this.TE=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.oc
+y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.P3
+this.uE=H.BU(z.t(b,"end"),16,null)
+y=this.x8
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,w)
-y=x.god(y).Qn(z.t(b,"object_pool"))
+this.uG=F.Wi(this,C.nf,this.uG,w)
+y=x.god(y).Qn(z.t(b,"objectPool"))
 this.JK=F.Wi(this,C.zO,this.JK,y)
 v=z.t(b,"disassembly")
-if(v!=null)this.xs(v)
+if(v!=null)this.u5(v)
 u=z.t(b,"descriptors")
-if(u!=null)this.WY(J.UQ(u,"members"))
-z=this.va.ao
-this.kT=z.length!==0||!J.xC(this.I0,C.l8)
+if(u!=null)this.Xd(J.UQ(u,"members"))
+z=this.va.XH
+this.qu=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
-gvS:function(){return this.Mk},
-xs:function(a){var z,y,x,w,v,u,t,s
+gUa:function(){return this.Mk},
+u5:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 z.V1(z)
 y=J.U6(a)
@@ -18739,22 +19117,22 @@
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.ju(z)},
-QX:function(a){var z,y,x,w,v,u,t
+x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
+MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
 if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
+Xd:function(a){var z
+for(z=J.mY(a);z.G();)this.MY(z.gl())},
+Zk:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=this.Oo
+y=this.n3
 x=0
 while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
@@ -18762,30 +19140,30 @@
 v=H.BU(z.t(a,x),16,null)
 y.u(0,v,new D.Db(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
-Gs:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},
+tg:function(a,b){var z=J.Wx(b)
+return z.F(b,this.vg)&&z.C(b,this.uE)},
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{RA:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{RA:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.zH(z.MO)
+y=J.KL(z.uG)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,215,"call"],
+J.SK(y).ml(z.gH8())},"$1",null,2,0,null,216,"call"],
 $isEH:true},
-Cq:{
-"^":"Xs:80;",
+fx:{
+"^":"Xs:81;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,71],
-static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
+bu:[function(a){return this.uX},"$0","gCR",0,0,73],
+static:{"^":"Cnk,qp,FJy,wr",B4:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -18793,21 +19171,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"D3i;V8@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gUm:function(){return!0},
+"^":"D3i;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
 gaB:function(a){return this.vu},
 gm8:function(){return this.DB},
-gV0:function(){return this.XK},
+gaU:function(){return this.XK},
 gaP:function(){return this.FH},
 gzM:function(){return this.L7},
-gx5:function(){return this.zw},
+gki:function(){return this.zw},
 giP:function(){return this.tO},
-gmd:function(){return this.HO},
+gfJ:function(){return this.HO},
 gNS:function(){return this.u8},
 gzK:function(){return this.EC},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -18816,8 +19194,8 @@
 y=D.B4(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=z.t(b,"readClosed")
 this.DB=F.Wi(this,C.I7,this.DB,y)
 y=z.t(b,"writeClosed")
@@ -18838,19 +19216,19 @@
 this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.V8=z.t(b,"owner")}},
+this.ip=z.t(b,"owner")}},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
-$isEH:true}}],["service_common","package:observatory/service_common.dart",,L,{
+$isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
 "^":"a;eX@,A9<,oc*,w8<",
@@ -18868,44 +19246,45 @@
 z.UT(a)
 return z}}},
 U2:{
-"^":"a;jO>,mh<",
+"^":"a;jO>,qT<",
 $isU2:true},
 Uon:{
 "^":"wv;N>",
-gEH:function(){return this.bO.MM},
-Ue:function(){var z=this.DS.MM
-if(z.Gv===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}},
-giG:function(a){return this.DS.MM},
-je:function(a){if(this.xu)this.TU.bs.close()
-this.vt()
-this.Ue()},
+gEH:function(){return this.Tn.MM},
+FZ:function(){var z=this.Fq.MM
+if(z.YM===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(this)}},
+giG:function(a){return this.Fq.MM},
+je:function(a){if(this.Sl)this.Ra.bs.close()
+this.M0()
+this.FZ()},
 z6:function(a,b){var z,y,x
-if(!this.xu){this.xu=!0
-this.TU.Tc(this.N.gw8(),this.gBU(),this.gCC(),this.gyE(),this.gM5())}z=C.jn.bu(this.fW++)
+if(!this.Sl){this.Sl=!0
+this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
 x=new L.U2(b,y)
-if(this.TU.bs.readyState===1)this.L8(z,x)
-else this.hZ.u(0,z,x)
+if(this.Ra.bs.readyState===1)this.Mf(z,x)
+else this.WE.u(0,z,x)
 return y.MM},
-yg:[function(){this.vt()
-this.Ue()},"$0","gM5",0,0,18],
-os:[function(){this.vt()
-this.Ue()},"$0","gyE",0,0,18],
-yl5:[function(){var z,y
+abp:[function(){this.M0()
+this.FZ()},"$0","gNu",0,0,17],
+Xs:[function(){this.M0()
+this.FZ()},"$0","gCW",0,0,17],
+LNZ:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
 z.seX(y)
-this.uP()
-y=this.bO.MM
-if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$0","gBU",0,0,18],
-wDh:[function(a){var z,y,x,w,v
-z=C.xr.kV(a)
+this.e2()
+y=this.Tn.MM
+if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(this)}},"$0","gkQ",0,0,17],
+PW:[function(a){var z,y,x,w,v
+if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
+return}z=C.xr.iQ(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -18913,65 +19292,84 @@
 w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
-return}v=this.AW.Rz(0,x)
+return}v=this.Td.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gmh().MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","gCC",2,0,20],
-BF:function(a){a.aN(0,new L.dV(this))
+return}y=v.gqT().MM
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(w)},"$1","gM3",2,0,19],
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-vt:function(){var z=this.AW
+M0:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
-this.BF(z)}z=this.hZ
+this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
-this.BF(z)}},
-uP:function(){var z=this.hZ
+this.ck(z)}},
+e2:function(){var z=this.WE
 if(z.X5===0)return
 N.QM("").To("Sending all delayed requests.")
-z.aN(0,this.grW())
+z.aN(0,this.ge8())
 z.V1(0)},
-L8:[function(a,b){var z,y
+Mf:[function(a,b){var z,y
 z=J.RE(b)
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.AW.u(0,a,b)
+this.Td.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.TU.bs.send(y)},"$2","grW",4,0,216]},
+this.Ra.bs.send(y)},"$2","ge8",4,0,217]},
+jF:{
+"^":"Xs:218;a",
+$1:[function(a){var z,y,x,w,v,u,t
+z=J.RE(a)
+y=z.mt(a,0,C.it)
+x=this.a
+w=z.gbg(a)
+v=z.gVl(a)
+if(typeof v!=="number")return v.g()
+w.toString
+u=x.Ur.Sw(H.GG(w,v+8,y))
+t=C.jn.g(8,y)
+v=z.gbg(a)
+w=z.gVl(a)
+if(typeof w!=="number")return w.g()
+z=z.gH3(a)
+if(typeof z!=="number")return z.W()
+x.hQ(u,J.nq(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
+$isEH:true},
 dV:{
-"^":"Xs:217;a",
+"^":"Xs:219;a",
 $2:function(a,b){var z,y
-z=b.gmh()
+z=b.gqT()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(y)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(y)},
+$isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V48;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V50;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y,x,w
+static:{qa:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.U0.ZL(a)
+a.n9=x
+a.wy=w
+C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V48:{
+V50:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V49;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V51;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{bZp:function(a){var z,y,x,w
@@ -18980,65 +19378,74 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vd.ZL(a)
+a.n9=x
+a.wy=w
+C.Vd.LX(a)
 C.Vd.XI(a)
 return a}}},
-V49:{
+V51:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 hA:{
 "^":"a;bs",
 Tc:function(a,b,c,d,e){var z=W.pS(a,null)
 this.bs=z
-z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.lo(e)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.i6.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.j3(d)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.Fz(b)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.tv(c)),z.Sg),[H.u3(z,0)]).Zz()},
+z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
-xO:function(a){this.bs.close()}},
+xO:function(a){this.bs.close()},
+OI:function(a){var z,y
+z=new FileReader()
+z.readAsArrayBuffer(a)
+y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
+return y.gqG(y).ml(new U.OW(z))}},
 lo:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.$0()},"$1",null,2,0,null,218,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.$0()},"$1",null,2,0,null,220,"call"],
 $isEH:true},
 j3:{
-"^":"Xs:13;b",
-$1:[function(a){return this.b.$0()},"$1",null,2,0,null,219,"call"],
+"^":"Xs:12;b",
+$1:[function(a){return this.b.$0()},"$1",null,2,0,null,221,"call"],
 $isEH:true},
 Fz:{
-"^":"Xs:13;c",
-$1:[function(a){return this.c.$0()},"$1",null,2,0,null,219,"call"],
+"^":"Xs:12;c",
+$1:[function(a){return this.c.$0()},"$1",null,2,0,null,221,"call"],
 $isEH:true},
-tv:{
-"^":"Xs:220;d",
-$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,2,"call"],
+oy:{
+"^":"Xs:222;d",
+$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,87,"call"],
+$isEH:true},
+OW:{
+"^":"Xs:12;a",
+$1:[function(a){return J.nq(C.vm.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;bO,DS,N,hZ,AW,fW,xu,TU,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
 giG:function(a){return this.rp.MM},
-q3:[function(a){var z,y,x,w,v
+j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
 x=J.UQ(z.gRn(a),"name")
@@ -19047,7 +19454,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,77],
+J.KD(v,w)},"$1","gDi",2,0,19,223],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -19058,19 +19465,19 @@
 this.S3.u(0,z,x)
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.u3(z,0)]).Zz()
+ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V50;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V52;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
-gKw:function(a){return a.Sa},
-sKw:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
-Xq:function(a){var z
+gl6:function(a){return a.Sa},
+sl6:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
+bc:function(a){var z
 switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.Ll)
 return z
@@ -19098,7 +19505,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.Ll)
 return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Null":case"Bigint":case"String":z=W.r3("instance-view",null)
 J.Qy(z,a.Ll)
 return z
 case"IO":z=W.r3("io-view",null)
@@ -19135,7 +19542,7 @@
 J.A4(z,a.Ll)
 return z
 case"Process":z=W.r3("io-process-view",null)
-J.aw(z,a.Ll)
+J.rL(z,a.Ll)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
 J.CJ(z,a.Ll)
@@ -19153,7 +19560,7 @@
 J.BC(z,a.Ll)
 return z
 case"Script":z=W.r3("script-view",null)
-J.ZI(z,a.Ll)
+J.ry(z,a.Ll)
 return z
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.Ll)
@@ -19164,15 +19571,15 @@
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
 return z}},
-vy:[function(a,b){var z,y,x
-this.pj(a)
+xJ:[function(a,b){var z,y,x
+this.D4(a)
 z=a.Ll
 if(z==null){N.QM("").To("Viewing null object.")
 return}y=z.gzS()
-x=this.Xq(a)
+x=this.bc(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,13,57],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
 $isTi:true,
 static:{Gvt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -19180,127 +19587,127 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ns.ZL(a)
+a.n9=x
+a.wy=w
+C.Ns.LX(a)
 C.Ns.XI(a)
 return a}}},
-V50:{
+V52:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V51;dL,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gLC:function(a){return a.dL},
-sLC:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
+"^":"V53;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gBN:function(a){return a.dL},
+sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Rr.ZL(a)
-C.Rr.XI(a)
+a.n9=x
+a.wy=w
+C.Uav.LX(a)
+C.Uav.XI(a)
 return a}}},
-V51:{
+V53:{
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V52;GW,C7,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V54;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-zn:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,92,159],
-Cp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,92,159],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,157,221,101],
-static:{n2:function(a){var z,y,x,w
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,163],
+qc:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,163],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
+c.$0()},"$2","gus",4,0,161,224,102],
+static:{Wzx:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.fv.ZL(a)
-C.fv.XI(a)
+a.n9=x
+a.wy=w
+C.um.LX(a)
+C.um.XI(a)
 return a}}},
-V52:{
+V54:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V53;Jg,C7,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V55;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-zn:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,92,159],
-Cp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,92,159],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,157,221,101],
-static:{mA:function(a){var z,y,x,w
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,163],
+qc:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,163],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
+c.$0()},"$2","gus",4,0,161,224,102],
+static:{z0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.dl.ZL(a)
+a.n9=x
+a.wy=w
+C.dl.LX(a)
 C.dl.XI(a)
 return a}}},
-V53:{
+V55:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 gjT:function(a){return a.Pe},
 sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
-DZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,20,57],
+this.ct(a,C.k6,"",this.gXt(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
 this.gi6(a).Z6
 return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
+gXt:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gTX()},
+return z.gTE()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},
+return J.DA(z)},
 gWw:function(a){return J.FN(this.goc(a))},
 static:{lKH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -19309,22 +19716,76 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.HRc.ZL(a)
+a.n9=x
+a.wy=w
+C.HRc.LX(a)
 C.HRc.XI(a)
 return a}}},
-Vfx:{
+Dsd:{
 "^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+$isd3:true},
+f7:{
+"^":"V56;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gnv:function(a){return a.tY},
+snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
+pY:function(a){var z
+switch(a.tY.gzS()){case"Class":z=W.r3("class-ref",null)
+J.PP(z,a.tY)
+return z
+case"Code":z=W.r3("code-ref",null)
+J.PP(z,a.tY)
+return z
+case"Field":z=W.r3("field-ref",null)
+J.PP(z,a.tY)
+return z
+case"Function":z=W.r3("function-ref",null)
+J.PP(z,a.tY)
+return z
+case"Library":z=W.r3("library-ref",null)
+J.PP(z,a.tY)
+return z
+case"Array":case"Bigint":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Mint":case"Null":case"Smi":case"String":case"Type":z=W.r3("instance-ref",null)
+J.PP(z,a.tY)
+return z
+default:z=W.r3("span",null)
+J.t3(z,"<<Unknown service ref: "+H.d(a.tY)+">>")
+return z}},
+Qj:[function(a,b){var z,y,x
+this.D4(a)
+z=a.tY
+if(z==null){N.QM("").To("Viewing null object.")
+return}y=z.gzS()
+x=this.pY(a)
+if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
+return}a.appendChild(x)
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+static:{wzV:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.f4=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.n9=x
+a.wy=w
+C.J9.LX(a)
+C.J9.XI(a)
+return a}}},
+V56:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
@@ -19332,46 +19793,46 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 oew:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,114,1,222,106],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,115,2,225,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.zb.ZL(a)
+a.n9=x
+a.wy=w
+C.zb.LX(a)
 C.zb.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
-Wq:{
-"^":"a;wq,IW,Mg,nN,ER,Ja,WI,tu",
-WO:function(a,b){return this.tu.$1(b)},
+rv:{
+"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
+WO:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.wq?"fields ":"")
+z.KF(this.kl?"fields ":"")
 z.KF(this.IW?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
 z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
+z.KF("annotations: "+H.d(this.BY))
+z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-return z.vM},"$0","gAY",0,0,71]},
+return z.IN},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.hU},
+gUA:function(){return this.fY===C.cn},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -19384,10 +19845,10 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.vM},"$0","gAY",0,0,71],
+return z.IN},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"a;fY>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
@@ -19401,36 +19862,36 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.lo
+for(;z.G();){y=z.Ff
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.lo
+for(;x.G();){v=x.Ff
 if(w.n(y,v))return!0
 if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
+u=$.mX().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-Cz:function(a){var z,y
+na:function(a){var z,y
 z=H.G3()
-y=H.KT(z).BD(a)
+y=H.KT(z).Zg(a)
 if(y)return 0
-y=H.KT(z,[z]).BD(a)
+y=H.KT(z,[z]).Zg(a)
 if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).Zg(a)
 if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
+z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+aW:function(a){var z,y
 z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
+y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).Zg(a)
 if(y)return 2
-y=H.KT(z,[z]).BD(a)
+y=H.KT(z,[z]).Zg(a)
 if(y)return 1
-z=H.KT(z).BD(a)
+z=H.KT(z).Zg(a)
 if(z)return 0
 return-1},
 W4:function(a,b,c){var z,y,x,w,v,u,t
@@ -19438,128 +19899,128 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
 else x.u(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
 if(u>=y)return H.e(b,u)
-if(t!==b[u])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+if(t!==b[u])return!1}return!0}}],["","",,D,{
 "^":"",
-kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
+kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
-R0:{
-"^":"a;II,F8,ZG,of,Pq,af<,NU,nX",
+Oj:{
+"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
 FV:function(a,b){this.II.FV(0,b.gII())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
 O.PV(this.of,b.gof())
-O.PV(this.Pq,b.gPq())
+O.PV(this.F3,b.gF3())
 this.af.FV(0,b.gaf())
 b.gaf().aN(0,new O.T6(this))},
 IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
-z=new O.R0(c,f,e,b,y,d,z,a)
+z=new O.Oj(c,f,e,b,y,d,z,a)
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.D8())
+a.to(0,y,new O.jb())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.NU.u(0,b,a)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
 T6:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.NU.u(0,b,a)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-D8:{
-"^":"Xs:74;",
+jb:{
+"^":"Xs:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;H6",
-Tv:function(a,b){var z=this.H6.II.t(0,b)
+"^":"a;JE",
+Gp:function(a,b){var z=this.JE.II.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.H6.F8.t(0,b)
+Cq:function(a,b,c){var z=this.JE.F8.t(0,b)
 if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t,s
 z=null
-x=this.H6
-if(!!J.x(a).$isuq){w=x.Pq.t(0,a)
+x=this.JE
+if(!!J.x(a).$isuq){w=x.F3.t(0,a)
 z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
 z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.Cz(z)
+if(d){u=X.na(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.aW(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;H6",
-dM:function(a,b){var z,y,x
-if(J.xC(a,b)||J.xC(b,C.FQ))return!0
-for(z=this.H6,y=z.ZG;!J.xC(a,C.FQ);a=x){x=y.t(0,a)
+"^":"a;JE",
+xs:function(a,b){var z,y,x
+if(J.xC(a,b)||J.xC(b,C.AP))return!0
+for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
 if(x==null){if(!z.nX)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
-UK:function(a,b){var z=this.aR(a,b)
+UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.H6
+z=this.JE
 y=z.of.t(0,a)
 if(y==null){if(!z.nX)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
-CV:function(a,b){var z=this.aR(a,b)
-if(z==null){if(!this.H6.nX)return
+CV:function(a,b){var z=this.NW(a,b)
+if(z==null){if(!this.JE.nX)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
-fK:function(a,b,c){var z,y,x,w,v,u
+Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.H6
+if(c.Mg){y=this.JE
 x=y.ZG.t(0,b)
-if(x==null){if(y.nX)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.fK(0,x,c)}y=this.H6
+if(x==null){if(y.nX)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.JE
 w=y.of.t(0,b)
 if(w==null){if(!y.nX)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
-if(!c.wq&&v.gZI())continue
+if(!c.kl&&v.gZI())continue
 if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(c.ER&&J.EMK(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
+if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
+u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
-aR:function(a,b){var z,y,x,w,v,u
-for(z=this.H6,y=z.ZG,x=z.of;!J.xC(a,C.FQ);a=u){w=x.t(0,a)
+NW:function(a,b){var z,y,x,w,v,u
+for(z=this.JE,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
 if(u==null){if(!z.nX)return
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;H6"},
+"^":"a;JE"},
 tk:{
 "^":"a;GB",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V54;xP,rs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V57;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 git:function(a){return a.rs},
 sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
-c.$0()},"$2","gus",4,0,157,221,101],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
+c.$0()},"$2","gus",4,0,161,224,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19567,59 +20028,59 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.rs=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.dX.ZL(a)
+a.n9=x
+a.wy=w
+C.dX.LX(a)
 C.dX.XI(a)
 return a}}},
-V54:{
+V57:{
 "^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 uw:{
-"^":"V55;Jl,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V58;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtN:function(a){return a.Jl},
 stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
-SK:[function(a,b){J.cI(a.Jl).YM(b)},"$1","gvC",2,0,20,101],
-static:{S1:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
+static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.uC.ZL(a)
-C.uC.XI(a)
+a.n9=x
+a.wy=w
+C.bg3.LX(a)
+C.bg3.XI(a)
 return a}}},
-V55:{
+V58:{
 "^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
+$isd3:true}}],["","",,M,{
 "^":"",
 dg:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.glb(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+if(z==null)z=new M.XI([],null,null)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
 w[v]=u}z.ks=w
 return z},
 S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ha(c,a,!1))
+z=b.appendChild(J.Lh(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.SB(z).wh(a)
-if(f!=null)J.D4(M.SB(z),f)}M.mV(z,d,e,g)
+if(d.ghK()){M.Xi(z).cl(a)
+if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
 return z},
 aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
@@ -19627,60 +20088,60 @@
 z=J.UQ(a,"__dartBindable")
 return!!J.x(z).$isAp?z:new M.VB(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.aV
+if(!!J.x(a).$isVB)return a.qf
 z=$.X3
 y=new M.Ra(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
+for(;z=J.cP(a),z!=null;a=z);return a},
 cS:function(a,b){var z,y,x,w,v,u
 if(b==null||b==="")return
 z="#"+H.d(b)
 for(;!0;){a=M.tA(a)
-y=$.FC()
+y=$.Tn()
 y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+x=H.vA(a,"expando$values")
+w=x==null?null:H.vA(x,y.V2())
 y=w==null
-if(!y&&w.gj6()!=null)v=J.Eh(w.gj6(),z)
+if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
 else{u=J.x(a)
 v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gCv()
+a=w.gfQ()
 if(a==null)return}},
-nk:function(a,b,c){if(c==null)return
-return new M.hg(a,b,c)},
+H4o:function(a,b,c){if(c==null)return
+return new M.iT(a,b,c)},
 pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isUn){y=S.j9(a.textContent,M.nk("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
+if(!!z.$isUn){y=S.j9(a.textContent,M.H4o("text",a,b))
+if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.nk(b,a,c))},
+return S.j9(z,M.H4o(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
 y=M.CF(a)
-new W.E9(a).aN(0,new M.NWj(z,a,b,y))
+new W.E9(a).aN(0,new M.fE(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.EI=z
+v.Z0=z
 x=M.rJ(a,"bind",b)
-v.YI=x
+v.lC=x
 u=M.rJ(a,"repeat",b)
-v.Lx=u
-if(z!=null&&x==null&&u==null)v.YI=S.j9("{{}}",M.nk("bind",a,b))
+v.vJ=u
+if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
+return z==null?null:new M.XI(z,null,null)},
+i8:function(a,b,c,d){var z,y,x,w,v,u,t
+if(b.gqz()){z=b.qJ(0)
+y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
 if(typeof w!=="number")return H.s(w)
@@ -19691,33 +20152,33 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.HH(u)
-t=z!=null?z.$3(d,c,!1):b.Pn(u).Tl(d)
+z=b.qJ(u)
+t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.KH(a,b,c,d)
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq)
-return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}y=new L.ww(null,!1,[],null,null,null,$.jq)
-y.Wf=[]
+uF:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.gau())return M.i8(a,b,c,d)
+if(b.gqz()){z=b.qJ(0)
+y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.FU)
+return b.gaW()?y:new Y.Wa(y,b.gPf(),null,null,null)}y=new L.bg(null,!1,[],null,null,null,$.FU)
+y.vS=[]
 x=J.U6(b)
 w=0
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.U0(w)
-z=b.HH(w)
+c$0:{u=b.AX(w)
+z=b.qJ(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else y.Qs(t)
+else y.YU(t)
 break c$0}s=b.Pn(w)
-if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++w}return new Y.Qw(y,b.gEO(),null,null,null)},
+if(u===!0)y.ti(s.WK(d))
+else y.WX(d,s)}++w}return new Y.Wa(y,b.gPf(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.SB(a)
+x=!!J.x(a).$isvy?a:M.Xi(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -19726,22 +20187,22 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.oO(s,r,a,c),r.gwD())
+q=v.nR(x,s,M.uF(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
-u+=2}v.Vz(x)
+u+=2}v.lL(x)
 if(!z.$isqf)return
-p=M.SB(a)
-p.skr(c)
-o=p.Cm(b)
+p=M.Xi(a)
+p.sQk(c)
+o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-SB:function(a){var z,y,x,w
+Xi:function(a){var z,y,x,w
 z=$.cm()
 z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+y=H.vA(a,"expando$values")
+x=y==null?null:H.vA(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
@@ -19749,321 +20210,321 @@
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
 VE:{
-"^":"a;DP",
+"^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
-PW:{
-"^":"a;Cd>,ks>,q1>",
+XI:{
+"^":"a;Cd>,ks>,rz>",
 ghK:function(){return!1},
 JW:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;EI,YI,Lx,Cd,ks,q1",
+"^":"XI;Z0,lC,vJ,Cd,ks,rz",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
-"^":"a;N1<,aV,Xl?",
-gCd:function(a){var z=J.UQ(this.aV,"bindings_")
+"^":"a;KB<,qf,qL?",
+gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
-return new M.lb(this.gN1(),z)},
+return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.kW(this.aV,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.aR(this.gN1(),b)
+nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
-return M.xa(this.aV.V7("bind",[b,c,d]))},
-Vz:function(a){return this.aV.nQ("bindFinished")},
-gmSA:function(a){var z=this.Xl
-if(z!=null);else if(J.Lp(this.gN1())!=null){z=J.Lp(this.gN1())
-z=J.qb(!!J.x(z).$isvy?z:M.SB(z))}else z=null
+return M.xa(this.qf.V7("bind",[b,c,d]))},
+lL:function(a){return this.qf.nQ("bindFinished")},
+gmb:function(a){var z=this.qL
+if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
+z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
 return z},
 $isvy:true},
 lb:{
-"^":"ilb;N1<,mD<",
-gvc:function(a){return J.kl(J.UQ($.Si(),"Object").V7("keys",[this.mD]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.N1).$isUn&&J.xC(b,"text"))b="textContent"
-return M.xa(J.UQ(this.mD,b))},
-u:function(a,b,c){if(!!J.x(this.N1).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.mD,b,M.fg(c))},
+"^":"ilb;KB<,dn<",
+gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
+t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+return M.xa(J.UQ(this.dn,b))},
+u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+J.kW(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
-z=this.N1
+z=this.KB
 b=M.aR(z,b)
-y=this.mD
+y=this.dn
 x=M.xa(J.UQ(y,M.aR(z,b)))
 y.Ji(b)
-return x},"$1","gUS",2,0,223,56],
+return x},"$1","gUS",2,0,226,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
 $asilb:function(){return[P.qU,A.Ap]},
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
-"^":"Xs:13;a",
-$1:[function(a){return!!J.x(this.a.N1).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,56,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 VB:{
-"^":"Ap;aV",
-TR:function(a,b){return this.aV.V7("open",[$.X3.mS(b)])},
-xO:function(a){return this.aV.nQ("close")},
-gP:function(a){return this.aV.nQ("discardChanges")},
-sP:function(a,b){this.aV.V7("setValue",[b])},
-fR:function(){return this.aV.nQ("deliver")},
+"^":"Ap;qf",
+TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
+xO:function(a){return this.qf.nQ("close")},
+gP:function(a){return this.qf.nQ("discardChanges")},
+sP:function(a,b){this.qf.V7("setValue",[b])},
+fR:function(){return this.qf.nQ("deliver")},
 $isVB:true},
 Ra:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
 aY:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:function(a){return this.b.rO(a,!1)},
 $isEH:true},
 SL:{
-"^":"Xs:13;c",
-$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,41,"call"],
+"^":"Xs:12;c",
+$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,40,"call"],
 $isEH:true},
 Au:{
-"^":"Xs:13;d",
-$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,173,"call"],
+"^":"Xs:12;d",
+$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,176,"call"],
 $isEH:true},
 no:{
-"^":"Xs:74;e",
+"^":"Xs:76;e",
 $0:[function(){return J.yd(this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uD:{
-"^":"Xs:74;f",
+"^":"Xs:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eT:{
-"^":"Xs:13;UI",
-$1:[function(a){J.ta(this.UI,a)
-return a},"$1",null,2,0,null,173,"call"],
-$isEH:true},
 Wb:{
-"^":"Xs:74;bK",
+"^":"Xs:12;UI",
+$1:[function(a){J.ta(this.UI,a)
+return a},"$1",null,2,0,null,176,"call"],
+$isEH:true},
+SLX:{
+"^":"Xs:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 ze:{
-"^":"a;k8>,Mm,Ve"},
+"^":"a;k8>,tA,MC"},
 DT:{
-"^":"vy;kr?,dH,F3<,z7E,QO?,Me?,mj?,my,dv,kC,N1,aV,Xl",
-gN1:function(){return this.N1},
+"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
 if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
 z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.N1).MW.setAttribute("ref",z)
-this.MQ()
+J.Vs(this.KB).dA.setAttribute("ref",z)
+this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.kW(y.mD,M.aR(y.N1,"ref"),M.fg(c))
+J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
 return c},
-Cm:function(a){var z=this.F3
-if(z!=null)z.z9()
-if(a.EI==null&&a.YI==null&&a.Lx==null){z=this.F3
+KI:function(a){var z=this.kr
+if(z!=null)z.UP()
+if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
-this.F3=null}return}z=this.F3
+this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.F3=z}z.Bq(a,this.kr)
-J.ZW($.ik(),this.N1,["ref"],!0)
-return this.F3},
-ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.dH
-z=this.kC
-if(z==null){z=this.gyT()
-z=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
-this.kC=z}y=J.RE(z)
-if(y.glb(z)==null)return $.zl()
-x=c==null?$.DH():c
-w=x.DP
+this.kr=z}z.FE(a,this.Qk)
+J.ZW($.ik(),this.KB,["ref"],!0)
+return this.kr},
+v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+if(c==null)c=this.Rc
+z=this.XA
+if(z==null){z=this.gPI()
+z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+this.XA=z}y=J.RE(z)
+if(y.gNL(z)==null)return $.zl()
+x=c==null?$.Bu():c
+w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
-x.DP=w}v=w.t(0,z)
+x.oe=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
-x.DP.u(0,z,v)}w=this.my
-if(w==null){u=J.Do(this.N1)
-w=$.tF()
+x.oe.u(0,z,v)}w=this.dK
+if(w==null){u=J.lu(this.KB)
+w=$.Ou()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
-M.Uk(t)
-w.u(0,u,t)}this.my=t
+M.AL(t)
+w.u(0,u,t)}this.dK=t
 w=t}s=J.bs(w)
 w=[]
 r=new M.Fi(w,null,null,null)
-q=$.FC()
-r.Cv=this.N1
-r.j6=z
+q=$.Tn()
+r.fQ=this.KB
+r.cA=z
 q.u(0,s,r)
 p=new M.ze(b,null,null)
-M.SB(s).sXl(p)
-for(o=y.glb(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+M.Xi(s).sqL(p)
+for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.JW(n):null
-k=M.S0(o,s,this.my,l,b,c,w,null)
-M.SB(k).sXl(p)
-if(m)r.he=k}p.Mm=s.firstChild
-p.Ve=s.lastChild
-r.j6=null
-r.Cv=null
+k=M.S0(o,s,this.dK,l,b,c,w,null)
+M.Xi(k).sqL(p)
+if(m)r.yi=k}p.tA=s.firstChild
+p.MC=s.lastChild
+r.cA=null
+r.fQ=null
 return s},
-gk8:function(a){return this.kr},
-gA0:function(a){return this.dH},
+gk8:function(a){return this.Qk},
+gA0:function(a){return this.Rc},
 sA0:function(a,b){var z
-if(this.dH!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.dH=b
-this.dv=null
-z=this.F3
-if(z!=null){z.vJ=!1
-z.DO=null
-z.Fy=null}},
-MQ:function(){var z,y
-if(this.F3!=null){z=this.kC
-y=this.gyT()
-y=J.Xu(!!J.x(y).$isvy?y:M.SB(y))
+if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
+this.Rc=b
+this.Fe=null
+z=this.kr
+if(z!=null){z.z1=!1
+z.iz=null
+z.Mv=null}},
+NB:function(){var z,y
+if(this.kr!=null){z=this.XA
+y=this.gPI()
+y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
-this.kC=null
-this.F3.HV(null)
-this.F3.xY(null)},
+this.XA=null
+this.kr.Oo(null)
+this.kr.OP(null)},
 V1:function(a){var z,y
-this.kr=null
-this.dH=null
+this.Qk=null
+this.Rc=null
 if(this.gCd(this)!=null){z=this.gCd(this).Rz(0,"ref")
-if(z!=null)z.xO(0)}this.kC=null
-y=this.F3
+if(z!=null)z.xO(0)}this.XA=null
+y=this.kr
 if(y==null)return
-y.HV(null)
-this.F3.xO(0)
-this.F3=null},
-gyT:function(){var z,y
-this.wo()
-z=M.cS(this.N1,J.Vs(this.N1).MW.getAttribute("ref"))
-if(z==null){z=this.QO
-if(z==null)return this.N1}y=M.SB(z).gyT()
+y.Oo(null)
+this.kr.xO(0)
+this.kr=null},
+gPI:function(){var z,y
+this.xk()
+z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+if(z==null){z=this.Gw
+if(z==null)return this.KB}y=M.Xi(z).gPI()
 return y!=null?y:z},
-gq1:function(a){var z
-this.wo()
-z=this.Me
-return z!=null?z:H.Go(this.N1,"$isfX").content},
-wh:function(a){var z,y,x,w,v,u,t
-if(this.mj===!0)return!1
+grz:function(a){var z
+this.xk()
+z=this.Yz
+return z!=null?z:H.Go(this.KB,"$isfX").content},
+cl:function(a){var z,y,x,w,v,u,t
+if(this.CS===!0)return!1
 M.oR()
 M.hb()
-this.mj=!0
-z=!!J.x(this.N1).$isfX
+this.CS=!0
+z=!!J.x(this.KB).$isfX
 y=!z
-if(y){x=this.N1
+if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.N1)
-v=!!J.x(v).$isvy?v:M.SB(v)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isfX
-u=!0}else{x=this.N1
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.KB)
+v=!!J.x(v).$isvy?v:M.Xi(v)
+v.sCS(!0)
+z=!!J.x(v.gKB()).$isfX
+u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.N1
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(x).insertBefore(t,x)
+t=w.gJ8(x).createElement("template",null)
+w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$isvy?t:M.SB(t)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isfX}else{v=this
+v=!!J.x(t).$isvy?t:M.Xi(t)
+v.sCS(!0)
+z=!!J.x(v.gKB()).$isfX}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sMe(J.bs(M.TA(v.gN1())))
-if(a!=null)v.sQO(a)
-else if(y)M.O1(v,this.N1,u)
-else M.GM(J.Xu(v))
+u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
+if(a!=null)v.sGw(a)
+else if(y)M.O1(v,this.KB,u)
+else M.W1(J.f5(v))
 return!0},
-wo:function(){return this.wh(null)},
+xk:function(){return this.cl(null)},
 $isDT:true,
 static:{"^":"mn,v2,YO,vU,xV,joK",TA:function(a){var z,y,x,w
-z=J.Do(a)
+z=J.lu(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},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
-z.gBy(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
+y=z.gJ8(a).createElement("template",null)
+z.gAd(a).insertBefore(y,a)
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
 break
 case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
+v=z.gQg(a).dA
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.Xu(a)
+z=J.f5(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.glb(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},W1:function(a){var z,y
 z=new M.yi()
-y=J.MK(a,$.Ze())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
 if($.xV===!0)return
 $.xV=!0
 z=document.createElement("template",null)
 if(!!J.x(z).$isfX){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.Uk(y)}},Uk:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
+if(J.m5(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
+J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-J.Vs(z.N1).MW.setAttribute("ref",a)
-z.MQ()},"$1",null,2,0,null,224,"call"],
+J.Vs(z.KB).dA.setAttribute("ref",a)
+z.NB()},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 yi:{
-"^":"Xs:20;",
-$1:function(a){if(!M.SB(a).wh(null))M.GM(J.Xu(!!J.x(a).$isvy?a:M.SB(a)))},
+"^":"Xs:19;",
+$1:function(a){if(!M.Xi(a).cl(null))M.W1(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
 $isEH:true},
-DOe:{
-"^":"Xs:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,189,"call"],
+YJG:{
+"^":"Xs:12;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,135,"call"],
+$isEH:true},
+lPa:{
+"^":"Xs:81;",
+$2:[function(a,b){var z
+for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,179,13,"call"],
 $isEH:true},
 Ufa:{
-"^":"Xs:80;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).MQ()},"$2",null,4,0,null,176,14,"call"],
-$isEH:true},
-Raa:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.FC().u(0,z,new M.Fi([],null,null,null))
+$.Tn().u(0,z,new M.Fi([],null,null,null))
 return z},
 $isEH:true},
 Fi:{
-"^":"a;mD<,he<,Cv<,j6<"},
-hg:{
-"^":"Xs:13;a,b,c",
+"^":"a;dn<,yi<,fQ<,cA<"},
+iT:{
+"^":"Xs:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
-NWj:{
-"^":"Xs:80;a,b,c,d",
+fE:{
+"^":"Xs:81;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.nk(a,this.b,this.c))
+y=S.j9(b,M.H4o(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -20073,182 +20534,182 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;e9,q5,d8,h5,Ag,DM,Qx,Yq,xS,C8,k0,IY,vJ,DO,Fy",
-Mv:function(a){return this.DO.$1(a)},
+"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,RS,Gi,Sd,lH,AB,z1,iz,Mv",
+ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.Qx},
-z9:function(){var z,y
-z=this.DM
+gP:function(a){return this.h6},
+UP:function(){var z,y
+z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
-this.DM=null}z=this.Qx
+this.Up=null}z=this.h6
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
-this.Qx=null}},
-Bq:function(a,b){var z,y,x
-this.z9()
-z=this.e9.N1
-y=a.EI
+this.h6=null}},
+FE:function(a,b){var z,y,x
+this.UP()
+z=this.yQ.KB
+y=a.Z0
 x=y!=null
-this.Yq=x
-this.xS=a.Lx!=null
-if(x){this.C8=y.wD
-y=M.oO("if",y,z,b)
-this.DM=y
-if(this.C8===!0){if(!(null!=y&&!1!==y)){this.xY(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gAJ())}if(this.xS===!0){y=a.Lx
-this.k0=y.wD
-y=M.oO("repeat",y,z,b)
-this.Qx=y}else{y=a.YI
-this.k0=y.wD
-y=M.oO("bind",y,z,b)
-this.Qx=y}if(this.k0!==!0)J.mu(y,this.gAJ())
-this.xY(null)},
-xY:[function(a){var z,y
-if(this.Yq===!0){z=this.DM
-if(this.C8!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.HV([])
-return}}y=this.Qx
-if(this.k0!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.HV(this.xS!==!0?[y]:y)},"$1","gAJ",2,0,20,14],
-HV:function(a){var z,y
+this.RS=x
+this.Gi=a.vJ!=null
+if(x){this.Sd=y.au
+y=M.uF("if",y,z,b)
+this.Up=y
+if(this.Sd===!0){if(!(null!=y&&!1!==y)){this.OP(null)
+return}}else H.Go(y,"$isAp").TR(0,this.gVN())}if(this.Gi===!0){y=a.vJ
+this.lH=y.au
+y=M.uF("repeat",y,z,b)
+this.h6=y}else{y=a.lC
+this.lH=y.au
+y=M.uF("bind",y,z,b)
+this.h6=y}if(this.lH!==!0)J.mu(y,this.gVN())
+this.OP(null)},
+OP:[function(a){var z,y
+if(this.RS===!0){z=this.Up
+if(this.Sd!==!0){H.Go(z,"$isAp")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
+return}}y=this.h6
+if(this.lH!==!0){H.Go(y,"$isAp")
+y=y.gP(y)}this.Oo(this.Gi!==!0?[y]:y)},"$1","gVN",2,0,19,13],
+Oo:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.d8
+z=this.nH
 if(a===z)return
-this.R5()
-this.h5=a
-if(!!J.x(a).$iswn&&this.xS===!0&&this.k0!==!0){if(a.gb3()!=null)a.sb3([])
-this.IY=a.gQV().yI(this.gLH())}y=this.h5
+this.ud()
+this.dO=a
+if(!!J.x(a).$iswn&&this.Gi===!0&&this.lH!==!0){if(a.glr()!=null)a.slr([])
+this.AB=a.gXF().yI(this.gSp())}y=this.dO
 y=y!=null?y:[]
-this.lC(G.jj(y,0,J.q8(y),z,0,z.length))},
-Yg:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.e9.N1
-z=$.FC()
-y=this.q5
+this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
+Dk:function(a){var z,y,x,w
+if(J.xC(a,-1))return this.yQ.KB
+z=$.Tn()
+y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).ghe()
-if(x==null)return this.Yg(a-1)
-if(!M.CF(x)||x===this.e9.N1)return x
-w=M.SB(x).gF3()
+x=z.t(0,y[a]).gyi()
+if(x==null)return this.Dk(a-1)
+if(!M.CF(x)||x===this.yQ.KB)return x
+w=M.Xi(x).gkr()
 if(w==null)return x
-return w.Yg(w.q5.length-1)},
-nV:function(a){var z,y,x,w,v,u,t
-z=this.Yg(J.Hn(a,1))
-y=this.Yg(a)
-J.TmB(this.e9.N1)
-x=C.Nm.W4(this.q5,a)
+return w.Dk(w.tM.length-1)},
+C8:function(a){var z,y,x,w,v,u,t
+z=this.Dk(J.Hn(a,1))
+y=this.Dk(a)
+J.cP(this.yQ.KB)
+x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-lC:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.Ag||J.FN(a)===!0)return
-u=this.e9
-t=u.N1
-if(J.TmB(t)==null){this.xO(0)
-return}s=this.d8
-Q.Y5(s,this.h5,a)
-z=u.dH
-if(!this.vJ){this.vJ=!0
-r=J.qy(!!J.x(u.N1).$isDT?u.N1:u)
-if(r!=null){this.DO=r.Mn.A5(t)
-this.Fy=null}}q=P.YM(P.N3R(),null,null,null,null)
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.vx||J.FN(a)===!0)return
+u=this.yQ
+t=u.KB
+if(J.cP(t)==null){this.xO(0)
+return}s=this.nH
+Q.Y5(s,this.dO,a)
+z=u.Rc
+if(!this.z1){this.z1=!0
+r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.Mn.CE(t)
+this.Mv=null}}q=P.YM(P.Bx(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.nV(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
+i=this.C8(J.WB(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
 n-=l}for(p=p.gA(a);p.G();){m=p.gl()
 for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
-if(x==null)try{if(this.DO!=null)y=this.Mv(y)
+if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
+else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
 w=l
-v=new H.XO(g,null)
+v=new H.oP(g,null)
 l=new P.Gc(0,$.X3,null,null,null,null,null,null)
 l.$builtinTypeInfo=[null]
 new P.Zf(l).$builtinTypeInfo=[null]
 k=w
 if(k==null)H.vh(P.u("Error must not be null"))
-if(l.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
+if(l.YM!==0)H.vh(P.w("Future already completed"))
+l.Nk(k,v)
 x=$.zl()}l=x
-f=this.Yg(h-1)
-e=J.TmB(u.N1)
-C.Nm.xe(this.q5,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.u3(u,0),H.u3(u,1)]);u.G();)this.PY(u.lo)},"$1","gLH",2,0,225,226],
-PY:[function(a){var z,y
-z=$.FC()
+f=this.Dk(h-1)
+e=J.cP(u.KB)
+C.Nm.xe(this.tM,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,227,228],
+vB:[function(a){var z,y
+z=$.Tn()
 z.toString
-y=H.of(a,"expando$values")
-for(z=J.mY((y==null?null:H.of(y,z.J4())).gmD());z.G();)J.yd(z.gl())},"$1","gvi",2,0,227],
-R5:function(){var z=this.IY
+y=H.vA(a,"expando$values")
+for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,229],
+ud:function(){var z=this.AB
 if(z==null)return
-z.ed()
-this.IY=null},
+z.Gv()
+this.AB=null},
 xO:function(a){var z
-if(this.Ag)return
-this.R5()
-z=this.q5
-H.bQ(z,this.gvi())
+if(this.vx)return
+this.ud()
+z=this.tM
+H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.z9()
-this.e9.F3=null
-this.Ag=!0}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+this.UP()
+this.yQ.kr=null
+this.vx=!0}}}],["","",,S,{
 "^":"",
-jb:{
-"^":"a;iB,wD<,UV",
-gqz:function(){return this.iB.length===5},
+VH2:{
+"^":"a;jG,au<,Ke",
+gqz:function(){return this.jG.length===5},
 gaW:function(){var z,y
-z=this.iB
+z=this.jG
 y=z.length
 if(y===5){if(0>=y)return H.e(z,0)
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gEO:function(){return this.UV},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-U0:function(a){var z,y
-z=this.iB
+gPf:function(){return this.Ke},
+qm:function(a){return this.gPf().$1(a)},
+gB:function(a){return C.jn.BU(this.jG.length,4)},
+AX:function(a){var z,y
+z=this.jG
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 Pn:function(a){var z,y
-z=this.iB
+z=this.jG
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-HH:function(a){var z,y
-z=this.iB
+qJ:function(a){var z,y
+z=this.jG
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-ln:[function(a){var z,y,x,w
+xTd:[function(a){var z,y,x,w
 if(a==null)a=""
-z=this.iB
+z=this.jG
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 x=z.length
-w=C.jn.cU(x,4)*4
+w=C.jn.BU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,228,21],
-eF:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
+return y+H.d(z[w])},"$1","gSG",2,0,230,20],
+QY:[function(a){var z,y,x,w,v,u,t,s
+z=this.jG
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
+x=C.jn.BU(z.length,4)
 for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
+if(u!=null)y.IN+=typeof u==="string"?u:H.d(u);++v
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,229,230],
-nH:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
+y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,231,232],
+l3:function(a,b){this.Ke=this.jG.length===5?this.gSG():this.gYF()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
@@ -20272,53 +20733,53 @@
 else w.push(null)
 w.push(m)
 v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.nH(w,u)
-return y}}}}],["tracer","package:observatory/tracer.dart",,Z,{
+y=new S.VH2(w,u,null)
+y.l3(w,u)
+return y}}}}],["","",,Z,{
 "^":"",
 d8:function(a){var z,y
 z=J.x(a)
 if(!!z.$isT8){y=P.Fl(null,null)
-z.aN(a,new Z.WJ(y))
+z.aN(a,new Z.mZ(y))
 return y}else if(!!z.$isWO){y=[]
-z.aN(a,new Z.Jh(y))
+z.aN(a,new Z.WJ(y))
 return y}else return a},
-WJ:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,a,Z.d8(b))},
+mZ:{
+"^":"Xs:81;a",
+$2:[function(a,b){this.a.u(0,a,Z.d8(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-Jh:{
-"^":"Xs:13;b",
+WJ:{
+"^":"Xs:12;b",
 $1:function(a){this.b.push(Z.d8(a))},
 $isEH:true},
 lX:{
-"^":"a;Nu,G1>,Ir*",
-gee:function(a){return"T+"+H.d(this.Nu)+"us"},
-bu:[function(a){return"["+("T+"+H.d(this.Nu)+"us")+"] "+H.d(this.G1)},"$0","gAY",0,0,71],
+"^":"a;NP,G1>,Ir*",
+gee:function(a){return"T+"+H.d(this.NP)+"us"},
+bu:[function(a){return"["+("T+"+H.d(this.NP)+"us")+"] "+H.d(this.G1)},"$0","gCR",0,0,73],
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,Nu,Rk*,ro,dUC,U3",
-ed:function(){this.RV.ed()},
-AS:[function(a,b,c){var z,y
-z=this.Nu
-y=new Z.lX(C.CD.Z(z.giU()*1000000,z.dI),b,null)
-y.Ir=Z.d8(c)
-J.bi(this.Rk,y)
-return y},function(a,b){return this.AS(a,b,null)},"wn","$2$map","$1","gtN",2,3,231,23,79,201],
-l8:function(){var z=new P.VV(1000000,null,null)
-this.Nu=z
+"^":"d3;RV,NP,Rk*,ro,XY,cU",
+Gv:function(){this.RV.Gv()},
+ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+z.Ir=Z.d8(c)
+J.bi(this.Rk,z)
+return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,233,22,234,202],
+l8:function(){var z=new P.VV(null,null)
+H.Xe()
+$.Ji=$.xG
+this.NP=z
 z.wE(0)
 this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
-this.Nu.CH(0)
+this.NP.CH(0)
 J.Z8(this.Rk)},
 static:{"^":"ax",NY:function(){var z=new Z.KZ(null,null,Q.ch(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
 Ym:{
-"^":"Xs:163;a",
-$1:[function(a){this.a.wn(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,162,"call"],
-$isEH:true}}],["utf.list_range","package:utf/src/list_range.dart",,G,{
+"^":"Xs:167;a",
+$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,166,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 pe:{
 "^":"mW;f9,D1,fO",
@@ -20326,37 +20787,37 @@
 z=this.D1
 y=this.fO
 if(typeof y!=="number")return H.s(y)
-return new G.ay(this.f9,z-1,z+y)},
+return new G.vZG(this.f9,z-1,z+y)},
 gB:function(a){return this.fO},
 a0:function(a,b,c){var z,y,x
 z=this.D1
-if(z>this.f9.iN.length)throw H.b(P.N(z))
+if(z>this.f9.Bx.length)throw H.b(P.N(z))
 y=this.fO
 if(y!=null){if(typeof y!=="number")return y.C()
 x=y<0}else x=!1
 if(x)throw H.b(P.N(y))
 if(typeof y!=="number")return y.g()
 z=y+z
-if(z>this.f9.iN.length)throw H.b(P.N(z))},
+if(z>this.f9.Bx.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-ay:{
-"^":"a;f9,D1,HM",
-gl:function(){return C.xB.j(this.f9.iN,this.D1)},
-G:function(){return++this.D1<this.HM},
-eR:function(a,b){this.D1+=b}}}],["utf.utf_16_code_unit_decoder","package:utf/src/utf_16_code_unit_decoder.dart",,Z,{
+vZG:{
+"^":"a;f9,D1,c0",
+gl:function(){return C.xB.j(this.f9.Bx,this.D1)},
+G:function(){return++this.D1<this.c0},
+eR:function(a,b){this.D1+=b}}}],["","",,Z,{
 "^":"",
 kb:{
-"^":"a;xX,Pa,O4",
+"^":"a;aH,Rr,O4",
 gA:function(a){return this},
 gl:function(){return this.O4},
 G:function(){var z,y,x,w,v,u
 this.O4=null
-z=this.xX
+z=this.aH
 y=++z.D1
-x=z.HM
+x=z.c0
 if(y>=x)return!1
-w=z.f9.iN
+w=z.f9.Bx
 v=C.xB.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
@@ -20364,15 +20825,15 @@
 else if(v<56320&&++z.D1<x){u=C.xB.j(w,z.D1)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
 else{if(u>=55296&&u<56320)--z.D1
-this.O4=this.Pa}}else this.O4=this.Pa
-return!0}}}],["utf.util","package:utf/src/util.dart",,U,{
+this.O4=this.Rr}}else this.O4=this.Rr
+return!0}}}],["","",,U,{
 "^":"",
-Fa:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.iN.length-b
+dZr:function(a,b,c,d){var z,y,x,w,v,u,t
+z=a.Bx.length-b
 new G.pe(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.ay(a,y,z),d,null)
+x=new Z.kb(new G.vZG(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -20382,83 +20843,83 @@
 z.fixed$length=init
 t=H.VM(z,[P.KN])
 H.qG(t,0,v,w,0)
-return t}}}],["vm_connect_element","package:observatory/src/elements/vm_connect.dart",,V,{
+return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V56;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gN:function(a){return a.P5},
-sN:function(a,b){a.P5=this.ct(a,C.ft,a.P5,b)},
-ghS:function(a){var z=a.P5
+"^":"V59;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gN:function(a){return a.GG},
+sN:function(a,b){a.GG=this.ct(a,C.ft,a.GG,b)},
+ghS:function(a){var z=a.GG
 if(z==null)return!1
 return z.gA9()},
-gnI:function(a){var z=$.Kh.Eh
+gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
-return J.xC(H.Go(z,"$isKM").N,a.P5)},
-f8D:[function(a,b,c,d){var z,y,x,w
+return J.xC(H.Go(z,"$isKM").N,a.GG)},
+xX:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gpL(b)
+y=z.gEV(b)
 if(typeof y!=="number")return y.D()
 if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
 z.e6(b)
-x=$.Kh.Eh
-if(x==null||!J.xC(J.l2(x),a.P5)){z=$.Kh
-y=a.P5
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=$.Kh.Nv
+if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
+y=a.GG
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
-z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,164,2,105,179],
-MeB:[function(a,b,c,d){var z,y,x,w
+z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,168,87,106,182],
+Fh:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
-y=a.P5
+y=a.GG
 x=z.bq
 x.Rz(0,y)
-z.XT()
-z.XT()
-w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gaE",6,0,164,2,105,179],
+z.TV()
+z.TV()
+w=z.wo.IU+".history"
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gFb",6,0,168,87,106,182],
 static:{fXx:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.J57.ZL(a)
+a.n9=x
+a.wy=w
+C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V56:{
+V59:{
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V57;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V60;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
 gHL:function(a){return a.YE},
 sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
-gFK:function(a){return a.lr},
-sFK:function(a,b){a.lr=this.ct(a,C.am,a.lr,b)},
-yY:function(a){this.Vf(a)},
-Kl:function(a,b){if(J.co(b,"ws://"))return b
+gFK:function(a){return a.E6},
+sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
+yY:function(a){this.iW(a)},
+VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
-HN:[function(a,b,c,d){var z,y,x
+ny:[function(a,b,c,d){var z,y,x
 J.Kr(b)
-z=this.Kl(a,a.ot)
+z=this.VP(a,a.ot)
 d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,114,1,105,106],
-WU:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,114,1,105,106],
-Vf:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
-U2:function(a){var z=P.ii(0,0,0,0,0,1)
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,115,2,106,107],
+jLH:[function(a,b,c,d){J.Kr(b)
+this.iW(a)},"$3","gzG",6,0,115,2,106,107],
+iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
 static:{NI:function(a){var z,y,x,w,v
 z=Q.ch(null,L.Z5)
@@ -20469,26 +20930,26 @@
 v=P.Fl(null,null)
 a.ot=""
 a.YE="localhost:9222"
-a.lr=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.E6=z
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.hj.ZL(a)
-C.hj.XI(a)
-C.hj.U2(a)
+a.n9=w
+a.wy=v
+C.aXh.LX(a)
+C.aXh.XI(a)
+C.aXh.Kq(a)
 return a}}},
-V57:{
+V60:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.Z8(z.lr)
+J.Z8(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -20496,15 +20957,15 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,232,"call"],
+J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,235,"call"],
 $isEH:true},
 oU:{
-"^":"Xs:13;b",
-$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,1,"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+"^":"Xs:12;b",
+$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{yC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -20512,272 +20973,359 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.vA.ZL(a)
-C.vA.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+a.n9=x
+a.wy=w
+C.V8.LX(a)
+C.V8.XI(a)
+return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V58;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V61;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,19,102],
 static:{oH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Hd.ZL(a)
+a.n9=x
+a.wy=w
+C.Hd.LX(a)
 C.Hd.XI(a)
 return a}}},
-V58:{
+V61:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.KN.$isKN=true
-P.KN.$isfRn=true
-P.KN.$asfRn=[P.FK]
-P.KN.$isa=true
-P.Vf.$isVf=true
-P.Vf.$isfRn=true
-P.Vf.$asfRn=[P.FK]
-P.Vf.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-P.qU.$isqU=true
-P.qU.$isfRn=true
-P.qU.$asfRn=[P.qU]
-P.qU.$isa=true
-W.QI.$isa=true
-P.FK.$isfRn=true
-P.FK.$asfRn=[P.FK]
-P.FK.$isa=true
-N.qV.$isfRn=true
-N.qV.$asfRn=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isfRn=true
-P.a6.$asfRn=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.ns.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$isIp=true
-U.mc.$isa=true
-U.cJ.$isIp=true
-U.cJ.$isa=true
-U.uku.$isIp=true
-U.uku.$isa=true
-U.elO.$iselO=true
-U.elO.$isIp=true
-U.elO.$isa=true
-U.ae.$isIp=true
-U.ae.$isa=true
-U.Mm.$isIp=true
-U.Mm.$isa=true
-U.c0.$isIp=true
-U.c0.$isa=true
-U.Dv.$isIp=true
-U.Dv.$isa=true
-U.RWc.$isIp=true
-U.RWc.$isa=true
-U.zX.$iszX=true
-U.zX.$isIp=true
-U.zX.$isa=true
-U.rX.$isIp=true
-U.rX.$isa=true
-U.EO.$isEO=true
-U.EO.$isIp=true
-U.EO.$isa=true
-P.IN.$isIN=true
-P.IN.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.TJ.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-L.U2.$isU2=true
-L.U2.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isT8=true
-D.vO.$asT8=[null,null]
-D.vO.$isa=true
-D.Kp.$isaf=true
-D.Kp.$isa=true
-D.Q4.$isa=true
-D.Db.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-G.DA.$isDA=true
-G.DA.$isyj=true
-G.DA.$isa=true
-W.BI.$isea=true
-W.BI.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-W.Hy.$isHy=true
-W.Hy.$isea=true
-W.Hy.$isa=true
-P.Jb.$isQV=true
-P.Jb.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-D.Z9.$isa=true
-W.fJ.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.D5.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-G.OS.$isa=true
-D.Mk.$isMk=true
-D.Mk.$isaf=true
-D.Mk.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-Z.lX.$islX=true
-Z.lX.$isa=true
-P.A5.$isa=true
-W.PGY.$isea=true
-W.PGY.$isa=true
-L.Zl.$isZl=true
-L.Zl.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$ishsw=true
-W.I0.$isKV=true
-W.I0.$isa=true
-Y.qS.$isa=true
-U.Ip.$isIp=true
-U.Ip.$isa=true
-P.yX.$isyX=true
-P.yX.$isa=true
-L.Z5.$isZ5=true
-L.Z5.$isa=true
-G.Ni.$isa=true
-V.qC.$isqC=true
-V.qC.$isT8=true
-V.qC.$isa=true
-P.BpP.$isBpP=true
-P.BpP.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isyX=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isyX=true
-P.LR.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.JBS.$isJBS=true
-P.JBS.$isa=true
-P.fRn.$isfRn=true
-P.fRn.$isa=true
-P.aYy.$isaYy=true
-P.aYy.$isa=true
-P.T8.$isT8=true
-P.T8.$isa=true
-P.kWp.$iskWp=true
-P.kWp.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.wS.$iswS=true
-P.wS.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.fIm.$isfIm=true
-P.fIm.$isa=true
-P.iP.$isiP=true
-P.iP.$isfRn=true
-P.iP.$asfRn=[null]
-P.iP.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.wv.$iswv=true
-D.wv.$isaf=true
-D.wv.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.lg.$islg=true
-L.lg.$isAp=true
-L.lg.$isa=true
-W.hsw.$ishsw=true
-W.hsw.$isKV=true
-W.hsw.$isa=true
+;(function(){var z=!0,y
+y=P.KN
+y.$isKN=z
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=P.Vf
+y.$isVf=z
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=W.KV
+y.$isKV=z
+y.$isa=z
+W.vKL.$isa=z
+y=P.qU
+y.$isqU=z
+y.$isfRn=z
+y.$asfRn=[P.qU]
+y.$isa=z
+W.QI.$isa=z
+y=P.FK
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=N.qV
+y.$isfRn=z
+y.$asfRn=[N.qV]
+y.$isa=z
+y=P.a6
+y.$isa6=z
+y.$isfRn=z
+y.$asfRn=[P.a6]
+y.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.ns.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=A.Ap
+y.$isAp=z
+y.$isa=z
+y=K.Aep
+y.$isAep=z
+y.$isa=z
+y=U.Dc
+y.$isIp=z
+y.$isa=z
+y=U.FH
+y.$isIp=z
+y.$isa=z
+y=U.uku
+y.$isIp=z
+y.$isa=z
+y=U.fp
+y.$isfp=z
+y.$isIp=z
+y.$isa=z
+y=U.nu
+y.$isIp=z
+y.$isa=z
+y=U.Mm
+y.$isIp=z
+y.$isa=z
+y=U.c0
+y.$isIp=z
+y.$isa=z
+y=U.noG
+y.$isIp=z
+y.$isa=z
+y=U.RWc
+y.$isIp=z
+y.$isa=z
+y=U.vn
+y.$isvn=z
+y.$isIp=z
+y.$isa=z
+y=U.x9
+y.$isIp=z
+y.$isa=z
+y=U.EO
+y.$isEO=z
+y.$isIp=z
+y.$isa=z
+y=P.IN
+y.$isIN=z
+y.$isa=z
+y=P.uq
+y.$isuq=z
+y.$isa=z
+N.TJ.$isa=z
+y=T.yj
+y.$isyj=z
+y.$isa=z
+y=W.tV
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=L.U2
+y.$isU2=z
+y.$isa=z
+y=D.af
+y.$isaf=z
+y.$isa=z
+y=D.bv
+y.$isaf=z
+y.$isa=z
+D.Fc.$isa=z
+D.ER.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isT8=z
+y.$asT8=[null,null]
+y.$isa=z
+y=D.Kp
+y.$isaf=z
+y.$isa=z
+y=D.dy
+y.$isdy=z
+y.$isaf=z
+y.$isa=z
+D.Q4.$isa=z
+D.Db.$isa=z
+y=D.U4
+y.$isaf=z
+y.$isa=z
+y=D.vx
+y.$isvx=z
+y.$isaf=z
+y.$isa=z
+D.c2.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+y=W.BI
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Ol
+y.$isQV=z
+y.$isa=z
+y=P.a2
+y.$isa2=z
+y.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+D.Z9.$isa=z
+W.fJ.$isa=z
+y=G.Y2
+y.$isY2=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.So.$isa=z
+y=W.AjY
+y.$isAjY=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=W.PF
+y.$isPF=z
+y.$isea=z
+y.$isa=z
+y=Z.lX
+y.$islX=z
+y.$isa=z
+P.A0.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Zl
+y.$isZl=z
+y.$isa=z
+K.GK.$isa=z
+y=N.HV
+y.$isHV=z
+y.$isa=z
+H.yo.$isa=z
+H.IY.$isa=z
+H.aX.$isa=z
+y=W.I0
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z
+Y.qS.$isa=z
+y=U.Ip
+y.$isIp=z
+y.$isa=z
+y=P.yX
+y.$isyX=z
+y.$isa=z
+y=L.Z5
+y.$isZ5=z
+y.$isa=z
+G.Ni.$isa=z
+y=V.qC
+y.$isqC=z
+y.$isT8=z
+y.$isa=z
+y=P.BpP
+y.$isBpP=z
+y.$isa=z
+y=P.V2
+y.$isV2=z
+y.$isa=z
+y=P.KA
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.LR
+y.$isLR=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
+y=P.fRn
+y.$isfRn=z
+y.$isa=z
+y=P.n7
+y.$isn7=z
+y.$isa=z
+y=P.T8
+y.$isT8=z
+y.$isa=z
+y=P.kWp
+y.$iskWp=z
+y.$isa=z
+y=P.QV
+y.$isQV=z
+y.$isa=z
+y=P.EH
+y.$isEH=z
+y.$isa=z
+y=P.wS
+y.$iswS=z
+y.$isa=z
+y=P.b8
+y.$isb8=z
+y.$isa=z
+y=P.NOT
+y.$isNOT=z
+y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=P.iP
+y.$isiP=z
+y.$isfRn=z
+y.$asfRn=[null]
+y.$isa=z
+y=O.Hz
+y.$isHz=z
+y.$isa=z
+y=D.wv
+y.$iswv=z
+y.$isaf=z
+y.$isa=z
+y=D.N7
+y.$isN7=z
+y.$isaf=z
+y.$isa=z
+y=D.EP
+y.$isEP=z
+y.$isaf=z
+y.$isa=z
+y=A.ES
+y.$isES=z
+y.$isa=z
+y=A.rv
+y.$isrv=z
+y.$isa=z
+y=L.lg
+y.$islg=z
+y.$isAp=z
+y.$isa=z
+y=W.hsw
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z})()
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -20786,13 +21334,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -20805,26 +21353,27 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.prototype
+return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
+J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
+J.AC=function(a,b){return J.RE(a).Ky(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AJ=function(a,b){return J.RE(a).sWp(a,b)}
-J.AL=function(a){return J.RE(a).gW6(a)}
 J.AR=function(a){return J.RE(a).gWt(a)}
+J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.As=function(a){return J.Wx(a).gVz(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
@@ -20832,104 +21381,116 @@
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
+J.Bo=function(a){return J.RE(a).gIt(a)}
+J.Bq=function(a){return J.RE(a).gLe(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
 J.C7=function(a){return J.RE(a).gLc(a)}
-J.CA=function(a,b){return J.RE(a).sLC(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
+J.Cs=function(a){return J.RE(a).gyg(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
 J.D4=function(a,b){return J.RE(a).sA0(a,b)}
-J.DB=function(a){return J.RE(a).gn0(a)}
+J.D8=function(a){return J.RE(a).gl6(a)}
+J.DA=function(a){return J.RE(a).goc(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DR=function(a){return J.RE(a).gEE(a)}
-J.Do=function(a){return J.RE(a).gM0(a)}
+J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
+J.Dv=function(a){return J.Wx(a).zQ(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
+J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
+J.EMK=function(a){return J.RE(a).gV5(a)}
 J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
-J.FH=function(a,b){return J.RE(a).sVX(a,b)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FS=function(a){return J.RE(a).gwp(a)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.G9=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
+J.GF=function(a){return J.RE(a).gz2(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
-J.GL=function(a){return J.RE(a).gfN(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
 J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H1=function(a){return J.RE(a).gLe(a)}
+J.H2=function(a){return J.RE(a).gYi(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
 J.HP=function(a){return J.RE(a).gFK(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
-J.Ha=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Hg=function(a){return J.RE(a).gYe(a)}
-J.Hh=function(a){return J.Wx(a).yu(a)}
+J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
+J.Ho=function(a){return J.RE(a).WJ(a)}
+J.Hy=function(a){return J.RE(a).gZp(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.IA=function(a){return J.RE(a).gjT(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
+J.IR=function(a){return J.RE(a).gkZ(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Ii=function(a){return J.rY(a).gYC(a)}
-J.Ir=function(a){return J.RE(a).ghf(a)}
+J.Ir=function(a){return J.RE(a).gyK(a)}
 J.It=function(a,b){return J.rY(a).Fr(a,b)}
 J.Iw=function(a,b){return J.RE(a).sFL(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J0=function(a,b){return J.RE(a).sR1(a,b)}
-J.J1=function(a){return J.RE(a).PJ(a)}
+J.J1=function(a,b){return J.RE(a).rW(a,b)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
-J.J7=function(a){return J.RE(a).gCt(a)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JG=function(a){return J.RE(a).gHn(a)}
-J.JR=function(a){return J.RE(a).gcK(a)}
+J.JG=function(a,b){return J.RE(a).si0(a,b)}
+J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a){return J.RE(a).gWA(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
 J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a){return J.RE(a).gGV(a)}
+J.Jv=function(a){return J.RE(a).gzG(a)}
 J.K0=function(a){return J.RE(a).gd4(a)}
 J.K2=function(a){return J.RE(a).gtN(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
 J.KG=function(a){return J.RE(a).guz(a)}
+J.KL=function(a){return J.RE(a).gtu(a)}
 J.Kd=function(a){return J.RE(a).gCF(a)}
+J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
 J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.L9=function(a,b){return J.RE(a).sdU(a,b)}
+J.L6=function(a){return J.RE(a).glD(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.LE=function(a){return J.RE(a).VD(a)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
-J.LL=function(a){return J.Wx(a).HG(a)}
-J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
+J.LY=function(a){return J.RE(a).gi0(a)}
+J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){return J.RE(a).gff(a)}
-J.Ln=function(a){return J.RE(a).gdU(a)}
+J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.Lm=function(a){return J.x(a).gbx(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
-J.MB=function(a){return J.RE(a).gzG(a)}
+J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
-J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MU=function(a,b){return J.RE(a).Fc(a,b)}
+J.MF=function(a,b){return J.RE(a).syK(a,b)}
+J.MI=function(a,b){return J.RE(a).sQR(a,b)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
 J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
@@ -20942,40 +21503,45 @@
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
 J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a,b){return J.RE(a).sKw(a,b)}
+J.NV=function(a){return J.RE(a).gYe(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Nb=function(a){return J.RE(a).gdH(a)}
 J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
+J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OH=function(a,b){return J.RE(a).sMZ(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
 J.OT=function(a){return J.RE(a).gXE(a)}
+J.OX=function(a){return J.rY(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P3=function(a){return J.RE(a).goL(a)}
-J.PB=function(a){return J.RE(a).gBV(a)}
+J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
+J.PB=function(a){return J.RE(a).gI(a)}
+J.PG=function(a){return J.RE(a).gEE(a)}
+J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
+J.PS=function(a){return J.x(a).gCR(a)}
+J.PW=function(a){return J.RE(a).gVb(a)}
 J.PY=function(a){return J.RE(a).goN(a)}
+J.Pc=function(a,b){return J.RE(a).yU(a,b)}
 J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.rY(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Px=function(a,b){return J.RE(a).swp(a,b)}
+J.Q0=function(a,b){return J.U6(a).OY(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(a)}
+J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.Qa=function(a){return J.RE(a).gNN(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
@@ -20984,274 +21550,273 @@
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
 J.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
+J.RM=function(a){return J.RE(a).gFY(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.Rg=function(a){return J.x(a).gAY(a)}
+J.Rb=function(a,b){return J.RE(a).sCd(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
+J.Rr=function(a){return J.RE(a).ga7(a)}
 J.Ry=function(a){return J.RE(a).gVE(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
-J.SZ=function(a){return J.RE(a).gSO(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
-J.Sk=function(a,b){return J.RE(a).Gy(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
-J.So=function(a,b){return J.RE(a).X3(a,b)}
 J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
+J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
 J.TP=function(a,b){return J.RE(a).sGV(a,b)}
 J.TY=function(a){return J.RE(a).gvp(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
 J.Tg=function(a){return J.RE(a).gCI(a)}
-J.TmB=function(a){return J.RE(a).gBy(a)}
-J.Tr=function(a){return J.RE(a).gCj(a)}
+J.Tm=function(a){return J.RE(a).grX(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
 J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U8=function(a){return J.RE(a).gEQ(a)}
+J.UA=function(a){return J.RE(a).gP2(a)}
+J.UE=function(a){return J.w1(a).git(a)}
+J.UM=function(a){return J.RE(a).gu7(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
 J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
+J.UR=function(a){return J.RE(a).Lg(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
-J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V5=function(a,b,c,d){return J.RE(a).Yb(a,b,c,d)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
+J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.rY(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.W2=function(a){return J.RE(a).gCf(a)}
-J.W3=function(a){return J.RE(a).gaE(a)}
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WM=function(a){return J.RE(a).geJ(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.We=function(a,b){return J.RE(a).X3(a,b)}
+J.Wf=function(a){return J.RE(a).D4(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
+J.XHl=function(a){return J.Wx(a).yu(a)}
 J.XJ=function(a){return J.RE(a).gRY(a)}
-J.XK=function(a){return J.x(a).gbx(a)}
+J.XP=function(a){return J.RE(a).Um(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xi=function(a){return J.RE(a).gr9(a)}
-J.Xu=function(a){return J.RE(a).gq1(a)}
+J.Y7=function(a){return J.RE(a).gLU(a)}
 J.YG=function(a){return J.RE(a).gQP(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
+J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
 J.Z8=function(a){return J.w1(a).V1(a)}
+J.ZC=function(a){return J.RE(a).gph(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
-J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
 J.ZN=function(a){return J.RE(a).gqN(a)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
+J.Zh=function(a){return J.RE(a).grJ(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
-J.Zq=function(a){return J.RE(a).glp(a)}
+J.Zp=function(a){return J.RE(a).giZ(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
 J.aT=function(a){return J.RE(a).god(a)}
-J.aW=function(a){return J.RE(a).gJp(a)}
 J.an=function(a,b){return J.RE(a).Id(a,b)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
-J.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
+J.ay=function(a){return J.RE(a).giB(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bL=function(a){return J.RE(a).ghS(a)}
-J.bN=function(a,b){return J.RE(a).GE(a,b)}
 J.bS=function(a){return J.RE(a).gUo(a)}
 J.bh=function(a){return J.RE(a).gLf(a)}
 J.bi=function(a,b){return J.w1(a).h(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.bu=function(a){return J.RE(a).gyw(a)}
+J.c7=function(a){return J.RE(a).guS(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a){return J.RE(a).RE(a)}
+J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cP=function(a){return J.RE(a).gAd(a)}
 J.cU=function(a){return J.RE(a).gHh(a)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
+J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
-J.cs=function(a){return J.RE(a).gwJ(a)}
-J.d5=function(a){return J.Wx(a).gKy(a)}
+J.dE=function(a){return J.RE(a).gGs(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.du=function(a){return J.RE(a).gUj(a)}
+J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
 J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
 J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
-J.ee=function(a){return J.RE(a).giC(a)}
-J.eg=function(a){return J.RE(a).fV(a)}
+J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
+J.f5=function(a){return J.RE(a).grz(a)}
 J.fD=function(a){return J.RE(a).geS(a)}
+J.fU=function(a){return J.RE(a).gDX(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
-J.fp=function(a){return J.RE(a).yy(a)}
+J.fv=function(a){return J.RE(a).gZ9(a)}
 J.fy=function(a){return J.RE(a).gTj(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hh=function(a,b){return J.Wx(a).Y(a,b)}
 J.hn=function(a){return J.RE(a).gEu(a)}
+J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iB=function(a){return J.RE(a).giC(a)}
 J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
-J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
+J.is=function(a,b){return J.RE(a).snZ(a,b)}
 J.ix=function(a){return J.RE(a).gnI(a)}
-J.iy=function(a){return J.RE(a).gnD(a)}
-J.j0=function(a){return J.RE(a).gO0(a)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jB=function(a){return J.RE(a).gpf(a)}
-J.jC=function(a){return J.RE(a).gSR(a)}
-J.jY=function(a){return J.RE(a).gWp(a)}
-J.jd=function(a,b){return J.RE(a).snZ(a,b)}
+J.jL=function(a){return J.RE(a).gBV(a)}
+J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
+J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.jl=function(a){return J.RE(a).gHt(a)}
-J.jx=function(a){return J.RE(a).gie(a)}
+J.jq=function(a,b){return J.RE(a).sZp(a,b)}
 J.jzo=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
-J.k0=function(a){return J.RE(a).giZ(a)}
 J.k7=function(a){return J.RE(a).gbA(a)}
+J.k9=function(a){return J.RE(a).gWL(a)}
 J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(a)}
+J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(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.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.kv=function(a){return J.RE(a).gDf(a)}
-J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lB=function(a){return J.RE(a).guT(a)}
 J.lN=function(a){return J.RE(a).gil(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.lk=function(a){return J.RE(a).gRq(a)}
 J.ls=function(a){return J.RE(a).gt3(a)}
+J.lu=function(a){return J.RE(a).gJ8(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
 J.m5=function(a){return J.RE(a).gQr(a)}
-J.m8=function(a){return J.RE(a).gR2(a)}
-J.mB=function(a,b){return J.U6(a).Mw(a,b)}
-J.mP=function(a){return J.RE(a).gzj(a)}
+J.mF=function(a){return J.RE(a).gHn(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.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
-J.mZ=function(a){return J.RE(a).gVY(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n0=function(a,b){return J.RE(a).Rf(a,b)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
+J.nN=function(a){return J.RE(a).gTt(a)}
 J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
+J.nd=function(a){return J.RE(a).gWk(a)}
+J.nq=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.nv=function(a){return J.RE(a).gLW(a)}
 J.o3=function(a,b){return J.RE(a).sjD(a,b)}
 J.o8=function(a,b){return J.RE(a).sqF(a,b)}
-J.o9=function(a){return J.RE(a).gP2(a)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a){return J.RE(a).UV(a)}
+J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
+J.ol=function(a){return J.RE(a).glp(a)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
+J.p6=function(a){return J.RE(a).gBN(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
+J.pI=function(a){return J.RE(a).gH3(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
-J.pP=function(a){return J.RE(a).gKw(a)}
+J.pP=function(a){return J.RE(a).gDD(a)}
 J.pU=function(a){return J.RE(a).ghN(a)}
+J.pa=function(a){return J.RE(a).Lx(a)}
 J.pm=function(a){return J.RE(a).gt0(a)}
+J.pq=function(a,b){return J.RE(a).sV8(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qb=function(a){return J.RE(a).gmSA(a)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
 J.ql=function(a){return J.RE(a).gaB(a)}
-J.qq=function(a){return J.RE(a).dQ(a)}
 J.qy=function(a){return J.RE(a).gA0(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
 J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.r8=function(a){return J.RE(a).gLC(a)}
-J.rA=function(a,b){return J.w1(a).Nk(a,b)}
 J.rK=function(a){return J.RE(a).gjD(a)}
-J.ra=function(a){return J.RE(a).gJ6(a)}
+J.rL=function(a,b){return J.RE(a).spE(a,b)}
+J.re=function(a){return J.RE(a).gmb(a)}
+J.rk=function(a){return J.RE(a).gke(a)}
+J.ro=function(a){return J.RE(a).gOB(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
+J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tC=function(a){return J.RE(a).gj8(a)}
 J.tG=function(a){return J.RE(a).Zi(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
 J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.tw=function(a){return J.RE(a).je(a)}
+J.tf=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.tv=function(a,b){return J.RE(a).sDX(a,b)}
+J.tw=function(a){return J.RE(a).gCK(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uY=function(a){return J.w1(a).grZ(a)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
-J.up=function(a){return J.RE(a).gkh(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.vI=function(a){return J.RE(a).gVX(a)}
+J.v7=function(a){return J.RE(a).gwX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
+J.vP=function(a,b){return J.RE(a).sR(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(a)}
+J.w0=function(a){return J.RE(a).gxD(a)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
-J.wF=function(a,b){return J.Wx(a).Sy(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
+J.wd=function(a){return J.RE(a).gqw(a)}
+J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wo=function(a,b){return J.U6(a).Gs(a,b)}
+J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.wz=function(a){return J.RE(a).gzx(a)}
@@ -21261,112 +21826,114 @@
 return J.x(a).n(a,b)}
 J.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-J.xW=function(a,b){return J.RE(a).sZm(a,b)}
-J.xd=function(a){return J.RE(a).gIF(a)}
+J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
+J.y1=function(a){return J.RE(a).gV8(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
 J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yc=function(a){return J.RE(a).guS(a)}
+J.yR=function(a,b){return J.RE(a).XT(a,b)}
 J.yd=function(a){return J.RE(a).xO(a)}
-J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yq=function(a){return J.RE(a).gQl(a)}
+J.yq=function(a){return J.RE(a).gNs(a)}
 J.yz=function(a){return J.RE(a).gLF(a)}
-J.z1=function(a){return J.RE(a).gXr(a)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
+J.z4=function(a){return J.RE(a).gXt(a)}
 J.zB=function(a){return J.RE(a).gee(a)}
 J.zF=function(a){return J.RE(a).gHL(a)}
-J.zH=function(a){return J.RE(a).gIs(a)}
-J.zHh=function(a){return J.RE(a).gt5(a)}
+J.zH=function(a){return J.RE(a).gt5(a)}
+J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.Df=X.hV.prototype
+C.Gx=X.hV.prototype
+C.J9=Q.f7.prototype
 C.Gkp=Y.q6.prototype
 C.C8=B.G6.prototype
-C.QLX=T.vr.prototype
-C.HR=A.wM.prototype
+C.FC=T.vr.prototype
+C.ic=A.wM.prototype
 C.oq=Q.eW.prototype
-C.fe=O.eo.prototype
+C.RD=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
 C.O0=R.JI.prototype
-C.wI=F.ZP.prototype
-C.GhT=L.nJ.prototype
+C.On=F.ZP.prototype
+C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
 C.LTI=A.Gk.prototype
-C.Hb=X.MJ.prototype
-C.MO0=X.J3.prototype
+C.vm=W.H05.prototype
+C.ls6=X.MJ.prototype
+C.n0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.wc=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.Ar=W.fJ.prototype
-C.Ug=E.WS.prototype
-C.GII=E.H8.prototype
+C.W3=W.fJ.prototype
+C.bP=E.WS.prototype
+C.tO=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.wvk=E.qM.prototype
-C.OkI=E.av.prototype
+C.hU=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
-C.yr=E.ds.prototype
+C.RVQ=E.wN.prototype
+C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
 C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.wd=E.L4.prototype
+C.j1o=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Fw=E.uE.prototype
 C.aV=E.n5.prototype
-C.po=B.pR.prototype
+C.QFk=O.Im.prototype
+C.hM=B.pR.prototype
 C.yKx=Z.hx.prototype
 C.aXP=D.Z4.prototype
-C.Vi=D.Qh.prototype
+C.rCJ=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
-C.Ji=D.Oz.prototype
+C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
+C.hys=L.qk.prototype
 C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
+C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.S3=A.UK.prototype
+C.ctm=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
+C.Bn=M.CX.prototype
 C.dl=U.WG.prototype
-C.fv=U.VZ.prototype
-C.S2=W.H9.prototype
+C.um=U.VZ.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
 C.br=A.ye.prototype
 C.IG=A.Bm.prototype
 C.Nk=A.Ya.prototype
 C.Mn=A.NK.prototype
-C.L88=A.Zx.prototype
-C.Y6=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.YpE=V.F1.prototype
+C.L8=A.Zx.prototype
+C.J7=A.Ww.prototype
+C.t5=W.yk.prototype
+C.k0=V.F1.prototype
 C.Pfz=Z.uL.prototype
 C.Sx=J.iCW.prototype
 C.GBL=A.xc.prototype
 C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.c07=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
@@ -21374,25 +21941,25 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.uC=X.uw.prototype
+C.bg3=X.uw.prototype
 C.OKl=A.G1.prototype
-C.Rr=U.Um.prototype
+C.Uav=U.Um.prototype
 C.vB=J.kdQ.prototype
-C.hj=V.D2.prototype
+C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
-C.vA=X.I5.prototype
+C.V8=X.I5.prototype
 C.Hd=U.el.prototype
-C.ol=W.K5.prototype
+C.Ui=W.K5.prototype
 C.Kn=new H.hJ()
-C.OL=new U.EO()
+C.x4=new U.EO()
+C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
-C.qY=new T.yy()
+C.qY=new T.hC()
 C.ZB=new P.yRf()
 C.pr=new P.mgb()
 C.aZ=new L.iNc()
 C.NU=new P.R81()
-C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
@@ -21400,22 +21967,22 @@
 C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.hU=new A.iYn(2)
+C.cn=new A.iYn(2)
 C.hf=new H.tx("label")
 C.Gh=H.IL('qU')
 C.B10=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
+C.vrd=new A.xn(!1)
+I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
-C.ucP=I.uL([C.B10,C.vrd])
+C.ucP=I.uLC([C.B10,C.vrd])
 C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.IL('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
 C.Zg=new H.tx("args")
-C.SXK=H.IL('qC')
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.UZ=H.IL('qC')
+C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
 C.MR=H.IL('vO')
 C.S9=new A.ES(C.SR,C.BM,!1,C.MR,!1,C.ucP)
@@ -21424,15 +21991,15 @@
 C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
 C.UL=new H.tx("profileChanged")
 C.yQP=H.IL('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.dn)
+C.dn=I.uLC([])
+C.mM=new A.ES(C.UL,C.cn,!1,C.yQP,!1,C.dn)
 C.TU=new H.tx("endPosChanged")
-C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.dn)
+C.Cp=new A.ES(C.TU,C.cn,!1,C.yQP,!1,C.dn)
 C.ne=new H.tx("exception")
 C.SNu=H.IL('EP')
 C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
 C.Wm=new H.tx("refChanged")
-C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.dn)
+C.QW=new A.ES(C.Wm,C.cn,!1,C.yQP,!1,C.dn)
 C.UY=new H.tx("result")
 C.SmN=H.IL('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -21441,8 +22008,8 @@
 C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
 C.SA=new H.tx("lines")
 C.hAX=H.IL('WO')
-C.J19=new K.nd()
-C.X0=I.uL([C.B10,C.J19])
+C.J19=new K.iv()
+C.X0=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
 C.zU=new H.tx("uncheckedText")
 C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
@@ -21455,8 +22022,8 @@
 C.A7=new H.tx("height")
 C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
 C.XA=new H.tx("cls")
-C.jF=H.IL('dy')
-C.dq=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
+C.jFX=H.IL('dy')
+C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
 C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.X0)
 C.rB=new H.tx("isolate")
@@ -21465,9 +22032,9 @@
 C.mJ=new H.tx("color")
 C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
-C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
+C.Bk=new A.ES(C.bz,C.cn,!1,C.yQP,!1,C.dn)
 C.CG=new H.tx("posChanged")
-C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.dn)
+C.Ml=new A.ES(C.CG,C.cn,!1,C.yQP,!1,C.dn)
 C.yh=new H.tx("error")
 C.oUD=H.IL('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
@@ -21486,12 +22053,14 @@
 C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.X0)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
+C.uO=new H.tx("inboundReferences")
+C.JT=new A.ES(C.uO,C.BM,!1,C.MR,!1,C.ucP)
 C.He=new H.tx("hideTagsChecked")
 C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.dn)
+C.kQ=new A.ES(C.ba,C.cn,!1,C.yQP,!1,C.dn)
 C.Rs=new H.tx("currentPosChanged")
-C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.dn)
+C.EW=new A.ES(C.Rs,C.cn,!1,C.yQP,!1,C.dn)
 C.zz=new H.tx("timeSpan")
 C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.X0)
 C.mr=new H.tx("expanded")
@@ -21499,11 +22068,11 @@
 C.kw=new H.tx("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
+C.dO=new A.ES(C.qX,C.cn,!1,C.yQP,!1,C.dn)
 C.UX=new H.tx("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
-C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
+C.Nt=new A.ES(C.rP,C.cn,!1,C.yQP,!1,C.dn)
 C.nf=new H.tx("function")
 C.QJ7=H.IL('Kp')
 C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.ucP)
@@ -21561,26 +22130,26 @@
 C.pH=new H.tx("small")
 C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
 C.li=new H.tx("startPosChanged")
-C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.dn)
+C.Tz=new A.ES(C.li,C.cn,!1,C.yQP,!1,C.dn)
 C.ox=new H.tx("countersChanged")
-C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
+C.Rh=new A.ES(C.ox,C.cn,!1,C.yQP,!1,C.dn)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
 C.bJ=new H.tx("counters")
-C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
 C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.X0)
 C.Ys=new H.tx("pad")
 C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
 C.N8=new H.tx("scriptChanged")
-C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
+C.qE=new A.ES(C.N8,C.cn,!1,C.yQP,!1,C.dn)
 C.YT=new H.tx("expr")
-C.eP=H.IL('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
+C.wG=H.IL('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
 C.vZ=new A.ES(C.yB,C.BM,!1,C.MR,!1,C.X0)
 C.xS=new H.tx("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
+C.bB=new A.ES(C.xS,C.cn,!1,C.yQP,!1,C.dn)
 C.jU=new H.tx("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
@@ -21601,7 +22170,7 @@
 C.aP=new H.tx("active")
 C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
-C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
+C.az=new A.ES(C.Gn,C.cn,!1,C.yQP,!1,C.dn)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
 C.pM=H.IL('kx')
@@ -21618,9 +22187,9 @@
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.X0)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
 C.OO=new H.tx("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
+C.Cf=new A.ES(C.OO,C.BM,!1,C.UZ,!1,C.ucP)
 C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.eP,!1,C.X0)
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.X0)
 C.uk=new H.tx("last")
 C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
 C.am=new H.tx("chromeTargets")
@@ -21630,16 +22199,16 @@
 C.WQ=new H.tx("field")
 C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
-C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
+C.nP=new A.ES(C.r1,C.cn,!1,C.yQP,!1,C.dn)
 C.Mc=new H.tx("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.fz=new A.ES(C.fn,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
+C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
 C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
-C.ngm=I.uL([C.J19])
+C.ngm=I.uLC([C.J19])
 C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
 C.mi=new H.tx("text")
 C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.X0)
@@ -21651,20 +22220,23 @@
 C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
 C.oqo=H.IL('pD')
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
+C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
+C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.X0)
 C.ny=new P.a6(0)
+C.it=new P.moY(!1)
 C.i6=H.VM(new W.FkO("close"),[W.BI])
 C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
-C.JN=H.VM(new W.FkO("error"),[W.ew])
+C.JN=H.VM(new W.FkO("error"),[W.ew7])
 C.MD=H.VM(new W.FkO("error"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.ew])
-C.ph=H.VM(new W.FkO("message"),[W.Hy])
+C.LF=H.VM(new W.FkO("load"),[W.ew7])
+C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
+C.ph=H.VM(new W.FkO("message"),[W.cxu])
 C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
 C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
 C.JL=H.VM(new W.FkO("open"),[W.ea])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
+C.yf=H.VM(new W.FkO("popstate"),[W.PF])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -21716,39 +22288,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.MA=function() {
-  function typeNameInChrome(o) {
-    var name = o.constructor.name;
-    if (name) return name;
-    var s = Object.prototype.toString.call(o);
-    return s.substring(8, s.length - 1);
-  }
-  function getUnknownTag(object, tag) {
-    if (/^HTML[A-Z].*Element$/.test(tag)) {
-      var name = Object.prototype.toString.call(object);
-      if (name == "[object Object]") return null;
-      return "HTMLElement";
-    }
-  }
-  function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
-    return getUnknownTag(object, tag);
-  }
-  function prototypeForTag(tag) {
-    if (typeof window == "undefined") return null;
-    if (typeof window[tag] == "undefined") return null;
-    var constructor = window[tag];
-    if (typeof constructor != "function") return null;
-    return constructor.prototype;
-  }
-  function discriminator(tag) { return null; }
-  var isBrowser = typeof navigator == "object";
-  return {
-    getTag: typeNameInChrome,
-    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
-    prototypeForTag: prototypeForTag,
-    discriminator: discriminator };
-}
 C.M1=function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
@@ -21778,6 +22317,39 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
+C.GM=function() {
+  function typeNameInChrome(o) {
+    var name = o.constructor.name;
+    if (name) return name;
+    var s = Object.prototype.toString.call(o);
+    return s.substring(8, s.length - 1);
+  }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = Object.prototype.toString.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: typeNameInChrome,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+}
 C.hQ=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
@@ -21804,48 +22376,51 @@
 C.IF=new N.qV("INFO",800)
 C.cd=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.Gb=H.VM(I.uL([127,2047,65535,1114111]),[P.KN])
-C.NG=I.uL([1,6])
-C.JH=I.uL([0,0,26624,1023,0,0,65534,2047])
+C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
+C.NG=I.uLC([1,6])
+C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.Uq=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-C.Zw=I.uL([C.SY,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.pzc=H.IL('nd')
-C.Cd=I.uL([C.pzc])
-C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
-C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
-C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.LyD=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.UM()},C.MEG)
-C.tq=H.IL('Bo')
+C.WK=I.uLC([C.SY,C.Uq,C.Wn,C.ai,C.nZ])
+C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
+C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
+C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.fJ3=H.IL('iv')
+C.fo=I.uLC([C.fJ3])
+C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
+C.jY=I.uLC(["as","in","this"])
+C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
+C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.mk=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
+C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.iq=I.uLC([40,41,91,93,123,125])
+C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.lY=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.zao)
+C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
+C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
+C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.iM=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
+C.MEG=I.uLC(["enumerate"])
+C.mB=new H.LPe(1,{enumerate:K.FLA()},C.MEG)
+C.lM=H.IL('M8')
+C.jUO=H.IL('xn')
+C.erP=I.uLC([C.jUO])
+C.LM=new A.rv(!0,!0,!0,C.lM,!1,!1,C.erP,null)
 C.uwj=H.IL('wA')
-C.wE=I.uL([C.uwj])
-C.Tb=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
+C.wE=I.uLC([C.uwj])
+C.nk=new A.rv(!1,!1,!0,C.lM,!1,!0,C.wE,null)
 C.eQn=H.IL('Yj')
-C.Qnw=I.uL([C.eQn])
-C.rL=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
-C.uDk=H.IL('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
+C.Qnw=I.uLC([C.eQn])
+C.ci=new A.rv(!0,!0,!0,C.lM,!1,!1,C.Qnw,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -21873,6 +22448,7 @@
 C.la=new H.tx("connectToVm")
 C.Je=new H.tx("current")
 C.RG=new H.tx("currentPage")
+C.ee=new H.tx("data")
 C.Lw=new H.tx("deleteVm")
 C.eR=new H.tx("deoptimizations")
 C.iE=new H.tx("descriptor")
@@ -21888,6 +22464,7 @@
 C.Pn=new H.tx("expanderStyle")
 C.h7=new H.tx("external")
 C.R3=new H.tx("fd")
+C.cJ=new H.tx("fetchInboundReferences")
 C.fV=new H.tx("fields")
 C.Gd=new H.tx("firstTokenPos")
 C.FP=new H.tx("formatSize")
@@ -21945,6 +22522,7 @@
 C.pY=new H.tx("isOptimized")
 C.XL=new H.tx("isPatch")
 C.LA=new H.tx("isPipe")
+C.nQ=new H.tx("isPsuedoNull")
 C.AT=new H.tx("isStatic")
 C.Lk=new H.tx("isString")
 C.dK=new H.tx("isType")
@@ -21987,6 +22565,7 @@
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
 C.I7=new H.tx("readClosed")
+C.vK=new H.tx("reference")
 C.GR=new H.tx("refresh")
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
@@ -22006,15 +22585,19 @@
 C.EA=new H.tx("scripts")
 C.oW=new H.tx("selectExpr")
 C.hd=new H.tx("serviceType")
+C.Jd=new H.tx("slot")
+C.Y4=new H.tx("slotIsArrayIndex")
+C.Si=new H.tx("slotIsField")
 C.jM=new H.tx("socketOwner")
+C.rd=new H.tx("source")
 C.HO=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
 C.ks=new H.tx("stepInto")
 C.Om=new H.tx("stepOut")
 C.iC=new H.tx("stepOver")
-C.k5=new H.tx("subClasses")
 C.Nv=new H.tx("subclass")
-C.Cw=new H.tx("superClass")
+C.Wo=new H.tx("subclasses")
+C.FZ=new H.tx("superclass")
 C.QF=new H.tx("targets")
 C.eO=new H.tx("timeStamp")
 C.hO=new H.tx("tipExclusive")
@@ -22030,7 +22613,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.Kj=new H.tx("totalSamplesInProfile")
+C.kr=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.J2=new H.tx("typeChecksEnabled")
 C.OU=new H.tx("unoptimizedCode")
@@ -22046,7 +22629,7 @@
 C.zn=new H.tx("version")
 C.Tc=new H.tx("vmName")
 C.Uy=new H.tx("writeClosed")
-C.MI=H.IL('hx')
+C.k5=H.IL('hx')
 C.hP=H.IL('uz')
 C.Qb=H.IL('J3')
 C.Mf=H.IL('G1')
@@ -22057,31 +22640,32 @@
 C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
 C.QJ=H.IL('WG')
-C.lU=H.IL('Hl')
+C.Fn=H.IL('Hl')
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
-C.dP=H.IL('vm')
 C.Vx=H.IL('MJ')
+C.Vh=H.IL('Pz')
 C.rR=H.IL('wN')
 C.kt=H.IL('Um')
 C.yS=H.IL('G6')
 C.Sb=H.IL('kn')
-C.FQ=H.IL('a')
+C.AP=H.IL('a')
 C.Yc=H.IL('iP')
 C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
 C.Jo=H.IL('i7')
 C.ON=H.IL('ov')
 C.jR=H.IL('Be')
+C.uC=H.IL('Im')
 C.al=H.IL('es')
 C.PT=H.IL('CX')
 C.iD=H.IL('Vb')
 C.ce=H.IL('kK')
 C.dD=H.IL('av')
 C.FA=H.IL('Ya')
-C.PF=H.IL('yyN')
+C.PFz=H.IL('yyN')
 C.Th=H.IL('fI')
-C.aN=H.IL('Vf')
+C.Df=H.IL('Vf')
 C.tU=H.IL('L4')
 C.yT=H.IL('FK')
 C.cK=H.IL('I5')
@@ -22093,6 +22677,8 @@
 C.ca=H.IL('Z4')
 C.pJ=H.IL('Q6')
 C.Yy=H.IL('uE')
+C.nC=H.IL('cQ')
+C.M5=H.IL('yc')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
 C.lp=H.IL('LU')
@@ -22101,13 +22687,11 @@
 C.EG=H.IL('Oz')
 C.nw=H.IL('eo')
 C.OG=H.IL('eW')
-C.oZ=H.IL('HS')
 C.km=H.IL('fl')
 C.jV=H.IL('rF')
 C.Tq=H.IL('vj')
 C.ou=H.IL('ak')
 C.JW=H.IL('Ww')
-C.UR=H.IL('Zc')
 C.CT=H.IL('St')
 C.wH=H.IL('zM')
 C.l4=H.IL('uL')
@@ -22122,15 +22706,15 @@
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
+C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
 C.pF=H.IL('WS')
 C.qZ=H.IL('DE')
 C.jw=H.IL('xc')
 C.NW=H.IL('ye')
-C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
-C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
+C.nW=H.IL('V2')
 C.he=H.IL('qM')
 C.Jm=H.IL('q6')
 C.Wz=H.IL('pR')
@@ -22147,7 +22731,8 @@
 C.lE=H.IL('DK')
 C.Az=H.IL('Gk')
 C.GX=H.IL('c8')
-C.NS=H.IL('wP')
+C.R9=H.IL('f7')
+C.hg=H.IL('vi')
 C.X8=H.IL('Ti')
 C.Lg=H.IL('JI')
 C.Ju=H.IL('Ly')
@@ -22155,11 +22740,27 @@
 C.XWY=H.IL('uEY')
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
-C.xM=new P.z0(!1)
+C.xM=new P.u5F(!1)
+C.NA=new P.fM(C.NU,P.Uwa())
+C.Xk=new P.fM(C.NU,P.Dk())
+C.F6=new P.fM(C.NU,P.H9())
+C.Rt=new P.fM(C.NU,P.wLZ())
+C.Sq=new P.fM(C.NU,P.zci())
+C.mc=new P.fM(C.NU,P.OjX())
+C.uo=new P.fM(C.NU,P.uy1())
+C.pj=new P.fM(C.NU,P.qJ6())
+C.lk=new P.fM(C.NU,P.qKH())
+C.Gu=new P.fM(C.NU,P.tz())
+C.Yl=new P.fM(C.NU,P.MM())
+C.Zc=new P.fM(C.NU,P.G2())
+C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
-$.Vz=1
+$.VzC=null
+$.kz=1
 $.z7="$cachedFunction"
-$.eb="$cachedInvocation"
+$.Mr="$cachedInvocation"
+$.xG=null
+$.hG=null
 $.OK=0
 $.bf=null
 $.P4=null
@@ -22175,35 +22776,35 @@
 $.oK=null
 $.S6=null
 $.k8=null
+$.mg=null
+$.v5=!1
 $.X3=C.NU
+$.Sk=null
 $.Km=0
+$.Ji=null
 $.Qz=null
 $.R6=null
 $.RL=!1
-$.Y4=C.IF
+$.DR=C.IF
 $.xO=0
 $.Nc=0
 $.Oo=null
 $.Td=!1
-$.jq=0
+$.FU=0
 $.ljh=1
 $.zk=2
-$.xG=null
+$.rf=null
 $.ok=!1
-$.AC=!1
+$.oQ=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
 $.xV=null
 $.ax=null
-$.Lz=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.vH},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.mA},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Thl},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.Qj},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.S1},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.V4},C.u4,U.VZ,{created:U.n2},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.Sc},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.xA},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.O3},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.m6},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii1},C.Io,D.Qh,{created:D.b2},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","Ou",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","Fv",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","WH","FX",function(){return $.jk().postMessage!==void 0})
+$.Lz=[C.lM,W.M8,{},C.k5,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.RN},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.Xn},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.Jz},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.BB},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.l4,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.aed},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.mBQ},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
@@ -22219,48 +22820,50 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
+I.$lazy($,"_rootMap","ln","Rf",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
+I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
+I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
 I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qa","Js",function(){return new L.TV([])})
-I.$lazy($,"_identRegExp","Nb","Gx",function(){return new L.lPa().$0()})
-I.$lazy($,"_logger","Vh","VND",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_instance","l7","lf",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.DOe().$0()})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Zl)})
-I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.So)})
+I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","mw",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","wC","V9",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","yeH",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_sheetLog","dz","bm",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","cq","rt",function(){return new A.rv(!1,!1,!0,C.lM,!1,!0,null,A.tq())})
+I.$lazy($,"_ATTRIBUTES_REGEX","mD","wm",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
+I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dnO",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
+I.$lazy($,"_eventsLog","Tb","q1",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","ho","CE",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.HL,new Z.W6o(),C.yw,new Z.MdQ(),C.aN,new Z.YJG()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w0(),"-",new K.w5(),"!",new K.w10()],null,null)})
-I.$lazy($,"_instance","ln","Cs",function(){return new K.me()})
+I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","zG",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","f8","bI",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","Al",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.Df,new Z.MdQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.Raa(),"-",new K.w5(),"!",new K.w10()],null,null)})
+I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",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($,"kRegularFunction","Ij","YF",function(){return new D.ma("function")})
+I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
 I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
-I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.ma("getter function")})
+I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
 I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
 I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
 I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
@@ -22277,18 +22880,17 @@
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","DH",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","tF",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return C.xB.g("template, ",J.ZG(J.kl(C.z5.gvc(C.z5),new M.DOe()),", "))})
-I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
-I.$lazy($,"_instanceExtension","Xa","FC",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.xB.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.YJG()),", "))})
+I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.lPa())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Ufa().$0()})
+I.$lazy($,"_instanceExtension","nB","Tn",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:233}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"n9",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"X7",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"cX",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"f",{func:"LN",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"VT",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"zo",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.aYy,P.T8]},{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.fRn,P.fRn]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v",{func:"DW",ret:U.Ip,args:[P.qU]},{func:"d7",args:[U.Ip,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},{func:"If",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"mI",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data","theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each",{func:"xA",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"uG",void:true,args:[W.AjY]},"result",{func:"wQ",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"Hq",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.Vf]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.e4y,P.JBS]},{func:"Zg",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"fh",void:true,args:[P.a,P.a]},"prop","records",{func:"qk",args:[L.Zl,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"JR",args:[null,P.qU,P.qU]},"k",{func:"cm",args:[null,W.KV,P.a2]},{func:"Nw",ret:P.a2,args:[null],named:{skipChanges:P.a2}},"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"line",{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"uc",void:true,args:[P.qU,L.U2]},{func:"js",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.Hy]},"exp","details",{func:"D2i",ret:A.Ap,args:[P.qU]},"ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"FM",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"LP",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"cX",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"VT",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"Bp",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v",{func:"DW",ret:U.Ip,args:[P.qU]},{func:"ZU",args:[U.Ip,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"If",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.PF]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"la",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"pG",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.a2},"ignored","convert","element",{func:"K5",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time","ref",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"P5",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"pD",ret:P.a2,args:[null],named:{skipChanges:P.a2}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"zv",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"Xa",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg","exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},{func:"K7",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -22319,22 +22921,6 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-return}if(document.currentScript){a(document.currentScript)
-return}var z=document.scripts
-function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.rk(),b)},[])}else{(function(b){H.wW(E.rk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -22448,6 +23034,22 @@
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
+Isolate.uLC=a.uLC
 return Isolate}}
+!function(){function intern(a){var u={}
+u[a]=1
+return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
+var z="___dart_isolate_tags_"
+var y=Object[z]||(Object[z]=Object.create(null))
+var x="_ZxYxX"
+for(var w=0;;w++){var v=intern(x+"_"+w+"_")
+if(!(v in y)){y[v]=1
+init.isolateTag=v
+break}}}()
+init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
+;(function(a){if(typeof document==="undefined"){a(null)
+return}if(document.currentScript){a(document.currentScript)
+return}var z=document.scripts
+function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.KU(),b)},[])}else{(function(b){H.Ke(E.KU(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
index 4a50140..6804768 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
@@ -648,6 +648,9 @@
 <polymer-element name="service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="any-service-ref" extends="observatory-element">
+</polymer-element>
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
@@ -917,30 +920,31 @@
       }
     </style>
     <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
+      <template if="{{ isError(ref) }}">
+         <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isUnexpected(ref.serviceType) }}">
+      <template if="{{ isUnexpected(ref) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNull(ref.serviceType) }}">
+      <template if="{{ isPsuedoNull(ref) }}">
         <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
+      <template if="{{ (isString(ref) ||
+                        isBool(ref) ||
+                        isNull(ref) ||
+                        isInt(ref)) ||
+                        isDouble(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ (isType(ref.serviceType)) }}">
+      <template if="{{ (isType(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+      <template if="{{ isInstance(ref) &amp;&amp;
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
@@ -948,7 +952,7 @@
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+      <template if="{{ isInstance(ref) &amp;&amp;
                        ref['closureFunc'] == null}}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
@@ -967,7 +971,7 @@
         </curly-block>
       </template>
 
-      <template if="{{ isList(ref.serviceType) }}">
+      <template if="{{ isList(ref) }}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -986,6 +990,7 @@
   </template>
 </polymer-element>
 
+
 <polymer-element name="action-link">
   <template>
     <style>
@@ -2157,7 +2162,7 @@
 .break-wrap {
   word-wrap: break-word;
 }
-</style><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</style><span><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 
@@ -2921,19 +2926,19 @@
   word-wrap: break-word;
 }
 </style>
-    <div>
+    <span>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
       <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp;
+      <template if="{{ (ref['declaredType'].name == 'dynamic' &amp;&amp;
                         !ref['final'] &amp;&amp; !ref['const']) }}">
         var
       </template>
-      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-    </div>
+    </span>
   </template>
 </polymer-element>
 
@@ -4188,19 +4193,19 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls.superClass != null }}">
+        <template if="{{ cls.superclass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls.superclass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls.subClasses.length > 0 }}">
+        <template if="{{ cls.subclasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls.subClasses }}">
+              <template repeat="{{ subclass in cls.subclasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
@@ -5577,7 +5582,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -5587,14 +5592,14 @@
         <template if="{{ field['static'] }}">static</template>
         <template if="{{ field['final'] }}">final</template>
         <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp;
+        <template if="{{ (field['declaredType'].name == 'dynamic' &amp;&amp;
                          !field['final'] &amp;&amp; !field['const']) }}">
           var
         </template>
-        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
-          {{ field['declared_type']['user_name'] }}
+        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
+          {{ field['declaredType'].name }}
         </template>
-        {{ field['user_name'] }}
+        {{ field.name }}
       </h1>
       <div class="memberList">
         <div class="memberItem">
@@ -5618,19 +5623,19 @@
           <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guard_class'] == 'dynamic' }}">
+              <template if="{{ field['guardClass'] == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guard_class'] == 'unknown' }}">
+              <template if="{{ field['guardClass'] == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guard_class'] != 'unknown' &amp;&amp;
-                            field['guard_class'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-                <template if="{{ field['guard_nullable'] }}">
+              <template if="{{ field['guardClass'] != 'unknown' &amp;&amp;
+                            field['guardClass'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
+                <template if="{{ field['guardNullable'] }}">
                   — null observed
                 </template>
-                <template if="{{ !field['guard_nullable'] }}">
+                <template if="{{ !field['guardNullable'] }}">
                   — null not observed
                 </template>
               </template>
@@ -5662,6 +5667,7 @@
 
 
 
+
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
@@ -13969,6 +13975,290 @@
 
 
 
+
+
+
+
+
+
+<polymer-element name="inbound-reference" extends="service-ref">
+  <template>
+    <style>
+/* Global styles */
+* {
+  margin: 0;
+  padding: 0;
+  font: 400 14px 'Montserrat', sans-serif;
+  color: #333;
+  box-sizing: border-box;
+}
+
+.content {
+  padding-left: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered {
+  padding-left: 10%;
+  padding-right: 10%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.content-centered-big {
+  padding-left: 5%;
+  padding-right: 5%;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+h1 {
+  font: 400 18px 'Montserrat', sans-serif;
+}
+
+.memberList {
+  display: table;
+}
+
+.memberItem {
+  display: table-row;
+}
+
+.memberName, .memberValue {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 14px 'Montserrat', sans-serif;
+}
+
+.memberSmall {
+  display: table-cell;
+  vertical-align: top;
+  padding: 3px 0 3px 1em;
+  font: 400 12px 'Montserrat', sans-serif;
+}
+
+.monospace {
+  font-family: consolas, courier, monospace;
+  font-size: 1em;
+  line-height: 1.2em;
+  white-space: nowrap;
+}
+
+a {
+  color: #0489c3;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: underline;
+}
+
+em {
+  color: inherit;
+  font-style: italic;
+}
+
+b {
+  color: inherit;
+  font-weight: bold;
+}
+
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+  height: 0;
+  box-sizing: content-box;
+}
+
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+}
+
+.list-group-item:first-child {
+  /* rounded top corners */
+  border-top-right-radius:4px;
+  border-top-left-radius:4px;
+}
+
+.list-group-item:last-child {
+  margin-bottom: 0;
+  /* rounded bottom corners */
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius:4px;
+}
+
+/* Flex row container */
+.flex-row {
+  display: flex;
+  flex-direction: row;
+}
+
+/* Flex column container */
+.flex-column {
+  display: flex;
+  flex-direction: column;
+}
+
+.flex-item-fit {
+  flex-grow: 1;
+  flex-shrink: 1;
+  flex-basis: auto;
+}
+
+.flex-item-no-shrink {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: auto;
+}
+
+.flex-item-fill {
+  flex-grow: 0;
+  flex-shrink: 1;  /* shrink when pressured */
+  flex-basis: 100%;  /* try and take 100% */
+}
+
+.flex-item-fixed-1-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 8.3%;
+}
+
+.flex-item-fixed-2-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 16.6%;
+}
+
+.flex-item-fixed-4-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 33.3333%;
+}
+
+.flex-item-fixed-6-12, .flex-item-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.flex-item-fixed-8-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 66.6666%;
+}
+
+.flex-item-fixed-9-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 75%;
+}
+
+
+.flex-item-fixed-12-12 {
+  flex-grow: 0;
+  flex-shrink: 0;
+  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-50-percent {
+  flex-grow: 0;
+  flex-shrink: 0;
+  flex-basis: 50%;
+}
+
+.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;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
+}
+
+.break-wrap {
+  word-wrap: break-word;
+}
+</style>
+    <div>
+      from <any-service-ref ref="{{ source }}"></any-service-ref>
+      <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
+      <template if="{{ slotIsField }}">via <field-ref ref="{{ slot }}"></field-ref></template>
+
+      <curly-block callback="{{ expander() }}">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">
+              <template repeat="{{ reference in inboundReferences] }}">
+                <inbound-reference ref="{{ reference }}"></inbound-reference>
+              </template>
+            </div>
+          </div>
+        </div>
+      </curly-block>
+    </div>
+  </template>
+</polymer-element>
+
+
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <style>
@@ -14291,12 +14581,12 @@
                 <div class="memberItem">
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
-                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <any-service-ref ref="{{ element['value'] }}"></any-service-ref>
                     <template if="{{ element['parentField'] != null }}">
-                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref> of
                     </template>
                     <template if="{{ element['parentListIndex'] != null }}">
-                      at list index {{ element['parentListIndex'] }} of
+                      in [{{ element['parentListIndex'] }}] of
                     </template>
                   </div>
                   </div>
@@ -14309,6 +14599,20 @@
               </template>
             </div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">inbound references</div>
+            <div class="memberValue">
+              <template if="{{ inboundReferences == null }}">
+                <eval-link callback="{{ fetchInboundReferences }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ inboundReferences != null }}">
+                <template repeat="{{ reference in inboundReferences['references'] }}">
+                  <inbound-reference ref="{{ reference }}"></inbound-reference>
+                </template>
+              </template>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
index 6b743d9..325a2ed 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
index 2d29d25..1d10041 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -119,11 +119,11 @@
 if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
 g[0].$reflectionName=b2
 g[0].$metadataIndex=a8+1
-if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.wh("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.wh("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
-return e?function(f){if(h===null)h=H.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(this,b,c,false,[],d)
+if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+return e?function(f){if(h===null)h=H.qmC(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qmC(this,b,c,false,[],d)
 return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
-return d?function(){if(h===void 0)h=H.wh(this,b,c,true,[],e).prototype
+return d?function(){if(h===void 0)h=H.qmC(this,b,c,true,[],e).prototype
 return h}:y(b,c,e,f)}var z=0
 var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
 if(!init.libraries)init.libraries=[]
@@ -150,14 +150,14 @@
 var j=[]
 var i=[]
 processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
+x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
+"^":"a;tT>"}}],["","",,J,{
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0:function(a){var z,y,x,w
+aN: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
@@ -193,31 +193,32 @@
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"$0","gAY",0,0,71],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,72],
+bu:[function(a){return H.a5(a)},"$0","gCR",0,0,73],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,74],
 gbx:function(a){return new H.cu(H.wO(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gAY",0,0,71],
+bu:[function(a){return String(a)},"$0","gCR",0,0,73],
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isa2:true},
 CDU:{
 "^":"Gv;",
 n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gAY",0,0,71],
+bu:[function(a){return"null"},"$0","gCR",0,0,73],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,72]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gkh",2,0,null,74]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.lU}},
+gbx:function(a){return C.Fn}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
-"^":"Ue1;"},
+"^":"Ue1;",
+bu:[function(a){return String(a)},"$0","gCR",0,0,73]},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
@@ -230,20 +231,20 @@
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
-oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
 H.IC(a,b,c)},
 Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
-Nk:function(a,b){H.Wt(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+uk:function(a,b){H.Wt(a,b)},
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(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.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -251,19 +252,20 @@
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
 y[x]=w}return y.join(b)},
-eR:function(a,b){return H.c1(a,b,null,null)},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.c1(a,b,c,null)},
+Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
+H.xF(a,b,c)
+return H.c1(a,b,c,H.u3(z,0))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
+oq:function(a,b,c){var z
 if(!!a.fixed$length)H.vh(P.f("removeRange"))
 z=a.length
 if(b<0||b>z)throw H.b(P.TE(b,0,z))
@@ -272,18 +274,18 @@
 this.sB(a,z-(c-b))},
 Vr:function(a,b){return H.CkK(a,b)},
 GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},
+H.ig(a,b)},
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
-Gs:function(a,b){var z
+tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.u3(a,0)])
 else{z=H.VM(a.slice(),[H.u3(a,0)])
@@ -312,12 +314,7 @@
 $asWO:null,
 $isyN:true,
 $isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -331,15 +328,15 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
+gzr:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
 return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-UD:function(a){if(a<0)return-Math.round(-a)
+zQ:function(a){return this.yu(this.RE(a))},
+RE:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:[function(a,b){var z,y
 if(typeof b!=="number")H.vh(P.u(b))
@@ -347,11 +344,11 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,73],
+return y},"$1","gVz",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"$0","gAY",0,0,71],
+else return""+a},"$0","gCR",0,0,73],
 giO:function(a){return a&0x1FFFFFFF},
 J:function(a){return-a},
 g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -372,19 +369,21 @@
 Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
 else{if(typeof b!=="number")H.vh(P.u(b))
 return this.yu(a/b)}},
-cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
+BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
 O:function(a,b){if(b<0)throw H.b(P.u(b))
 return b>31?0:a<<b>>>0},
-KI:function(a,b){return b>31?0:a<<b>>>0},
+iK:function(a,b){return b>31?0:a<<b>>>0},
 m:function(a,b){var z
 if(b<0)throw H.b(P.u(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
-GG:function(a,b){var z
+wG:function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
+PK:function(a,b){if(b<0)throw H.b(P.u(b))
+return b>31?0:a>>>b},
 i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a&b)>>>0},
 w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -399,16 +398,16 @@
 return a>=b},
 gbx:function(a){return C.yT},
 $isFK:true,
-static:{"^":"SAz,N6l"}},
+static:{"^":"SAz,HS"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isVf:true,
 $isFK:true,
 $isKN:true},
-Yn:{
+VA7:{
 "^":"P;",
-gbx:function(a){return C.aN},
+gbx:function(a){return C.Df},
 $isVf:true,
 $isFK:true},
 O:{
@@ -417,7 +416,9 @@
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
 return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
+dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+return H.ZT(a,b,c)},
+dd:function(a,b){return this.dm(a,b,0)},
 wL:function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -439,21 +440,22 @@
 h8:function(a,b,c){return H.ys(a,b,c)},
 Fr:function(a,b){if(b==null)H.vh(P.u(null))
 if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
+else if(!!J.x(b).$isVR)return a.split(b.Yr)
 else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-lV:function(a,b,c){var z
+Ys:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.lV(a,b,0)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+nC:function(a,b){return this.Ys(a,b,0)},
+Nj:function(a,b,c){var z
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
+z=J.Wx(b)
+if(z.C(b,0))throw H.b(P.N(b))
+if(z.D(b,c))throw H.b(P.N(b))
+if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -476,16 +478,16 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-gYC:function(a){return new J.mN(a)},
+gNq:function(a){return new J.mN(a)},
 XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(P.u(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
 z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
+if(!!z.$isVR){y=b.UZ(a,c)
+return y==null?-1:y.pX.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -496,7 +498,7 @@
 eM:function(a,b,c){if(b==null)H.vh(P.u(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 return H.m2(a,b,c)},
-Gs:function(a,b){return this.eM(a,b,0)},
+tg:function(a,b){return this.eM(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:function(a,b){var z
@@ -504,7 +506,7 @@
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gAY",0,0,71],
+bu:[function(a){return a},"$0","gCR",0,0,73],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -528,10 +530,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 mN:{
-"^":"w2Y;iN",
-gB:function(a){return this.iN.length},
+"^":"w2Y;Bx",
+gB:function(a){return this.Bx.length},
 t:function(a,b){var z,y
-z=this.iN
+z=this.Bx
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -541,13 +543,13 @@
 $asark:function(){return[P.KN]},
 $aseD:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
-$asQV:function(){return[P.KN]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+$asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
 return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
+cv:function(){--init.globalState.Xz.kv},
+Ke:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -556,32 +558,32 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.pq(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
+y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y.N8(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)
 v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+u=new H.aX(y,x,w,new I(),v,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
-u.O9(0,v)
+u.ac(0,v)
 init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
+x=H.KT(y,[y]).Zg(a)
+if(x)u.vV(0,new H.mP(z,a))
+else{y=H.KT(y,[y,y]).Zg(a)
 if(y)u.vV(0,new H.Fx(z,a))
 else u.vV(0,a)}init.globalState.Xz.bL()},
 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 os=="object"&&"system" in os)return H.mfx()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.fU()
+if(init.globalState.EF===!0)return H.mfx()
 return},
-fU:function(){var z,y
+mfx: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"))
@@ -589,7 +591,7 @@
 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)+"\""))},
-uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=H.b0(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
@@ -604,135 +606,93 @@
 q=P.L5(null,null,null,P.KN,H.yo)
 p=P.Ls(null,null,null,P.KN)
 o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+n=new H.aX(y,q,p,new I(),o,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
-n.O9(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.xn(w,v,u,t,s,r),"worker-start"))
+n.ac(0,o)
+init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.MA(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.jl3(m),new H.bLz(m))
-break
+case"spawn-worker":break
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
+case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.yb(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","dM",4,0,null,0,1],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+yb:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.t0(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)
+self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
+z=new H.oP(w,null)
 throw H.b(P.eG(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.Vr(b,".dart"))b=J.WB(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gTw(z).ml(new H.yk(y))
-x=new H.VU(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.WK(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.uK,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.H5(z,a,e,f,g),"nonworker start"))},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
 $.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
+$.Mr=$.Mr+("_"+y)
 y=z.D5
 x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.oz(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
+w=z.Qy
+J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
+x=new H.zX(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-b0:function(a){if(init.globalState.ji===!0)return new H.mb(null).ug(a)
+if(init.globalState.ji===!0){z=new H.RS(0,new H.qH())
+z.dZ=new H.m3(null)
+return z.h7(a)}else{z=new H.fL(new H.qH())
+z.dZ=new H.m3(null)
+return z.h7(a)}},
+b0:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
-PK:{
-"^":"Xs:74;a,b",
+mP:{
+"^":"Xs:76;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 Fx:{
-"^":"Xs:74;a,c",
+"^":"Xs:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-pq:{
-"^":"a;Hg,NO,Y7,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Ou()==null
-y=$.Fv()
-x=z&&$.FX()===!0
+O2:{
+"^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
+N8:function(a){var z,y,x
+z=self.window==null
+y=self.Worker
+x=z&&!!self.postMessage
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
 this.ji=y
-this.da=z&&!x
+this.Ws=z&&!x
 y=H.IY
 x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Pt(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=P.L5(null,null,null,P.KN,H.aX)
+x.Eo(null,y)
+this.Xz=new H.ae(x,0)
+this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.In()
+if(this.EF===!0){z=new H.JH()
 this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.uK,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
+self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
+self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
+static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,lH,En<,D5<,um,PX,xF?,UF<,C9<,lJ,CN,M2,MA,pa,ir",
-oz:function(a,b){if(!this.um.n(0,a))return
+"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,C9<,lJ,QC,fB,P0,pa,xc",
+V0:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
+this.CX()},
 NR:function(a){var z,y,x,w,v,u
 if(!this.UF)return
 z=this.lJ
@@ -740,79 +700,78 @@
 if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
-w=y.av
-v=y.v5
+w=y.QN
+v=y.dr
 u=v.length
 w=(w-1&u-1)>>>0
-y.av=w
+y.QN=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.zX)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
+if(w===y.Bq)y.OO();++y.Wf}this.UF=!1}this.CX()},
+Ma:function(a){var z=this.QC
 if(z==null){z=[]
-this.CN=z}if(J.wo(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
+this.QC=z}if(J.kE(z,a))return
+this.QC.push(a)},
+IB:function(a){var z=this.QC
 if(z==null)return
 J.V1(z,a)},
 JZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 ZC:function(a,b){var z,y
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.MA
+if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
 if(y){J.H4(a,null)
 return}y=new H.NYh(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
+if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
+return}z=this.fB
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
-this.M2=z}z.NZ(0,y)},
-bc:function(a,b){var z,y
+z.Eo(null,null)
+this.fB=z}z.B7(0,y)},
+w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.MA
+if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
 if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
+z.Rk.B7(0,new H.IY(this,y,"kill"))
+return}z=this.fB
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
-this.M2=z}z.NZ(0,this.gIm())},
+z.Eo(null,null)
+this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
-z=this.ir
+z=this.xc
 if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
-z=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
+if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
 y.fixed$length=init
 y[0]=J.AG(a)
 y[1]=b==null?null:J.AG(b)
-for(z=H.VM(new P.zQ(z,z.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
+for(z=H.VM(new P.zQ(z,z.HU,null,null),[null]),z.Qx=z.vY.HH;z.G();)J.H4(z.fD,y)},
 vV:[function(a,b){var z,y,x,w,v,u
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
-this.MA=!0
+this.P0=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.XO(v,null)
+w=new H.oP(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.MA=!1
+if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,75,76],
+if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
-case"add-ondone":this.iK(z.t(a,1))
+case"add-ondone":this.Ma(z.t(a,1))
 break
 case"remove-ondone":this.IB(z.t(a,1))
 break
@@ -820,111 +779,85 @@
 break
 case"ping":this.ZC(z.t(a,1),z.t(a,2))
 break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
+case"kill":this.w1(z.t(a,1),z.t(a,2))
 break
-case"getErrors":this.ir.h(0,z.t(a,1))
+case"getErrors":this.xc.h(0,z.t(a,1))
 break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
+case"stopErrors":this.xc.Rz(0,z.t(a,1))
 break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
+hV:function(a){return this.A4.t(0,a)},
+ac:function(a,b){var z=this.A4
+if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.lH.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
+CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
-z=this.M2
+z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.pr()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
 z.V1(0)
-this.lH.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-this.ir.V1(0)
-z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
+this.fW.V1(0)
+init.globalState.i2.Rz(0,this.jO)
+this.xc.V1(0)
+z=this.QC
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
+this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
-"^":"Xs:18;a",
+"^":"Xs:17;a",
 $0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-cC:{
-"^":"a;Rk>,GL",
-MK:function(){var z=this.Rk
-if(z.av===z.zX)return
+ae:{
+"^":"a;Rk>,kv",
+mj:function(){var z=this.Rk
+if(z.QN===z.Bq)return
 return z.AR()},
-xB:function(){var z,y,x
-z=this.MK()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(0,init.globalState.Nr.jO)&&init.globalState.da===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
+d5:function(){var z,y,x
+z=this.mj()
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
+if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-Wu:function(){if($.Ou()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
+nT:function(){if(self.window!=null)new H.Rm(this).$0()
+else for(;this.d5(););},
 bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.Wu()
-else try{this.Wu()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.nT()
+else try{this.nT()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.rj
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"Xs:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+"^":"Xs:17;a",
+$0:[function(){if(!this.a.d5())return
+P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gpE",0,0,17],
 $isIY:true},
-In:{
+JH:{
 "^":"a;"},
-xn:{
-"^":"Xs:74;a,b,c,d,e,f",
+MA:{
+"^":"Xs:76;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-jl3:{
-"^":"Xs:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-bLz:{
-"^":"Xs:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,78,"call"],
-$isEH:true},
-yk:{
-"^":"Xs:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-WK:{
-"^":"Xs:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,79,"call"],
-$isEH:true},
-H5:{
-"^":"Xs:74;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Xs:18;a,b,c,d,e",
+zX:{
+"^":"Xs:17;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
 y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
+x=H.KT(y,[y,y]).Zg(z)
 if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
+else{y=H.KT(y,[y]).Zg(z)
 if(y)z.$1(this.b)
 else z.$0()}}},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -932,231 +865,217 @@
 "^":"a;",
 $ispW:true,
 $ishq:true},
-VU:{
-"^":"Iy4;JE,tv",
+Kg:{
+"^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
+y=this.AJ
+x=init.globalState.i2.t(0,y)
 if(x==null)return
-w=this.JE
-if(w.gKS())return
+w=this.kx
+if(w.geL())return
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.t0(b)
 if(x.gD5()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isVU&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isVU:true,
+return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.Rr(this.kx)},
+$isKg:true,
 $ispW:true,
 $ishq:true},
 Ua:{
-"^":"Xs:74;a,b,c",
+"^":"Xs:76;a,b,c",
 $0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.b0(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
+z=this.b.kx
+if(!z.geL()){if(this.c){y=this.a
+y.a=H.b0(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
-"^":"Iy4;ZU,bv,tv",
+"^":"Iy4;Bi,ma,AJ",
 wR:function(a,b){var z,y
 z=H.t0(P.EF(["command","message","port",this,"msg",b],null,null))
 if(init.globalState.EF===!0){init.globalState.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
+self.postMessage(z)}else{y=init.globalState.XC.t(0,this.Bi)
 if(y!=null)y.postMessage(z)}},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
+return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
-x=this.bv
+z=J.Eh(this.Bi,16)
+y=J.Eh(this.AJ,8)
+x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
 $ispW:true,
 $ishq:true},
 yo:{
-"^":"a;qK>,jON,KS<",
-wy:function(a){return this.jON.$1(a)},
-pr:function(){this.KS=!0
-this.jON=null},
+"^":"a;a7>,Oy,eL<",
+mY:function(a){return this.Oy.$1(a)},
+BG:function(){this.eL=!0
+this.Oy=null},
 xO:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.jON=null
+if(this.eL)return
+this.eL=!0
+this.Oy=null
 z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.lH.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.wy(b)},
+y=this.a7
+z.A4.Rz(0,y)
+z.fW.Rz(0,y)
+z.CX()},
+yU:function(a,b){if(this.eL)return
+this.mY(b)},
 $isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"wS;vl,tU",
-KR:function(a,b,c,d){var z=this.tU
-z.toString
-return H.VM(new P.u2(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-xO:[function(a){this.vl.xO(0)
-this.tU.xO(0)},"$0","gQF",0,0,18],
-TL:function(a){var z=P.ji(this.gQF(this),null,null,null,!0,null)
-this.tU=z
-this.vl.jON=z.ght(z)},
-$aswS:function(){return[null]},
-$iswS:true},
-NA:{
-"^":"hz;Ao,mR",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
+static:{"^":"kz"}},
+RS:{
+"^":"hz;uP,dZ",
+DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
+if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
+yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isVU)return new H.VU(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
+"^":"ooy;dZ",
+DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
+if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-mb:{
-"^":"fPc;RZ",
-vB:function(a){var z,y,x,w,v,u
+EU:{
+"^":"fPc;Bw",
+Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
 w=z.t(a,3)
-if(J.xC(y,init.globalState.NO)){v=init.globalState.iR.t(0,x)
+if(J.xC(y,init.globalState.NO)){v=init.globalState.i2.t(0,x)
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+return new H.Kg(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
-"^":"a;u5",
+"^":"a;At",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.u5.push(b)
+u:function(a,b,c){this.At.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.u5=[]},
-no:function(){var z,y,x
-for(z=this.u5.length,y=0;y<z;++y){x=this.u5
+CH:function(a){this.At=[]},
+F4:function(){var z,y,x
+for(z=this.At.length,y=0;y<z;++y){x=this.At
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.u5=null}},
-cx:{
+x[y].__MessageTraverser__attached_info__=null}this.At=null}},
+qH:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
 CH:function(a){},
-no:function(){}},
-BB:{
+F4:function(){}},
+HU5:{
 "^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.nl(a)
-this.mR.CH(0)
+h7:function(a){var z
+if(H.vM(a))return this.Wp(a)
+this.dZ.CH(0)
 z=null
-try{z=this.Q9(a)}finally{this.mR.no()}return z},
-Q9:function(a){var z
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.nl(a)
+try{z=this.I2(a)}finally{this.dZ.F4()}return z},
+I2:function(a){var z
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
 if(!!z.$isT8)return this.TI(a)
 if(!!z.$ispW)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.YZ(a)},
-YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+return this.N1(a)},
+N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
-"^":"BB;",
-nl:function(a){return a},
+"^":"HU5;",
+Wp:function(a){return a},
 wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
 x=y.gB(a)
 z=Array(x)
 z.fixed$length=init
-this.mR.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
+this.dZ.u(0,a,z)
+for(w=0;w<x;++w)z[w]=this.I2(y.t(a,w))
 return z},
 TI:function(a){var z,y
 z={}
-y=this.mR.t(0,a)
+y=this.dZ.t(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.mR.u(0,a,y)
+this.dZ.u(0,a,y)
 J.Me(a,new H.RK(z,this))
 return z.a},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 RK:{
-"^":"Xs:80;a,b",
-$2:function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},
+"^":"Xs:81;a,b",
+$2:[function(a,b){var z=this.b
+J.kW(this.a.a,z.I2(a),z.I2(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
 hz:{
-"^":"BB;",
-nl:function(a){return a},
+"^":"HU5;",
+Wp:function(a){return a},
 wb:function(a){var z,y
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["list",y,this.mE(a)]},
+y=this.uP++
+this.dZ.u(0,a,y)
+return["list",y,this.IP(a)]},
 TI:function(a){var z,y,x
-z=this.mR.t(0,a)
+z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
+y=this.uP++
+this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.mE(J.Nd(x.gvc(a))),this.mE(J.Nd(x.gUQ(a)))]},
-mE:function(a){var z,y,x,w,v
+return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
+IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.Q9(z.t(a,w))
+for(w=0;w<y;++w){v=this.I2(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-return this.er(a)},
-er:function(a){var z,y
+QS:function(a){if(H.ZR(a))return a
+this.Bw=P.YM(null,null,null,null,null)
+return this.H6(a)},
+H6:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
-return this.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.vB(a)
+return this.Bw.t(0,y)
+case"list":return this.vo(a)
+case"map":return this.p1(a)
+case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
+default:return this.fp(a)}},
+vo:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
-this.RZ.u(0,y,x)
+this.Bw.u(0,y,x)
 z=J.U6(x)
 w=z.gB(x)
 if(typeof w!=="number")return H.s(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.er(z.t(x,v)))
+for(;v<w;++v)z.u(x,v,this.H6(z.t(x,v)))
 return x},
-GD:function(a){var z,y,x,w,v,u,t,s
+p1:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
 x=y.t(a,1)
-this.RZ.u(0,x,z)
+this.Bw.u(0,x,z)
 w=y.t(a,2)
 v=y.t(a,3)
 y=J.U6(w)
@@ -1164,45 +1083,53 @@
 if(typeof u!=="number")return H.s(u)
 t=J.U6(v)
 s=0
-for(;s<u;++s)z.u(0,this.er(y.t(w,s)),this.er(t.t(v,s)))
+for(;s<u;++s)z.u(0,this.H6(y.t(w,s)),this.H6(t.t(v,s)))
 return z},
-PR:function(a){throw H.b("Unexpected serialized object")}},
+fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
+"^":"a;bf,TD,Iw",
+Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.Iw==null)return
 H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
+var z=this.Iw
+if(this.bf)self.clearTimeout(z)
+else self.clearInterval(z)
+this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
+this.Iw=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
 else z=!1
-if(z){this.p9=1
+if(z){this.Iw=1
 z=init.globalState.Xz
 y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+z.Rk.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
+this.TD=!0}else if(self.setTimeout!=null){++init.globalState.Xz.kv
+this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+z.WI(a,b)
 return z}}},
 Av:{
-"^":"Xs:18;a,b",
-$0:[function(){this.a.p9=null
+"^":"Xs:17;a,b",
+$0:[function(){this.a.Iw=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 vt:{
-"^":"Xs:18;c,d",
-$0:[function(){this.c.p9=null
+"^":"Xs:17;c,d",
+$0:[function(){this.c.Iw=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;qK>",
+DH:{
+"^":"Xs:76;a,b",
+$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kuS:{
+"^":"a;a7>",
 giO:function(a){var z,y,x
-z=this.qK
+z=this.a7
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1215,11 +1142,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
+if(!!J.x(b).$iskuS){z=this.a7
+y=b.a7
 return z==null?y==null:z===y}return!1},
-$isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iskuS:true,
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1235,7 +1162,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1276,34 +1203,45 @@
 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)+"'"},
-mD:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
+Qn:[function(){return Date.now()},"$0","EY",0,0,4],
+Xe:function(){var z,y
+if($.xG!=null)return
+$.xG=1000
+$.hG=H.EY()
+if(typeof window=="undefined")return
+z=window
+if(z==null)return
+y=z.performance
+if(y==null)return
+if(typeof y.now!="function")return
+$.xG=1000000
+$.hG=new H.ww(y)},
 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},
-XZ:function(a){var z,y,x
+Cq:function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.lo
+for(;y.G();){x=y.Ff
 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))
+else if(x<=1114111){z.push(55296+(C.jn.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+eT:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
 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.XZ(a)}return H.RF(a)},
+if(y>65535)return H.Cq(a)}return H.RF(a)},
 mx: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))},
+return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
 fu: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))
@@ -1313,15 +1251,15 @@
 if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
 z=J.Hn(b,1)
 y=h?Date.UTC(a,z,c,d,e,f,g):new Date(a,z,c,d,e,f,g).valueOf()
-if(isNaN(y)||y<-8640000000000000||y>8640000000000000)throw H.b(P.u(null))
+if(isNaN(y)||y<-8640000000000000||y>8640000000000000)return
 x=J.Wx(a)
 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)
+o2:function(a){if(a.date===void 0)a.date=new Date(a.rq)
 return a.date},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
 wV: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},
@@ -1366,7 +1304,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",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
 z=new H.Hk(a)
@@ -1377,7 +1315,7 @@
 y=a.message
 if("number" in a&&typeof a.number=="number"){x=a.number
 w=x&65535
-if((C.jn.GG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
+if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
 u=$.Up()
@@ -1420,7 +1358,7 @@
 else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1489,7 +1427,7 @@
 rm:function(a,b,c,d){var z,y
 z=H.uj
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1517,7 +1455,7 @@
 t=$.OK
 $.OK=J.WB(t,1)
 return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
+qmC:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
 return H.HA(a,b,c,!!d,e,f)},
 aE:function(a,b){var z=J.U6(b)
@@ -1530,16 +1468,17 @@
 ag:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 GO:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Hs(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
+rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 IL: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)
+W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
 return z==null?null:z[b]},
@@ -1552,11 +1491,11 @@
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.vM+=", "
+else z.IN+=", "
 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)+">"},
+z.IN+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
@@ -1575,7 +1514,7 @@
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
 return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+oZ:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
 IU:function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
@@ -1646,10 +1585,10 @@
 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)},
-UB:function(a){var z=$.NF
+CE:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 bl:function(a){return H.eQ(a)},
-iwd:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Am:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1708,7 +1647,7 @@
 z["+"+v]=s
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
+z=C.GM()
 z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
@@ -1720,21 +1659,21 @@
 $.TX=new H.VX(u)
 $.x7=new H.rh(t)},
 ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
+ZT:function(a,b,c){var z,y,x,w,v
 z=H.VM([],[P.ns])
 y=b.length
 x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
+for(;!0;){w=C.xB.XU(b,a,c)
+if(w===-1)break
+z.push(new H.Vo(w,b,a))
+v=w+x
+if(v===y)break
+else c=w===v?c+1:v}return z},
 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
+y=b.Yr
 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
 if(b==="")if(a==="")return c
@@ -1742,50 +1681,50 @@
 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,"$$$$"))},
+w=z.IN+=w
+z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
 gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-Rz:function(a,b){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+K2:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.K2()},
+Rz:function(a,b){return this.K2()},
+V1:function(a){return this.K2()},
+FV:function(a,b){return this.K2()},
 $isT8:true,
 $asT8:null},
-Px:{
-"^":"ysD;B>,eZ,tc",
-x4:function(a,b){if(typeof b!=="string")return!1
+LPe:{
+"^":"ysD;B>,M2,md",
+NZ:function(a,b){if(typeof b!=="string")return!1
 if("__proto__"===b)return!1
-return this.eZ.hasOwnProperty(b)},
-t:function(a,b){if(!this.x4(0,b))return
-return this.TZ(b)},
-TZ:function(a){return this.eZ[a]},
+return this.M2.hasOwnProperty(b)},
+t:function(a,b){if(!this.NZ(0,b))return
+return this.Uf(b)},
+Uf:function(a){return this.M2[a]},
 aN:function(a,b){var z,y,x
-z=this.tc
+z=this.md
 for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
+b.$2(x,this.Uf(x))}},
 gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
-gUQ:function(a){return H.fR(this.tc,new H.hY(this),H.u3(this,0),H.u3(this,1))},
+gUQ:function(a){return H.fR(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,81,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
 dZ:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
+"^":"mW;Nt",
+gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
+"^":"a;r9,yl,Jt,TX,Y2,zn",
+gWa:function(){return this.r9},
+gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
+if(this.Jt===1)return C.dn
+z=this.TX
+y=z.length-this.Y2.length
 if(y===0)return C.dn
 x=[]
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
@@ -1793,10 +1732,10 @@
 x.fixed$length=!0
 return x},
 gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.IN,null)
-z=this.FX
+if(this.Jt!==0)return P.Fl(P.IN,null)
+z=this.Y2
 y=z.length
-x=this.rq
+x=this.TX
 w=x.length-y
 if(y===0)return P.Fl(P.IN,null)
 v=P.L5(null,null,null,P.IN,null)
@@ -1805,7 +1744,7 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.tx(t),x[s])}return v},
-static:{"^":"hAw,eHF,Y8"}},
+static:{"^":"hAw,eHF,oJ"}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
 XL:function(a){var z=this.Rn[a+this.hG+3]
@@ -1829,9 +1768,8 @@
 x=P.Fl(P.qU,P.KN)
 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(x)
-y=P.F(y,!0,H.ip(y,"mW",0))
-H.rd(y,null)
+y=x.gvc(x).br(0)
+H.ig(y,null)
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
@@ -1844,7 +1782,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Xs:5;a,b,c",
+"^":"Xs:3;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1852,6 +1790,10 @@
 if(y>=z.length)return H.e(z,y)
 z[y]=x},
 $isEH:true},
+ww:{
+"^":"Xs:76;a",
+$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
+$isEH:true},
 Cj:{
 "^":"Xs:82;a,b,c",
 $2:function(a,b){var z=this.a
@@ -1862,24 +1804,24 @@
 u8:{
 "^":"Xs:82;a,b",
 $2:function(a,b){var z=this.b
-if(z.x4(0,a))z.u(0,a,b)
+if(z.NZ(0,a))z.u(0,a,b)
 else this.a.a=!0},
 $isEH:true},
 Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
+"^":"a;zj,TX,v7,Wb,Xr,lT",
 qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
+z=new RegExp(this.zj).exec(a)
 if(z==null)return
 y={}
-x=this.rq
+x=this.TX
 if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
+x=this.v7
 if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
+x=this.Wb
 if(x!==-1)y.expr=z[x+1]
-x=this.Ga
+x=this.Xr
 if(x!==-1)y.method=z[x+1]
-x=this.cR
+x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
 static:{"^":"lm,k1,Re,fN,qi,cz,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
@@ -1894,20 +1836,20 @@
 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)}}},
 W0:{
-"^":"XS;K9,Ga",
-bu:[function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,71],
+"^":"XS;yy,Xr",
+bu:[function(a){var z=this.Xr
+if(z==null)return"NullError: "+H.d(this.yy)
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,73],
 $isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;K9,Ga,cR",
+"^":"XS;yy,Xr,lT",
 bu:[function(a){var z,y
-z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,71],
+z=this.Xr
+if(z==null)return"NoSuchMethodError: "+H.d(this.yy)
+y=this.lT
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.yy)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.yy)+")"},"$0","gCR",0,0,73],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1916,64 +1858,64 @@
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;K9",
-bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
+"^":"XS;yy",
+bu:[function(a){var z=this.yy
+return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
 Hk:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-XO:{
-"^":"a;lA,ui",
+oP:{
+"^":"a;Np,j0",
 bu:[function(a){var z,y
-z=this.ui
+z=this.j0
 if(z!=null)return z
-z=this.lA
+z=this.Np
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
-this.ui=z
-return z},"$0","gAY",0,0,71]},
+this.j0=z
+return z},"$0","gCR",0,0,73]},
 dr:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Xs:74;b,c",
+"^":"Xs:76;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Xs:74;d,e,f",
+"^":"Xs:76;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Xs:74;UI,bK,Gq,Rm",
+"^":"Xs:76;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"Xs:74;w3,HZ,mG,xC,cj",
+"^":"Xs:76;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Xs:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gAY",0,0,71],
+bu:[function(a){return"Closure"},"$0","gCR",0,0,73],
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
 "^":"Xs;"},
 v:{
-"^":"Bp;nw,jm,cR,RA",
+"^":"Bp;tx,J6,lT,JL",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
+return this.tx===b.tx&&this.J6===b.J6&&this.lT===b.lT},
 giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
+z=this.lT
+if(z==null)y=H.eQ(this.tx)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
+return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
+static:{"^":"bf,P4",uj:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
 if(z==null){z=H.B3("self")
 $.bf=z}return z},B3:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -1984,20 +1926,20 @@
 if(z[v]===a)return v}}}},
 Pe:{
 "^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 bb:{
 "^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{Yi:function(a){return new H.bb(a)}}},
+bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
+"^":"lbp;dw,Iq,is,vL",
+Zg:function(a){var z=this.LC(a)
 return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(a)
+LC:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
 z={func:"dynafunc"}
@@ -2009,7 +1951,7 @@
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
 if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
+y=this.vL
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
@@ -2023,12 +1965,12 @@
 if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
 for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.p6
+x+=H.d(u)}x+="]"}else{z=this.vL
 if(z!=null){x=(w?x+", ":x)+"{"
 t=H.kU(z)
 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))},"$0","gAY",0,0,71],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gCR",0,0,73],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -2036,17 +1978,17 @@
 return z}}},
 hJ:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gAY",0,0,71],
+bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $ishJ:true},
-tu:{
+Hs:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
+bu:[function(a){return this.oc},"$0","gCR",0,0,73]},
 KEA:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
@@ -2056,25 +1998,25 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
 this.Et=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gAY",0,0,71]},
+bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
 cu:{
-"^":"a;LU,ke",
+"^":"a;VX,UX",
 bu:[function(a){var z,y
-z=this.ke
+z=this.UX
 if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},"$0","gAY",0,0,71],
-giO:function(a){return J.v1(this.LU)},
+y=this.VX.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+this.UX=y
+return y},"$0","gCR",0,0,73],
+giO:function(a){return J.v1(this.VX)},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
+return!!J.x(b).$iscu&&J.xC(this.VX,b.VX)},
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
@@ -2082,39 +2024,41 @@
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
-"^":"Xs:5;c",
+"^":"Xs:3;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;zO,Ej,BT,Ua",
-gF4:function(){var z=this.BT
+"^":"a;zO,Yr,HN,mV",
+gHc:function(){var z=this.HN
 if(z!=null)return z
-z=this.Ej
+z=this.Yr
 z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
+this.HN=z
 return z},
-gAT:function(){var z=this.Ua
+gIa:function(){var z=this.mV
 if(z!=null)return z
-z=this.Ej
+z=this.Yr
 z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.Ua=z
+this.mV=z
 return z},
 ik:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
+z=this.Yr.exec(a)
 if(z==null)return
 return H.yx(this,z)},
-zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Ej.test(a)},
-dd:function(a,b){return new H.KW(this,b)},
-yk:function(a,b){var z,y
-z=this.gF4()
+B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
+return this.Yr.test(a)},
+dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+return new H.KW(this,b,c)},
+dd:function(a,b){return this.dm(a,b,0)},
+UZ:function(a,b){var z,y
+z=this.gHc()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
 return H.yx(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
+Oj:function(a,b){var z,y,x,w
+z=this.gIa()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
@@ -2129,10 +2073,10 @@
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
+return this.Oj(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSE:true,
+$iswL:true,
 static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2140,404 +2084,406 @@
 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,null,null))}}},
 EK:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
+"^":"a;zO,pX",
+t:function(a,b){var z=this.pX
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-VO:function(a,b){},
+fw:function(a,b){},
 $isns:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
-z.VO(a,b)
+z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;rN,Vl",
-gA:function(a){return new H.Pb(this.rN,this.Vl,null)},
+"^":"mW;ve,vF,wQ",
+gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
 $asmW:function(){return[P.ns]},
 $asQV:function(){return[P.ns]}},
 Pb:{
-"^":"a;xz,Vl,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.Vl==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
+"^":"a;UW,vF,Ij,Jz",
+gl:function(){return this.Jz},
+G:function(){var z,y,x,w,v
+z=this.vF
+if(z==null)return!1
+y=this.Ij
+if(y<=z.length){x=this.UW.UZ(z,y)
+if(x!=null){this.Jz=x
+z=x.pX
 y=z.index
 if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.Vl,x)
-this.Wh=z
-if(z==null){this.Vl=null
-return!1}return!0}},
+w=J.q8(z[0])
+if(typeof w!=="number")return H.s(w)
+v=y+w
+this.Ij=z.index===v?v+1:v
+return!0}}this.Jz=null
+this.vF=null
+return!1}},
 Vo:{
 "^":"a;M,f1,zO",
 t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
+$isns:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;fi,dB,KW,DX,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
+"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gO9:function(a){return a.IF},
+sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
+gFR:function(a){return a.Qw},
 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)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-gih:function(a){return a.DX},
-sih:function(a,b){a.DX=this.ct(a,C.mJ,a.DX,b)},
-Ut:[function(a,b,c,d){var z=a.fi
+sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
+gph:function(a){return a.cw},
+sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
+pp:[function(a,b,c,d){var z=a.IF
 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,84,46,47,85],
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.DX=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.IF=!1
+a.Qw=null
+a.cw="action"
+a.oX=null
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Df.ZL(a)
-C.Df.XI(a)
+a.n9=x
+a.wy=w
+C.Gx.LX(a)
+C.Gx.XI(a)
 return a}}},
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Si(),"google"),"visualization")
+z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
-Xk:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,12,13],
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.kV(z)},
+return C.xr.iQ(z)},
 n8:function(a){if(a==null)return P.Vu(null,null,null)
-return W.Og("/crdptargets/"+P.jW(C.yD,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
-dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
+return W.qw("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
+dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-avE:[function(a){var z,y,x
+le:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","IZ",2,0,15],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
 P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
+z=C.CD.yu(C.CD.RE(a*1000))
+y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
+x=C.jn.BU(z,60000)
 z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
+w=C.jn.BU(z,1000)
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-As:[function(a){var z=J.Wx(a)
+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.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","pg",2,0,15,16],
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
 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)
+z=J.Dv(J.vX(a,1000))
+y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(z,60000),1000)
+x=C.jn.BU(z,60000)
+w=C.jn.BU(C.jn.Y(z,60000),1000)
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;OJ,Ef,Z6,Eh,m2<,bn,GI,Pv,cC,AP,fn",
-gwv:function(a){return this.Eh},
+"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
+gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
-if(J.xC(this.Eh,b))return
-if(this.Eh!=null){J.Z8(this.cC)
-J.tw(this.Eh)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gO7())
+if(J.xC(this.Nv,b))return
+if(this.Nv!=null){J.Z8(this.cC)
+J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gAQ())
 z=J.RE(b)
-z.giG(b).ml(this.gkq())
+z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gbf())
-J.Sr(z.gRk(b)).yI(this.gI2())
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
+J.Sr(z.gRk(b)).yI(this.gR7())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.gXa())}this.Eh=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-AQ:function(a){var z,y
+qB:function(a){var z,y
 $.Kh=this
-z=this.OJ
+z=this.wc
 z.push(new G.t9(this,null,null,null,null))
-z.push(new G.v5(this,null,null,null,null))
+z.push(new G.ki(this,null,null,null,null))
 z.push(new G.Sy(this,null,null,null,null))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(z.gbQ()),y.Sg),[H.u3(y,0)]).Zz()
-z.Cy()},
-x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
-Vu:[function(a){var z=J.RE(a)
+z.By=this
+y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.aF(z.gnt()),y.el),[H.u3(y,0)]).DN()
+z.VA()},
+pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
+BI:[function(a){var z=J.RE(a)
 switch(z.gfG(a)){case"IsolateCreated":break
-case"IsolateShutdown":this.x3(z.god(a))
+case"IsolateShutdown":this.pZ(z.god(a))
 break
 case"BreakpointResolved":z.god(a).Xb()
 break
-case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.x3(z.god(a))
+case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
 J.bi(this.cC,a)
 break
-default:N.QM("").YX("Unrecognized event type: "+H.d(z.gfG(a)))
-break}},"$1","gI2",2,0,86,2],
-yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,87,24],
-kI:[function(a){this.Pv=a
+default:N.QM("").YX("Unrecognized event: "+H.d(a))
+break}},"$1","gR7",2,0,86,87],
+kj:[function(a){this.Pv=a
+this.aX("error/",null)},"$1","gtb",2,0,88,23],
+m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,88,89],
-og:function(a,b){var z,y,x,w,v,u
+else this.aX("error/",null)},"$1","geO",2,0,89,90],
+aX:function(a,b){var z,y,x,w,v,u
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
 if(y.n(x,"on")){if($.ax==null)$.ax=Z.NY()}else if(y.n(x,"off")){y=$.ax
-if(y!=null){y.RV.ed()
+if(y!=null){y.RV.Gv()
 $.ax=null}}}y=$.ax
-if(y!=null){y.Nu.CH(0)
-J.Z8(y.Rk)}y=this.GI
-if(y!=null)J.CA(y,$.ax)
-for(y=this.OJ,w=0;w<y.length;++w){v=y[w]
-if(v.VU(a)){this.GP(v)
+if(y!=null){y.NP.CH(0)
+J.Z8(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.ax)
+for(y=this.wc,w=0;w<y.length;++w){v=y[w]
+if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
 if(v.gnz(v)&&!J.xC(u,y)){u=new T.qI(v,C.Zg,u,y)
 u.$builtinTypeInfo=[null]
 v.nq(v,u)}v.fz=y
-v.qY(a)
+v.Q0(a)
 return}}throw H.b(P.a9())},
-GP:function(a){var z,y,x,w
-if(J.xC(this.Ef,a))return
-if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
-this.Ef.oV()
-J.r4(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ci()}catch(y){x=H.Ru(y)
+yN:function(a){var z,y,x,w
+if(J.xC(this.fN,a))return
+if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
+this.fN.oV()
+J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
+try{a.ak()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
-this.GI=w
-J.CA(w,$.ax)
-x.appendChild(this.GI)
+this.HJ=w
+J.La(w,$.ax)
+x.appendChild(this.HJ)
 x=a
-w=this.Ef
+w=this.fN
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Ef=x},
-ab:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gO7",2,0,90,91],
-fu:[function(a){if(!J.xC(this.Eh,a))return
+this.nq(this,w)}this.fN=x},
+rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gAQ",2,0,91,92],
+T0:[function(a){if(!J.xC(this.Nv,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,90,91],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.AQ(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+this.qB(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.AQ(!0)},
+this.qB(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"Xs:92;",
+"^":"Xs:93;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
-"^":"Xs:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,93,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 Kf:{
-"^":"a;KJ",
-goH:function(){return this.KJ.nQ("getNumberOfColumns")},
-gvp:function(a){return this.KJ.nQ("getNumberOfRows")},
-Ai:function(){var z=this.KJ
+"^":"a;Yb",
+goH:function(){return this.Yb.nQ("getNumberOfColumns")},
+gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
 Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.KJ.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-qu:{
+this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
+yD:{
 "^":"a;vR,bG",
-W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.KJ,z])}},
+Am:function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.Yb,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(this.ec.Eh==null)b=this.wa("/vm-connect/")
-z=this.c5
+if(this.By.Nv==null)b=this.wa("/vm-connect/")
+z=this.BE
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
-this.c5=b}this.lU(b)},
-lU:function(a){var z,y,x
+this.BE=b}this.UJ(b)},
+UJ:function(a){var z,y,x
 if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
 if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.Gs(a,"---")){z=a.split("---")
+if(C.xB.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
 if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
+this.By.aX(a,x)},
 Cz:function(a,b,c){var z,y,x
-z=J.Vs(c).MW.getAttribute("href")
+z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gpL(a)
+x=y.gEV(a)
 if(typeof x!=="number")return x.D()
 if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
 this.bo(0,z)
 y.e6(a)}},
 ng:{
-"^":"yVe;MP,ec,c5,ro,dUC,U3",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
+"^":"yVe;Zz,By,BE,ro,XY,cU",
+VA:function(){var z=H.d(window.location.hash)
+if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,94,14],
+this.UJ(window.location.hash)},
+fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
-gKw:function(a){return this.fz},
-sKw:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
+gl6:function(a){return this.fz},
+sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
 $isOS:true},
 by:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){if(J.xC(a,""))return
-this.i6.Eh.cv(a).ml(new G.mo(this)).OA(new G.pa())},
+Q0:function(a){if(J.xC(a,""))return
+this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
-mo:{
-"^":"Xs:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,95,"call"],
+GL:{
+"^":"Xs:12;a",
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-pa:{
-"^":"Xs:13;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+mo:{
+"^":"Xs:12;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){a=J.ZZ(a,11)
-this.i6.Eh.cv(a).ml(new G.Za(this)).OA(new G.ha())},
+Q0:function(a){a=J.ZZ(a,11)
+this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Za:{
-"^":"Xs:13;a",
+Hb:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,96,"call"],
+if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ha:{
-"^":"Xs:13;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+ZaW:{
+"^":"Xs:12;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Sy:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){var z,y
+Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
 z.Ll=J.Q5(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
-v5:{
-"^":"OS;i6,yF,fz,AP,fn",
-ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+ki:{
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
-qY:function(a){},
+Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.Xk(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
-"^":"Xs:5;",
+"^":"Xs:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.kV(a)
+z=C.xr.iQ(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,97,"call"],
+y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,98,"call"],
 $isEH:true},
 XN:{
-"^":"Xs:13;",
-$1:[function(a){},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,bq>,TY,ro,dUC,U3",
-BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.MG(a)
+"^":"d3;wo,bq>,TY,ro,XY,cU",
+k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
+TP:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
 return z},
-MG:function(a){var z,y
+Xk:function(a){var z,y
 z={}
 z.a=null
 y=this.bq
-y.aN(y,new G.La(z,a))
+y.aN(y,new G.pJO(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
 z=this.bq
-if(z.Gs(z,b))return
+if(z.tg(z,b))return
 z.h(0,b)
-this.XT()
-this.XT()
-y=this.wu.IU+".history"
+this.TV()
+this.TV()
+y=this.wo.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
 z=this.bq
 z.Rz(0,b)
-this.XT()
-this.XT()
-y=this.wu.IU+".history"
+this.TV()
+this.TV()
+y=this.wo.IU+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-XT:function(){var z=this.bq
+TV:function(){var z=this.bq
 z.GT(z,new G.jQ())},
-UJ:function(){var z,y,x,w,v
+A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.Xk(this.wu.IU+".history")
+y=G.DUC(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2545,85 +2491,87 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
-this.XT()},
-Ff:function(){this.UJ()
-var z=this.TP(this.BZ())
+this.TV()},
+lK:function(){this.A7()
+var z=this.TP(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
-La:{
-"^":"Xs:13;a,b",
+pJO:{
+"^":"Xs:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"Xs:98;",
+"^":"Xs:99;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
 gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
+goE:function(a){return this.Lk},
+soE:function(a,b){var z=J.xC(this.Lk,b)
+this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.o8()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
+this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
+this.cO()}}},
+r8:function(){this.soE(0,this.Lk!==!0)
+return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-kf:{
-"^":"Pi;vp>,AP,fn",
-mA:function(a){var z,y
+ih:{
+"^":"Pi;vp>,Vg,fn",
+G7:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
-a.C4(0)
+a.Pz(0)
 y.FV(z,a.ks)},
-qU:function(a){var z,y,x
+lo:function(a){var z,y,x
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.oF(z,y.Mw(z,x)+1,J.Mx(x))
-else this.FS(x)},
-FS:function(a){var z,y,x,w,v
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
+else this.nm(x)},
+nm:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gks(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
-v=w.Mw(z,a)+1
-w.UZ(z,v,v+y)}},
+v=w.OY(z,a)+1
+w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,17]}},
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
-Vz0:{
+Vz:{
 "^":"Pi;oH<,vp>,zz<",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
+gT3:function(){return this.Rj},
+sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
+wA:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.UQ(J.hI(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gCS",4,0,99],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,99],
+oa:[function(a,b){var z=this.wA(a,this.pT)
+return J.FW(this.wA(b,this.pT),z)},"$2","gMG",4,0,100],
+ws:[function(a,b){return J.FW(this.wA(a,this.pT),this.wA(b,this.pT))},"$2","gTF",4,0,100],
 Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
+H.Xe()
+$.Ji=$.xG
+new P.VV(null,null).wE(0)
 z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gPd()
-H.rd(z,y)}},
+if(this.Rj){y=this.gMG()
+H.ig(z,y)}else{y=this.gTF()
+H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
 Id:function(a,b){var z=this.vp
@@ -2636,2042 +2584,2102 @@
 z=this.oH
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
-YU:[function(a){var z
+ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,100]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+z=J.ZC(z[a])
+return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
-Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.WQ,new E.e46(),C.fV,new E.e47(),C.jU,new E.e48(),C.OO,new E.e49(),C.Mc,new E.e50(),C.FP,new E.e51(),C.kF,new E.e52(),C.UD,new E.e53(),C.Aq,new E.e54(),C.DS,new E.e55(),C.C9,new E.e56(),C.VF,new E.e57(),C.uU,new E.e58(),C.YJ,new E.e59(),C.eF,new E.e60(),C.oI,new E.e61(),C.ST,new E.e62(),C.QH,new E.e63(),C.qX,new E.e64(),C.rE,new E.e65(),C.nf,new E.e66(),C.EI,new E.e67(),C.JB,new E.e68(),C.RY,new E.e69(),C.d4,new E.e70(),C.cF,new E.e71(),C.SI,new E.e72(),C.zS,new E.e73(),C.YA,new E.e74(),C.Ge,new E.e75(),C.A7,new E.e76(),C.He,new E.e77(),C.im,new E.e78(),C.Ss,new E.e79(),C.k6,new E.e80(),C.oj,new E.e81(),C.PJ,new E.e82(),C.q2,new E.e83(),C.d2,new E.e84(),C.kN,new E.e85(),C.fn,new E.e86(),C.yB,new E.e87(),C.eJ,new E.e88(),C.iG,new E.e89(),C.Py,new E.e90(),C.pC,new E.e91(),C.uu,new E.e92(),C.qs,new E.e93(),C.XH,new E.e94(),C.tJ,new E.e95(),C.F8,new E.e96(),C.C1,new E.e97(),C.Nr,new E.e98(),C.nL,new E.e99(),C.a0,new E.e100(),C.Yg,new E.e101(),C.bR,new E.e102(),C.ai,new E.e103(),C.ob,new E.e104(),C.MY,new E.e105(),C.Iv,new E.e106(),C.Wg,new E.e107(),C.tD,new E.e108(),C.QS,new E.e109(),C.nZ,new E.e110(),C.Of,new E.e111(),C.Vl,new E.e112(),C.pY,new E.e113(),C.XL,new E.e114(),C.LA,new E.e115(),C.AT,new E.e116(),C.Lk,new E.e117(),C.dK,new E.e118(),C.xf,new E.e119(),C.rB,new E.e120(),C.bz,new E.e121(),C.Jx,new E.e122(),C.b5,new E.e123(),C.z6,new E.e124(),C.SY,new E.e125(),C.Lc,new E.e126(),C.hf,new E.e127(),C.uk,new E.e128(),C.Zi,new E.e129(),C.TN,new E.e130(),C.GI,new E.e131(),C.Wn,new E.e132(),C.ur,new E.e133(),C.VN,new E.e134(),C.EV,new E.e135(),C.VI,new E.e136(),C.eh,new E.e137(),C.SA,new E.e138(),C.uG,new E.e139(),C.kV,new E.e140(),C.vp,new E.e141(),C.cc,new E.e142(),C.DY,new E.e143(),C.Lx,new E.e144(),C.M3,new E.e145(),C.wT,new E.e146(),C.JK,new E.e147(),C.SR,new E.e148(),C.t6,new E.e149(),C.rP,new E.e150(),C.pX,new E.e151(),C.VD,new E.e152(),C.NN,new E.e153(),C.UX,new E.e154(),C.YS,new E.e155(),C.pu,new E.e156(),C.BJ,new E.e157(),C.c6,new E.e158(),C.td,new E.e159(),C.Gn,new E.e160(),C.zO,new E.e161(),C.vg,new E.e162(),C.YV,new E.e163(),C.If,new E.e164(),C.Ys,new E.e165(),C.zm,new E.e166(),C.nX,new E.e167(),C.xP,new E.e168(),C.XM,new E.e169(),C.Ic,new E.e170(),C.yG,new E.e171(),C.uI,new E.e172(),C.O9,new E.e173(),C.ba,new E.e174(),C.tW,new E.e175(),C.CG,new E.e176(),C.Jf,new E.e177(),C.Wj,new E.e178(),C.vb,new E.e179(),C.UL,new E.e180(),C.AY,new E.e181(),C.QK,new E.e182(),C.AO,new E.e183(),C.Xd,new E.e184(),C.I7,new E.e185(),C.kY,new E.e186(),C.Wm,new E.e187(),C.GR,new E.e188(),C.KX,new E.e189(),C.ja,new E.e190(),C.Dj,new E.e191(),C.ir,new E.e192(),C.dx,new E.e193(),C.ni,new E.e194(),C.X2,new E.e195(),C.F3,new E.e196(),C.UY,new E.e197(),C.Aa,new E.e198(),C.nY,new E.e199(),C.tg,new E.e200(),C.HD,new E.e201(),C.iU,new E.e202(),C.eN,new E.e203(),C.ue,new E.e204(),C.nh,new E.e205(),C.L2,new E.e206(),C.Gs,new E.e207(),C.bE,new E.e208(),C.YD,new E.e209(),C.PX,new E.e210(),C.N8,new E.e211(),C.EA,new E.e212(),C.oW,new E.e213(),C.hd,new E.e214(),C.pH,new E.e215(),C.Ve,new E.e216(),C.jM,new E.e217(),C.W5,new E.e218(),C.uX,new E.e219(),C.nt,new E.e220(),C.IT,new E.e221(),C.li,new E.e222(),C.PM,new E.e223(),C.ks,new E.e224(),C.Om,new E.e225(),C.iC,new E.e226(),C.k5,new E.e227(),C.Nv,new E.e228(),C.Cw,new E.e229(),C.TW,new E.e230(),C.xS,new E.e231(),C.ft,new E.e232(),C.QF,new E.e233(),C.mi,new E.e234(),C.zz,new E.e235(),C.eO,new E.e236(),C.hO,new E.e237(),C.ei,new E.e238(),C.HK,new E.e239(),C.je,new E.e240(),C.Ef,new E.e241(),C.QL,new E.e242(),C.RH,new E.e243(),C.SP,new E.e244(),C.Q1,new E.e245(),C.ID,new E.e246(),C.dA,new E.e247(),C.bc,new E.e248(),C.kw,new E.e249(),C.nE,new E.e250(),C.ep,new E.e251(),C.J2,new E.e252(),C.zU,new E.e253(),C.OU,new E.e254(),C.bn,new E.e255(),C.mh,new E.e256(),C.Fh,new E.e257(),C.yv,new E.e258(),C.LP,new E.e259(),C.jh,new E.e260(),C.fj,new E.e261(),C.xw,new E.e262(),C.zn,new E.e263(),C.RJ,new E.e264(),C.Tc,new E.e265(),C.YE,new E.e266(),C.Uy,new E.e267()],null,null)
-y=P.EF([C.aP,new E.e268(),C.cg,new E.e269(),C.Zg,new E.e270(),C.S4,new E.e271(),C.AV,new E.e272(),C.bk,new E.e273(),C.lH,new E.e274(),C.am,new E.e275(),C.oE,new E.e276(),C.kG,new E.e277(),C.XA,new E.e278(),C.i4,new E.e279(),C.mJ,new E.e280(),C.yL,new E.e281(),C.bJ,new E.e282(),C.kI,new E.e283(),C.vY,new E.e284(),C.VK,new E.e285(),C.aH,new E.e286(),C.GP,new E.e287(),C.vs,new E.e288(),C.Gr,new E.e289(),C.Fe,new E.e290(),C.tP,new E.e291(),C.yh,new E.e292(),C.Zb,new E.e293(),C.p8,new E.e294(),C.ld,new E.e295(),C.ne,new E.e296(),C.B0,new E.e297(),C.mr,new E.e298(),C.YT,new E.e299(),C.WQ,new E.e300(),C.jU,new E.e301(),C.OO,new E.e302(),C.Mc,new E.e303(),C.QH,new E.e304(),C.rE,new E.e305(),C.nf,new E.e306(),C.Ge,new E.e307(),C.A7,new E.e308(),C.He,new E.e309(),C.oj,new E.e310(),C.d2,new E.e311(),C.fn,new E.e312(),C.yB,new E.e313(),C.Py,new E.e314(),C.uu,new E.e315(),C.qs,new E.e316(),C.rB,new E.e317(),C.hf,new E.e318(),C.uk,new E.e319(),C.Zi,new E.e320(),C.TN,new E.e321(),C.ur,new E.e322(),C.EV,new E.e323(),C.VI,new E.e324(),C.eh,new E.e325(),C.SA,new E.e326(),C.uG,new E.e327(),C.kV,new E.e328(),C.vp,new E.e329(),C.SR,new E.e330(),C.t6,new E.e331(),C.UX,new E.e332(),C.YS,new E.e333(),C.c6,new E.e334(),C.td,new E.e335(),C.zO,new E.e336(),C.YV,new E.e337(),C.If,new E.e338(),C.Ys,new E.e339(),C.nX,new E.e340(),C.XM,new E.e341(),C.Ic,new E.e342(),C.O9,new E.e343(),C.tW,new E.e344(),C.Wj,new E.e345(),C.vb,new E.e346(),C.QK,new E.e347(),C.Xd,new E.e348(),C.kY,new E.e349(),C.GR,new E.e350(),C.KX,new E.e351(),C.ja,new E.e352(),C.Dj,new E.e353(),C.X2,new E.e354(),C.UY,new E.e355(),C.Aa,new E.e356(),C.nY,new E.e357(),C.tg,new E.e358(),C.HD,new E.e359(),C.iU,new E.e360(),C.eN,new E.e361(),C.Gs,new E.e362(),C.bE,new E.e363(),C.YD,new E.e364(),C.PX,new E.e365(),C.pH,new E.e366(),C.Ve,new E.e367(),C.jM,new E.e368(),C.uX,new E.e369(),C.nt,new E.e370(),C.IT,new E.e371(),C.PM,new E.e372(),C.ks,new E.e373(),C.Om,new E.e374(),C.iC,new E.e375(),C.Nv,new E.e376(),C.Cw,new E.e377(),C.TW,new E.e378(),C.ft,new E.e379(),C.mi,new E.e380(),C.zz,new E.e381(),C.dA,new E.e382(),C.kw,new E.e383(),C.nE,new E.e384(),C.zU,new E.e385(),C.OU,new E.e386(),C.RJ,new E.e387(),C.YE,new E.e388()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,P.Fl(null,null),C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.b6,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.b6,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.b6,C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+De:[function(){var z,y,x
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.mJ,new E.e6(),C.qt,new E.e7(),C.p1,new E.e8(),C.yJ,new E.e9(),C.la,new E.e10(),C.yL,new E.e11(),C.bJ,new E.e12(),C.ox,new E.e13(),C.Je,new E.e14(),C.kI,new E.e15(),C.vY,new E.e16(),C.Rs,new E.e17(),C.Lw,new E.e18(),C.eR,new E.e19(),C.iE,new E.e20(),C.f4,new E.e21(),C.VK,new E.e22(),C.aH,new E.e23(),C.aK,new E.e24(),C.GP,new E.e25(),C.vs,new E.e26(),C.Gr,new E.e27(),C.TU,new E.e28(),C.Fe,new E.e29(),C.tP,new E.e30(),C.yh,new E.e31(),C.Zb,new E.e32(),C.u7,new E.e33(),C.p8,new E.e34(),C.qR,new E.e35(),C.ld,new E.e36(),C.ne,new E.e37(),C.B0,new E.e38(),C.r1,new E.e39(),C.mr,new E.e40(),C.Ek,new E.e41(),C.Pn,new E.e42(),C.YT,new E.e43(),C.h7,new E.e44(),C.R3,new E.e45(),C.cJ,new E.e46(),C.WQ,new E.e47(),C.fV,new E.e48(),C.jU,new E.e49(),C.OO,new E.e50(),C.Mc,new E.e51(),C.FP,new E.e52(),C.kF,new E.e53(),C.UD,new E.e54(),C.Aq,new E.e55(),C.DS,new E.e56(),C.C9,new E.e57(),C.VF,new E.e58(),C.uU,new E.e59(),C.YJ,new E.e60(),C.eF,new E.e61(),C.oI,new E.e62(),C.ST,new E.e63(),C.QH,new E.e64(),C.qX,new E.e65(),C.rE,new E.e66(),C.nf,new E.e67(),C.EI,new E.e68(),C.JB,new E.e69(),C.RY,new E.e70(),C.d4,new E.e71(),C.cF,new E.e72(),C.SI,new E.e73(),C.zS,new E.e74(),C.YA,new E.e75(),C.Ge,new E.e76(),C.A7,new E.e77(),C.He,new E.e78(),C.im,new E.e79(),C.Ss,new E.e80(),C.k6,new E.e81(),C.oj,new E.e82(),C.PJ,new E.e83(),C.q2,new E.e84(),C.d2,new E.e85(),C.kN,new E.e86(),C.uO,new E.e87(),C.fn,new E.e88(),C.yB,new E.e89(),C.eJ,new E.e90(),C.iG,new E.e91(),C.Py,new E.e92(),C.pC,new E.e93(),C.uu,new E.e94(),C.qs,new E.e95(),C.XH,new E.e96(),C.tJ,new E.e97(),C.F8,new E.e98(),C.C1,new E.e99(),C.Nr,new E.e100(),C.nL,new E.e101(),C.a0,new E.e102(),C.Yg,new E.e103(),C.bR,new E.e104(),C.ai,new E.e105(),C.ob,new E.e106(),C.MY,new E.e107(),C.Iv,new E.e108(),C.Wg,new E.e109(),C.tD,new E.e110(),C.QS,new E.e111(),C.nZ,new E.e112(),C.Of,new E.e113(),C.Vl,new E.e114(),C.pY,new E.e115(),C.XL,new E.e116(),C.LA,new E.e117(),C.nQ,new E.e118(),C.AT,new E.e119(),C.Lk,new E.e120(),C.dK,new E.e121(),C.xf,new E.e122(),C.rB,new E.e123(),C.bz,new E.e124(),C.Jx,new E.e125(),C.b5,new E.e126(),C.z6,new E.e127(),C.SY,new E.e128(),C.Lc,new E.e129(),C.hf,new E.e130(),C.uk,new E.e131(),C.Zi,new E.e132(),C.TN,new E.e133(),C.GI,new E.e134(),C.Wn,new E.e135(),C.ur,new E.e136(),C.VN,new E.e137(),C.EV,new E.e138(),C.VI,new E.e139(),C.eh,new E.e140(),C.SA,new E.e141(),C.uG,new E.e142(),C.kV,new E.e143(),C.vp,new E.e144(),C.cc,new E.e145(),C.DY,new E.e146(),C.Lx,new E.e147(),C.M3,new E.e148(),C.wT,new E.e149(),C.JK,new E.e150(),C.SR,new E.e151(),C.t6,new E.e152(),C.rP,new E.e153(),C.pX,new E.e154(),C.VD,new E.e155(),C.NN,new E.e156(),C.UX,new E.e157(),C.YS,new E.e158(),C.pu,new E.e159(),C.BJ,new E.e160(),C.c6,new E.e161(),C.td,new E.e162(),C.Gn,new E.e163(),C.zO,new E.e164(),C.vg,new E.e165(),C.YV,new E.e166(),C.If,new E.e167(),C.Ys,new E.e168(),C.zm,new E.e169(),C.nX,new E.e170(),C.xP,new E.e171(),C.XM,new E.e172(),C.Ic,new E.e173(),C.yG,new E.e174(),C.uI,new E.e175(),C.O9,new E.e176(),C.ba,new E.e177(),C.tW,new E.e178(),C.CG,new E.e179(),C.Jf,new E.e180(),C.Wj,new E.e181(),C.vb,new E.e182(),C.UL,new E.e183(),C.AY,new E.e184(),C.QK,new E.e185(),C.AO,new E.e186(),C.Xd,new E.e187(),C.I7,new E.e188(),C.kY,new E.e189(),C.Wm,new E.e190(),C.vK,new E.e191(),C.GR,new E.e192(),C.KX,new E.e193(),C.ja,new E.e194(),C.Dj,new E.e195(),C.ir,new E.e196(),C.dx,new E.e197(),C.ni,new E.e198(),C.X2,new E.e199(),C.F3,new E.e200(),C.UY,new E.e201(),C.Aa,new E.e202(),C.nY,new E.e203(),C.tg,new E.e204(),C.HD,new E.e205(),C.iU,new E.e206(),C.eN,new E.e207(),C.ue,new E.e208(),C.nh,new E.e209(),C.L2,new E.e210(),C.Gs,new E.e211(),C.bE,new E.e212(),C.YD,new E.e213(),C.PX,new E.e214(),C.N8,new E.e215(),C.EA,new E.e216(),C.oW,new E.e217(),C.hd,new E.e218(),C.Jd,new E.e219(),C.Y4,new E.e220(),C.Si,new E.e221(),C.pH,new E.e222(),C.Ve,new E.e223(),C.jM,new E.e224(),C.rd,new E.e225(),C.W5,new E.e226(),C.uX,new E.e227(),C.nt,new E.e228(),C.IT,new E.e229(),C.li,new E.e230(),C.PM,new E.e231(),C.ks,new E.e232(),C.Om,new E.e233(),C.iC,new E.e234(),C.Nv,new E.e235(),C.Wo,new E.e236(),C.FZ,new E.e237(),C.TW,new E.e238(),C.xS,new E.e239(),C.ft,new E.e240(),C.QF,new E.e241(),C.mi,new E.e242(),C.zz,new E.e243(),C.eO,new E.e244(),C.hO,new E.e245(),C.ei,new E.e246(),C.HK,new E.e247(),C.je,new E.e248(),C.Ef,new E.e249(),C.QL,new E.e250(),C.RH,new E.e251(),C.SP,new E.e252(),C.Q1,new E.e253(),C.ID,new E.e254(),C.dA,new E.e255(),C.bc,new E.e256(),C.kw,new E.e257(),C.nE,new E.e258(),C.ep,new E.e259(),C.J2,new E.e260(),C.zU,new E.e261(),C.OU,new E.e262(),C.bn,new E.e263(),C.mh,new E.e264(),C.Fh,new E.e265(),C.yv,new E.e266(),C.LP,new E.e267(),C.jh,new E.e268(),C.fj,new E.e269(),C.xw,new E.e270(),C.zn,new E.e271(),C.RJ,new E.e272(),C.Tc,new E.e273(),C.YE,new E.e274(),C.Uy,new E.e275()],null,null)
+y=P.EF([C.aP,new E.e276(),C.cg,new E.e277(),C.Zg,new E.e278(),C.S4,new E.e279(),C.AV,new E.e280(),C.bk,new E.e281(),C.lH,new E.e282(),C.am,new E.e283(),C.oE,new E.e284(),C.kG,new E.e285(),C.XA,new E.e286(),C.i4,new E.e287(),C.mJ,new E.e288(),C.yL,new E.e289(),C.bJ,new E.e290(),C.kI,new E.e291(),C.vY,new E.e292(),C.VK,new E.e293(),C.aH,new E.e294(),C.GP,new E.e295(),C.vs,new E.e296(),C.Gr,new E.e297(),C.Fe,new E.e298(),C.tP,new E.e299(),C.yh,new E.e300(),C.Zb,new E.e301(),C.p8,new E.e302(),C.ld,new E.e303(),C.ne,new E.e304(),C.B0,new E.e305(),C.mr,new E.e306(),C.YT,new E.e307(),C.cJ,new E.e308(),C.WQ,new E.e309(),C.jU,new E.e310(),C.OO,new E.e311(),C.Mc,new E.e312(),C.QH,new E.e313(),C.rE,new E.e314(),C.nf,new E.e315(),C.Ge,new E.e316(),C.A7,new E.e317(),C.He,new E.e318(),C.oj,new E.e319(),C.d2,new E.e320(),C.uO,new E.e321(),C.fn,new E.e322(),C.yB,new E.e323(),C.Py,new E.e324(),C.uu,new E.e325(),C.qs,new E.e326(),C.rB,new E.e327(),C.hf,new E.e328(),C.uk,new E.e329(),C.Zi,new E.e330(),C.TN,new E.e331(),C.ur,new E.e332(),C.EV,new E.e333(),C.VI,new E.e334(),C.eh,new E.e335(),C.SA,new E.e336(),C.uG,new E.e337(),C.kV,new E.e338(),C.vp,new E.e339(),C.SR,new E.e340(),C.t6,new E.e341(),C.UX,new E.e342(),C.YS,new E.e343(),C.c6,new E.e344(),C.td,new E.e345(),C.zO,new E.e346(),C.YV,new E.e347(),C.If,new E.e348(),C.Ys,new E.e349(),C.nX,new E.e350(),C.XM,new E.e351(),C.Ic,new E.e352(),C.O9,new E.e353(),C.tW,new E.e354(),C.Wj,new E.e355(),C.vb,new E.e356(),C.QK,new E.e357(),C.Xd,new E.e358(),C.kY,new E.e359(),C.vK,new E.e360(),C.GR,new E.e361(),C.KX,new E.e362(),C.ja,new E.e363(),C.Dj,new E.e364(),C.X2,new E.e365(),C.UY,new E.e366(),C.Aa,new E.e367(),C.nY,new E.e368(),C.tg,new E.e369(),C.HD,new E.e370(),C.iU,new E.e371(),C.eN,new E.e372(),C.Gs,new E.e373(),C.bE,new E.e374(),C.YD,new E.e375(),C.PX,new E.e376(),C.Jd,new E.e377(),C.pH,new E.e378(),C.Ve,new E.e379(),C.jM,new E.e380(),C.rd,new E.e381(),C.uX,new E.e382(),C.nt,new E.e383(),C.IT,new E.e384(),C.PM,new E.e385(),C.ks,new E.e386(),C.Om,new E.e387(),C.iC,new E.e388(),C.Nv,new E.e389(),C.FZ,new E.e390(),C.TW,new E.e391(),C.ft,new E.e392(),C.mi,new E.e393(),C.zz,new E.e394(),C.dA,new E.e395(),C.kw,new E.e396(),C.nE,new E.e397(),C.zU,new E.e398(),C.OU,new E.e399(),C.RJ,new E.e400(),C.YE,new E.e401()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.al,C.Wz,C.il,C.k5,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.Yo],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.uC,P.EF([C.uO,C.KK],null,null),C.Wz,P.Fl(null,null),C.k5,P.EF([C.uO,C.JT,C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.hr,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.FB,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.JM,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.K1,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.kH,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.rZ],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.il,P.EF([C.uu,C.yY,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.b6,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.b6,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.b6,C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.ft,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.Ul,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.I9,"closeItem",C.To,"closing",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.Lw,"deleteVm",C.eR,"deoptimizations",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.tJ,"isBool",C.F8,"isChromeTarget",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.MY,"isInlinable",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.nQ,"isPsuedoNull",C.AT,"isStatic",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.nX,"parent",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.ft,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
-$.M6=[new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470()]
+$.M6=[new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446(),new E.e447(),new E.e448(),new E.e449(),new E.e450(),new E.e451(),new E.e452(),new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485()]
 $.UG=!0
-F.E2()},"$0","rk",0,0,18],
+F.E2()},"$0","KU",0,0,17],
 em:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gYu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QA:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ln(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.FS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Cv:{
-"^":"Xs:13;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
-"^":"Xs:13;",
-$1:[function(a){return J.pP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
-"^":"Xs:13;",
-$1:[function(a){return a.gA3()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gA3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Or:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 YL:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqr()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqr()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
-"^":"Xs:13;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oa:{
-"^":"Xs:13;",
-$1:[function(a){return J.nG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
-"^":"Xs:13;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lbd:{
-"^":"Xs:13;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
-"^":"Xs:13;",
-$1:[function(a){return J.WT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.WT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
-"^":"Xs:13;",
-$1:[function(a){return a.gCs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 edy:{
-"^":"Xs:13;",
-$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
-"^":"Xs:13;",
-$1:[function(a){return J.n9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.n9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
-"^":"Xs:13;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 YLa:{
-"^":"Xs:13;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
-"^":"Xs:13;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
-"^":"Xs:13;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
-"^":"Xs:13;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
-"^":"Xs:13;",
-$1:[function(a){return J.Uf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
-"^":"Xs:13;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e3:{
-"^":"Xs:13;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e4:{
-"^":"Xs:13;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
-"^":"Xs:13;",
-$1:[function(a){return J.on(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.on(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
-"^":"Xs:13;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e7:{
-"^":"Xs:13;",
-$1:[function(a){return J.SM(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.SM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e8:{
-"^":"Xs:13;",
-$1:[function(a){return a.goH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.goH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
-"^":"Xs:13;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
-"^":"Xs:13;",
-$1:[function(a){return J.ev(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ev(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
-"^":"Xs:13;",
-$1:[function(a){return J.xe(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.xe(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e12:{
-"^":"Xs:13;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e13:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
-"^":"Xs:13;",
-$1:[function(a){return a.gl()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e15:{
-"^":"Xs:13;",
-$1:[function(a){return J.h6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.h6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e16:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e17:{
-"^":"Xs:13;",
-$1:[function(a){return J.P3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Cg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
-"^":"Xs:13;",
-$1:[function(a){return J.W3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
-"^":"Xs:13;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e20:{
-"^":"Xs:13;",
-$1:[function(a){return a.gP9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e21:{
-"^":"Xs:13;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
-"^":"Xs:13;",
-$1:[function(a){return J.mP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e23:{
-"^":"Xs:13;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e24:{
-"^":"Xs:13;",
-$1:[function(a){return J.vi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e25:{
-"^":"Xs:13;",
-$1:[function(a){return J.nq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e26:{
-"^":"Xs:13;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
-"^":"Xs:13;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
-"^":"Xs:13;",
-$1:[function(a){return J.lk(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e29:{
-"^":"Xs:13;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e30:{
-"^":"Xs:13;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
-"^":"Xs:13;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
-"^":"Xs:13;",
-$1:[function(a){return J.is(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
-"^":"Xs:13;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e34:{
-"^":"Xs:13;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e36:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ky(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ky(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
-"^":"Xs:13;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
-"^":"Xs:13;",
-$1:[function(a){return J.kE(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e39:{
-"^":"Xs:13;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e40:{
-"^":"Xs:13;",
-$1:[function(a){return J.Mz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Mz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e41:{
-"^":"Xs:13;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e42:{
-"^":"Xs:13;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
-"^":"Xs:13;",
-$1:[function(a){return J.yn(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
-"^":"Xs:13;",
-$1:[function(a){return a.gx5()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e46:{
-"^":"Xs:13;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e47:{
-"^":"Xs:13;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e48:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
-"^":"Xs:13;",
-$1:[function(a){return J.ra(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e50:{
-"^":"Xs:13;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
-"^":"Xs:13;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
-"^":"Xs:13;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e54:{
-"^":"Xs:13;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
-"^":"Xs:13;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
-"^":"Xs:13;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e58:{
-"^":"Xs:13;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
-"^":"Xs:13;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
-"^":"Xs:13;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
-"^":"Xs:13;",
-$1:[function(a){return a.gJz()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
-"^":"Xs:13;",
-$1:[function(a){return J.PY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e63:{
-"^":"Xs:13;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e64:{
-"^":"Xs:13;",
-$1:[function(a){return J.m8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e65:{
-"^":"Xs:13;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
-"^":"Xs:13;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
-"^":"Xs:13;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
-"^":"Xs:13;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e69:{
-"^":"Xs:13;",
-$1:[function(a){return J.MB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e70:{
-"^":"Xs:13;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e71:{
-"^":"Xs:13;",
-$1:[function(a){return J.DB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGf()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e74:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
-"^":"Xs:13;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e76:{
-"^":"Xs:13;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e77:{
-"^":"Xs:13;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e78:{
-"^":"Xs:13;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e79:{
-"^":"Xs:13;",
-$1:[function(a){return a.gu9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
-"^":"Xs:13;",
-$1:[function(a){return J.aW(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
-"^":"Xs:13;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.z4(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e82:{
-"^":"Xs:13;",
-$1:[function(a){return a.gL4()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e83:{
-"^":"Xs:13;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e84:{
-"^":"Xs:13;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
-"^":"Xs:13;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e86:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e87:{
-"^":"Xs:13;",
-$1:[function(a){return J.AR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e88:{
-"^":"Xs:13;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
-"^":"Xs:13;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e90:{
-"^":"Xs:13;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e91:{
-"^":"Xs:13;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e92:{
-"^":"Xs:13;",
-$1:[function(a){return J.UU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e93:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.IA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e95:{
-"^":"Xs:13;",
-$1:[function(a){return J.Xi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e96:{
-"^":"Xs:13;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e97:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.RM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e98:{
-"^":"Xs:13;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e99:{
-"^":"Xs:13;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e100:{
-"^":"Xs:13;",
-$1:[function(a){return a.gni()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
-"^":"Xs:13;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
-"^":"Xs:13;",
-$1:[function(a){return J.wz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gni()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
-"^":"Xs:13;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e104:{
-"^":"Xs:13;",
-$1:[function(a){return J.ls(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.wz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e105:{
-"^":"Xs:13;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e106:{
-"^":"Xs:13;",
-$1:[function(a){return J.iy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e107:{
-"^":"Xs:13;",
-$1:[function(a){return J.SZ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e108:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e109:{
-"^":"Xs:13;",
-$1:[function(a){return J.DR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.k9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e110:{
-"^":"Xs:13;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e111:{
-"^":"Xs:13;",
-$1:[function(a){return J.cU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
-"^":"Xs:13;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e113:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYG()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e114:{
-"^":"Xs:13;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
-"^":"Xs:13;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
-"^":"Xs:13;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e117:{
-"^":"Xs:13;",
-$1:[function(a){return J.j0(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
-"^":"Xs:13;",
-$1:[function(a){return J.ZN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Bo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e119:{
-"^":"Xs:13;",
-$1:[function(a){return J.fD(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e120:{
-"^":"Xs:13;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e121:{
-"^":"Xs:13;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
-"^":"Xs:13;",
-$1:[function(a){return a.giR()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fD(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e124:{
-"^":"Xs:13;",
-$1:[function(a){return J.A6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e125:{
-"^":"Xs:13;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e126:{
-"^":"Xs:13;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
-"^":"Xs:13;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e128:{
-"^":"Xs:13;",
-$1:[function(a){return J.uY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e129:{
-"^":"Xs:13;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e130:{
-"^":"Xs:13;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e131:{
-"^":"Xs:13;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e132:{
-"^":"Xs:13;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e133:{
-"^":"Xs:13;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e134:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e135:{
-"^":"Xs:13;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e136:{
-"^":"Xs:13;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e137:{
-"^":"Xs:13;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e138:{
-"^":"Xs:13;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
-"^":"Xs:13;",
-$1:[function(a){return J.fy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
-"^":"Xs:13;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e141:{
-"^":"Xs:13;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e143:{
-"^":"Xs:13;",
-$1:[function(a){return a.gMN()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
-"^":"Xs:13;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e145:{
-"^":"Xs:13;",
-$1:[function(a){return a.gmd()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
-"^":"Xs:13;",
-$1:[function(a){return a.geH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
-"^":"Xs:13;",
-$1:[function(a){return J.yc(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e148:{
-"^":"Xs:13;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e150:{
-"^":"Xs:13;",
-$1:[function(a){return J.ih(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e151:{
-"^":"Xs:13;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
-"^":"Xs:13;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
-"^":"Xs:13;",
-$1:[function(a){return J.Lh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
-"^":"Xs:13;",
-$1:[function(a){return J.rK(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e155:{
-"^":"Xs:13;",
-$1:[function(a){return J.O6(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e156:{
-"^":"Xs:13;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e157:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.rK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e158:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e159:{
-"^":"Xs:13;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e160:{
-"^":"Xs:13;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e161:{
-"^":"Xs:13;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e162:{
-"^":"Xs:13;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e163:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
-"^":"Xs:13;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e165:{
-"^":"Xs:13;",
-$1:[function(a){return J.ee(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
-"^":"Xs:13;",
-$1:[function(a){return J.JG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e167:{
-"^":"Xs:13;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
-"^":"Xs:13;",
-$1:[function(a){return J.z1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
-"^":"Xs:13;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
-"^":"Xs:13;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e171:{
-"^":"Xs:13;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e172:{
-"^":"Xs:13;",
-$1:[function(a){return a.gcD()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
-"^":"Xs:13;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
-"^":"Xs:13;",
-$1:[function(a){return J.tC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e175:{
-"^":"Xs:13;",
-$1:[function(a){return J.PB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e176:{
-"^":"Xs:13;",
-$1:[function(a){return J.xd(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
-"^":"Xs:13;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e178:{
-"^":"Xs:13;",
-$1:[function(a){return J.Qa(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
-"^":"Xs:13;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
-"^":"Xs:13;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e181:{
-"^":"Xs:13;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.JX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e182:{
-"^":"Xs:13;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
-"^":"Xs:13;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e184:{
-"^":"Xs:13;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e185:{
-"^":"Xs:13;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e186:{
-"^":"Xs:13;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e187:{
-"^":"Xs:13;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
-"^":"Xs:13;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e189:{
-"^":"Xs:13;",
-$1:[function(a){return J.jY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
-"^":"Xs:13;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Bq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e191:{
-"^":"Xs:13;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e192:{
-"^":"Xs:13;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e193:{
-"^":"Xs:13;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e194:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e195:{
-"^":"Xs:13;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e196:{
-"^":"Xs:13;",
-$1:[function(a){return J.k7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e197:{
-"^":"Xs:13;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e198:{
-"^":"Xs:13;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e199:{
-"^":"Xs:13;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e200:{
-"^":"Xs:13;",
-$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.k7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
-"^":"Xs:13;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
-"^":"Xs:13;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e204:{
-"^":"Xs:13;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e205:{
-"^":"Xs:13;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
-"^":"Xs:13;",
-$1:[function(a){return a.gA6()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
-"^":"Xs:13;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
-"^":"Xs:13;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e209:{
-"^":"Xs:13;",
-$1:[function(a){return J.o9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e210:{
-"^":"Xs:13;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
-"^":"Xs:13;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e212:{
-"^":"Xs:13;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e213:{
-"^":"Xs:13;",
-$1:[function(a){return J.NB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
-"^":"Xs:13;",
-$1:[function(a){return a.gzS()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.KL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e215:{
-"^":"Xs:13;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e216:{
-"^":"Xs:13;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e217:{
-"^":"Xs:13;",
-$1:[function(a){return a.gV8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
-"^":"Xs:13;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzS()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
-"^":"Xs:13;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.y1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e220:{
-"^":"Xs:13;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
-"^":"Xs:13;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.nd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e222:{
-"^":"Xs:13;",
-$1:[function(a){return J.jx(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e223:{
-"^":"Xs:13;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e224:{
-"^":"Xs:13;",
-$1:[function(a){return J.C7(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e225:{
-"^":"Xs:13;",
-$1:[function(a){return J.vI(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e226:{
-"^":"Xs:13;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
-"^":"Xs:13;",
-$1:[function(a){return a.gS5()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
-"^":"Xs:13;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
-"^":"Xs:13;",
-$1:[function(a){return a.guj()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
-"^":"Xs:13;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
-"^":"Xs:13;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
-"^":"Xs:13;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.C7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e233:{
-"^":"Xs:13;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
-"^":"Xs:13;",
-$1:[function(a){return J.dY(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
-"^":"Xs:13;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
-"^":"Xs:13;",
-$1:[function(a){return J.zB(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
-"^":"Xs:13;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e238:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
-"^":"Xs:13;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e242:{
-"^":"Xs:13;",
-$1:[function(a){return J.Rg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e243:{
-"^":"Xs:13;",
-$1:[function(a){return J.d5(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.OL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
-"^":"Xs:13;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.zB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
-"^":"Xs:13;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
-"^":"Xs:13;",
-$1:[function(a){return J.cs(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
-"^":"Xs:13;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
-"^":"Xs:13;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
-"^":"Xs:13;",
-$1:[function(a){return J.K2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
-"^":"Xs:13;",
-$1:[function(a){return J.r8(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
-"^":"Xs:13;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e252:{
-"^":"Xs:13;",
-$1:[function(a){return a.gEy()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
-"^":"Xs:13;",
-$1:[function(a){return J.XJ(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
-"^":"Xs:13;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e255:{
-"^":"Xs:13;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e256:{
-"^":"Xs:13;",
-$1:[function(a){return a.gJk()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e257:{
-"^":"Xs:13;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
-"^":"Xs:13;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
-"^":"Xs:13;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
-"^":"Xs:13;",
-$1:[function(a){return a.gXA()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
-"^":"Xs:13;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.XJ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e262:{
-"^":"Xs:13;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e263:{
-"^":"Xs:13;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e264:{
-"^":"Xs:13;",
-$1:[function(a){return J.I2(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gJk()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
-"^":"Xs:13;",
-$1:[function(a){return a.gTX()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e266:{
-"^":"Xs:13;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
-"^":"Xs:13;",
-$1:[function(a){return a.gV0()},"$1",null,2,0,null,61,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e268:{
-"^":"Xs:80;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e269:{
-"^":"Xs:80;",
-$2:[function(a,b){J.L9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e270:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NV(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e271:{
-"^":"Xs:80;",
-$2:[function(a,b){J.l7(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e272:{
-"^":"Xs:80;",
-$2:[function(a,b){J.kB(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.I2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
-"^":"Xs:80;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e275:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e277:{
-"^":"Xs:80;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e278:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e279:{
-"^":"Xs:80;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e280:{
-"^":"Xs:80;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.kB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e281:{
-"^":"Xs:80;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e282:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e283:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e284:{
-"^":"Xs:80;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e285:{
-"^":"Xs:80;",
-$2:[function(a,b){J.LM(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e286:{
-"^":"Xs:80;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e287:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Iw(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e288:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e289:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e290:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e291:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e292:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e293:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xW(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e294:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e295:{
-"^":"Xs:80;",
-$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Iw(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e296:{
-"^":"Xs:80;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e297:{
-"^":"Xs:80;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e298:{
-"^":"Xs:80;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e299:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e300:{
-"^":"Xs:80;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e301:{
-"^":"Xs:80;",
-$2:[function(a,b){J.OH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e302:{
-"^":"Xs:80;",
-$2:[function(a,b){J.uP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e303:{
-"^":"Xs:80;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e304:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e305:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e306:{
-"^":"Xs:80;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e307:{
-"^":"Xs:80;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e308:{
-"^":"Xs:80;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e309:{
-"^":"Xs:80;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e310:{
-"^":"Xs:80;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.OH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e311:{
-"^":"Xs:80;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e312:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e313:{
-"^":"Xs:80;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e314:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e315:{
-"^":"Xs:80;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e316:{
-"^":"Xs:80;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e317:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e318:{
-"^":"Xs:80;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
-"^":"Xs:80;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e320:{
-"^":"Xs:80;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e321:{
-"^":"Xs:80;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
-"^":"Xs:80;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e323:{
-"^":"Xs:80;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e324:{
-"^":"Xs:80;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e325:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e326:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e327:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e328:{
-"^":"Xs:80;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e329:{
-"^":"Xs:80;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e330:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e331:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e332:{
-"^":"Xs:80;",
-$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
-"^":"Xs:80;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e334:{
-"^":"Xs:80;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
-"^":"Xs:80;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e336:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e337:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e338:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
-"^":"Xs:80;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e340:{
-"^":"Xs:80;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e341:{
-"^":"Xs:80;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e342:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e343:{
-"^":"Xs:80;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e345:{
-"^":"Xs:80;",
-$2:[function(a,b){J.aw(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e346:{
-"^":"Xs:80;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e347:{
-"^":"Xs:80;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e348:{
-"^":"Xs:80;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e349:{
-"^":"Xs:80;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e350:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e351:{
-"^":"Xs:80;",
-$2:[function(a,b){J.AJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e352:{
-"^":"Xs:80;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e354:{
-"^":"Xs:80;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e355:{
-"^":"Xs:80;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e356:{
-"^":"Xs:80;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e357:{
-"^":"Xs:80;",
-$2:[function(a,b){J.iH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e358:{
-"^":"Xs:80;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e359:{
-"^":"Xs:80;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e360:{
-"^":"Xs:80;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e361:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e362:{
-"^":"Xs:80;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e363:{
-"^":"Xs:80;",
-$2:[function(a,b){J.jd(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e364:{
-"^":"Xs:80;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e365:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ZI(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e366:{
-"^":"Xs:80;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e367:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e368:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.iH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e369:{
-"^":"Xs:80;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e370:{
-"^":"Xs:80;",
-$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e371:{
-"^":"Xs:80;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e372:{
-"^":"Xs:80;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e373:{
-"^":"Xs:80;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e374:{
-"^":"Xs:80;",
-$2:[function(a,b){J.FH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e375:{
-"^":"Xs:80;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e377:{
-"^":"Xs:80;",
-$2:[function(a,b){a.suj(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e378:{
-"^":"Xs:80;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e379:{
-"^":"Xs:80;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e380:{
-"^":"Xs:80;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
-"^":"Xs:80;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e382:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e383:{
-"^":"Xs:80;",
-$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e384:{
-"^":"Xs:80;",
-$2:[function(a,b){J.CA(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e385:{
-"^":"Xs:80;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e386:{
-"^":"Xs:80;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
-"^":"Xs:80;",
-$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
-"^":"Xs:80;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,61,64,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e389:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e390:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e391:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e392:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e394:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e395:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e396:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.yO(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e397:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e398:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e399:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e400:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e401:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+"^":"Xs:81;",
+$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e402:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e447:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e448:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e449:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e450:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e451:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e452:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e453:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e454:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e455:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e456:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e457:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e458:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e459:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e460:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e461:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e462:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e463:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e464:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e465:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e466:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e467:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e468:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e469:{
-"^":"Xs:74;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e470:{
-"^":"Xs:74;",
+"^":"Xs:76;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e471:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e472:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e473:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e474:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e475:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e476:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e477:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e478:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e479:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e480:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e481:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e482:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e483:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e484:{
+"^":"Xs:76;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e485:{
+"^":"Xs:76;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+$isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"pv;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjD:function(a){return a.BW},
 sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{Dw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.C8.ZL(a)
+a.n9=x
+a.wy=w
+C.C8.LX(a)
 C.C8.XI(a)
 return a}}},
-pv:{
+Vfx:{
 "^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{rt:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{BB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.oq.ZL(a)
+a.n9=x
+a.wy=w
+C.oq.LX(a)
 C.oq.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
+return a}}}}],["","",,O,{
 "^":"",
 CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
+"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+Pz:function(a){var z,y,x,w,v,u,t
 z=this.ks
 if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!0)continue
+for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
 t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
@@ -4679,19 +4687,19 @@
 if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
 u.$builtinTypeInfo=[null]
 t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-o8:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
+cO:function(){},
+Nh:function(){return this.Ru.gLT().XH.length>0}},
 eo:{
-"^":"Dsd;CA,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.kf(z,null,null)
+a.Hm=new G.ih(z,null,null)
 z=a.CA
-if(z!=null)this.hP(a,z.gmq())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,13,57],
+if(z!=null)this.hP(a,z.gDZ())},
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4706,120 +4714,120 @@
 s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.mA(z)}catch(q){w=H.Ru(q)
+a.Hm.G7(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.XO(q,null)
-N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+x=new H.oP(q,null)
+N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,102,103],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,102,103],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
+Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,104,1,105,106],
+x=new H.oP(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.fe.ZL(a)
-C.fe.XI(a)
+a.n9=x
+a.wy=w
+C.RD.LX(a)
+C.RD.XI(a)
 return a}}},
-Dsd:{
+tuj:{
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
-"^":"Xs:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,107,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"^":"Xs:12;a",
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,108,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"tuj;yB,nJ,mN,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Vct;yB,R8,mN,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gWt:function(a){return a.nJ},
-sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
+gWt:function(a){return a.R8},
+sWt:function(a,b){a.R8=this.ct(a,C.yB,a.R8,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,108,109],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,110,111],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,110,112],
-SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
+zs:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
+pA:[function(a,b){a.R8=this.ct(a,C.yB,a.R8,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.yB).YM(b)},"$1","gWp",2,0,20,101],
+J.LE(a.yB).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.yB).wM(b)},"$1","gDX",2,0,19,102],
 static:{lW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ka.ZL(a)
+a.n9=x
+a.wy=w
+C.ka.LX(a)
 C.ka.XI(a)
 return a}}},
-tuj:{
+Vct:{
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,95,"call"],
+z.R8=J.Q5(z,C.yB,z.R8,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 SS:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,95,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtT:function(a){return a.tY},
-DZ:[function(a,b){Q.xI.prototype.DZ.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
-static:{On:function(a){var z,y,x,w
+Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
+static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.tWO.ZL(a)
+a.n9=x
+a.wy=w
+C.tWO.LX(a)
 C.tWO.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"Vct;Xx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
@@ -4827,50 +4835,50 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,101],
-b0:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
+pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
+lE:function(a,b){var z,y,x
+z=J.Vs(b).dA.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},
-Gm:[function(a,b,c,d){var z=this.b0(a,d)
+YI:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,114,1,105,106],
-Lk:[function(a,b,c,d){var z=this.b0(a,d)
+J.pP(z).h(0,"highlight")},"$3","gVb",6,0,115,2,106,107],
+QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,114,1,105,106],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,115,2,106,107],
 static:{fm:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ux.ZL(a)
+a.n9=x
+a.wy=w
+C.ux.LX(a)
 C.ux.XI(a)
 return a}}},
-Vct:{
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"Xs:115;",
+"^":"Xs:116;",
 $1:[function(a){a.OF()},"$1",null,2,0,null,85,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
+$isEH:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,uo,nx,oM,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 goE:function(a){return a.tH},
 soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
-gv8:function(a){return a.uo},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
+gO9:function(a){return a.uo},
+sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
@@ -4878,15 +4886,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,20,57],
-Db:[function(a){var z=a.tH
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
+Ey:[function(a){var z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,46,47,85],
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4897,76 +4905,20 @@
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.O0.ZL(a)
+a.n9=x
+a.wy=w
+C.O0.LX(a)
 C.O0.XI(a)
 return a}}},
 SaM:{
 "^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
+$isd3:true}}],["","",,H,{
 "^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},
-CkK:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},
-n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-Wt:function(a,b){var z,y,x,w,v
-z=[]
-y=a.length
-for(x=y,w=0;w<y;++w){if(w>=x)return H.e(a,w)
-v=a[w]
-if(b.$1(v)!==!0)z.push(v)
-x=a.length
-if(y!==x)throw H.b(P.a4(a))}x=z.length
-if(x===y)return
-C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},
-Sz:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
-if(b.$1(y)===!0)return y}throw H.b(H.DU())},
-rd:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},
-xF: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
-H.xF(a,b,c)
-z=J.Hn(c,b)
-if(J.xC(z,0))return
-if(J.u6(e,0))throw H.b(P.u(e))
-y=J.x(d)
-if(!!y.$isWO){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(H.ar())
-H.tb(w,x,a,b,z)},
-IC:function(a,b,c){var z,y,x,w
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},
-na: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.mY(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},
 DU:function(){return new P.lj("No element")},
 ar:function(){return new P.lj("Too few elements")},
 tb:function(a,b,c,d,e){var z,y,x,w,v
@@ -4989,15 +4941,15 @@
 w9:function(a,b,c,d){var z,y,x,w,v
 for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
 w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
 v=w-1
 y.u(a,w,y.t(a,v))
 w=v}y.u(a,w,x)}},
 ZD:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-z=C.jn.cU(c-b+1,6)
+z=C.jn.BU(c-b+1,6)
 y=b+z
 x=c-z
-w=C.jn.cU(b+c,2)
+w=C.jn.BU(b+c,2)
 v=w-z
 u=w+z
 t=J.U6(a)
@@ -5006,23 +4958,23 @@
 q=t.t(a,w)
 p=t.t(a,u)
 o=t.t(a,x)
-if(J.z8(d.$2(s,r),0)){n=r
+if(J.xZ(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
+s=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
+p=n}if(J.xZ(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
+s=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
+r=n}if(J.xZ(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
+s=n}if(J.xZ(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
+q=n}if(J.xZ(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
+r=n}if(J.xZ(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.z8(d.$2(p,o),0)){n=o
+r=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
 p=n}t.u(a,y,s)
 t.u(a,w,q)
@@ -5051,7 +5003,7 @@
 l=g
 break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
 if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(a,l),p),0)){--l
+t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
 if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
@@ -5087,7 +5039,7 @@
 l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
 aL:{
 "^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
+gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.W8(this,"aL",0)])},
 aN:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5097,7 +5049,7 @@
 gl0:function(a){return J.xC(this.gB(this),0)},
 grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,J.Hn(this.gB(this),1))},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
@@ -5118,17 +5070,17 @@
 w=P.p9(x)
 if(typeof z!=="number")return H.s(z)
 v=1
-for(;v<z;++v){w.vM+=b
+for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
+w.IN+=typeof u==="string"?u:H.d(u)
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
+w.IN+=typeof u==="string"?u:H.d(u)
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
 ad:function(a,b){return P.mW.prototype.ad.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.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5136,14 +5088,14 @@
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
 if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
-eR:function(a,b){return H.c1(this,b,null,null)},
+eR:function(a,b){return H.c1(this,b,null,H.W8(this,"aL",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(this,"aL",0)])
+if(b){z=H.VM([],[H.W8(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 y=Array(y)
 y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
+z=H.VM(y,[H.W8(this,"aL",0)])}x=0
 while(!0){y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
 if(!(x<y))break
@@ -5152,7 +5104,7 @@
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.ip(this,"aL",0))
+z=P.Ls(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5160,186 +5112,262 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-if(y==null||J.z8(y,z))return z
+"^":"aL;Hb,ay,Hx",
+gUD:function(){var z,y
+z=J.q8(this.Hb)
+y=this.Hx
+if(y==null||J.xZ(y,z))return z
 return y},
-gjX:function(){var z,y
-z=J.q8(this.l6)
-y=this.SH
-if(J.z8(y,z))return z
+gdM:function(){var z,y
+z=J.q8(this.Hb)
+y=this.ay
+if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
-z=J.q8(this.l6)
-y=this.SH
+z=J.q8(this.Hb)
+y=this.ay
 if(J.J5(y,z))return 0
-x=this.AN
+x=this.Hx
 if(x==null||J.J5(x,z))return J.Hn(z,y)
 return J.Hn(x,y)},
-Zv:function(a,b){var z=J.WB(this.gjX(),b)
-if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i9(this.l6,z)},
-eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.c1(this.l6,J.WB(this.SH,b),this.AN,null)},
+Zv:function(a,b){var z=J.WB(this.gdM(),b)
+if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
+return J.i9(this.Hb,z)},
+eR:function(a,b){var z,y
+if(J.u6(b,0))throw H.b(P.N(b))
+z=J.WB(this.ay,b)
+y=this.Hx
+if(y!=null&&J.J5(z,y)){y=new H.MB()
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
 rh:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
-z=this.AN
-y=this.SH
-if(z==null)return H.c1(this.l6,y,J.WB(y,b),null)
+z=this.Hx
+y=this.ay
+if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.c1(this.l6,y,x,null)}},
+return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.SH
+z=this.ay
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
+x=this.Hx
 if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
 if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
 static:{c1:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
+"^":"a;Hb,bd,QX,Ff",
+gl:function(){return this.Ff},
 G:function(){var z,y,x,w
-z=this.l6
+z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
+if(!J.xC(this.bd,x))throw H.b(P.a4(z))
+w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
+if(w>=x){this.Ff=null
+return!1}this.Ff=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
+"^":"mW;Hb,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+gA:function(a){var z=new H.MH(null,J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.uY(this.l6))},
+gB:function(a){return J.q8(this.Hb)},
+gl0:function(a){return J.FN(this.Hb)},
+grZ:function(a){return this.Mi(J.uY(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{fR:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
-"^":"i1;l6,T6",
+"^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Dk;lo,OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){var z=this.OI
-if(z.G()){this.lo=this.mb(z.gl())
-return!0}this.lo=null
+"^":"Anv;Ff,CL,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+G:function(){var z=this.CL
+if(z.G()){this.Ff=this.Mi(z.gl())
+return!0}this.Ff=null
 return!1},
-gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
+gl:function(){return this.Ff},
+$asAnv:function(a,b){return[b]}},
 A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
+"^":"aL;ON,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+gB:function(a){return J.q8(this.ON)},
+Zv:function(a,b){return this.Mi(J.i9(this.ON,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
+"^":"mW;Hb,Oh",
+gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
-"^":"Dk;OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
+vG:{
+"^":"Anv;CL,Oh",
+Mi:function(a){return this.Oh.$1(a)},
+G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
-gl:function(){return this.OI.gl()}},
+gl:function(){return this.CL.gl()}},
 oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Dd(J.mY(this.l6),this.T6,C.MS,null)
+"^":"mW;Hb,Oh",
+gA:function(a){var z=new H.H1(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-Dd:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
+H1:{
+"^":"a;CL,Oh,Br,Ff",
+Mi:function(a){return this.Oh.$1(a)},
+gl:function(){return this.Ff},
 G:function(){var z,y
-z=this.e0
+z=this.Br
 if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
+for(y=this.CL;!z.G();){this.Ff=null
+if(y.G()){this.Br=null
+z=J.mY(this.Mi(y.gl()))
+this.Br=z}else return!1}this.Ff=this.Br.gl()
 return!0}},
 AM:{
-"^":"mW;l6,FT",
+"^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.l6,this.FT+b,H.u3(this,0))},
-gA:function(a){var z=this.l6
-z=new H.ig(z.gA(z),this.FT)
+return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
+gA:function(a){var z=this.Hb
+z=new H.b2(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-jb:function(a,b,c){if(this.FT<0)throw H.b(P.KP(this.FT))},
+jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
 static:{ke:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.wb(a,b,c)},wb:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
-"^":"AM;l6,FT",
+"^":"AM;Hb,u3",
 gB:function(a){var z,y
-z=this.l6
-y=J.Hn(z.gB(z),this.FT)
+z=this.Hb
+y=J.Hn(z.gB(z),this.u3)
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-ig:{
-"^":"Dk;OI,FT",
+b2:{
+"^":"Anv;CL,u3",
 G:function(){var z,y
-for(z=this.OI,y=0;y<this.FT;++y)z.G()
-this.FT=0
+for(z=this.CL,y=0;y<this.u3;++y)z.G()
+this.u3=0
 return z.G()},
-gl:function(){return this.OI.gl()}},
+gl:function(){return this.CL.gl()}},
+MB:{
+"^":"mW;",
+gA:function(a){return C.MS},
+aN:function(a,b){},
+gl0:function(a){return!0},
+gB:function(a){return 0},
+grZ:function(a){throw H.b(H.DU())},
+tg:function(a,b){return!1},
+Vr:function(a,b){return!1},
+zV:function(a,b){return""},
+ad:function(a,b){return this},
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+eR:function(a,b){if(b<0)throw H.b(P.N(b))
+return this},
+tt:function(a,b){var z
+if(b)z=H.VM([],[H.u3(this,0)])
+else{z=Array(0)
+z.fixed$length=init
+z=H.VM(z,[H.u3(this,0)])}return z},
+br:function(a){return this.tt(a,!0)},
+zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+$isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
+wb:{
+"^":"a;",
+static:{bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},CkK:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
+return!1},n3:function(a,b,c){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
+return b},Wt:function(a,b){var z,y,x,w,v
+z=[]
+y=a.length
+for(x=y,w=0;w<y;++w){if(w>=x)return H.e(a,w)
+v=a[w]
+if(b.$1(v)!==!0)z.push(v)
+x=a.length
+if(y!==x)throw H.b(P.a4(a))}x=z.length
+if(x===y)return
+C.Nm.sB(a,x)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},xF: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
+H.xF(a,b,c)
+z=J.Hn(c,b)
+if(J.xC(z,0))return
+if(J.u6(e,0))throw H.b(P.u(e))
+y=J.x(d)
+if(!!y.$isWO){x=e
+w=d}else{w=y.eR(d,e).tt(0,!1)
+x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
+H.tb(w,x,a,b,z)},IC:function(a,b,c){var z,y,x,w
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+z=J.x(c)
+if(!z.$isyN)c=z.tt(c,!1)
+z=J.U6(c)
+y=z.gB(c)
+x=a.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(a,x+y)
+x=a.length
+if(!!a.immutable$list)H.vh(P.f("set range"))
+H.qG(a,b+y,x,a,b)
+for(z=z.gA(c);z.G();b=w){w=b+1
+C.Nm.u(a,b,z.gl())}},h8: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.mY(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}}}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
+oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
 JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 Jd:function(a){return this.GT(a,null)},
 V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
 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"))},
+oq:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5353,42 +5381,48 @@
 $isQV:true,
 $asQV:null},
 iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
+"^":"aL;ON",
+gB:function(a){return J.q8(this.ON)},
 Zv:function(a,b){var z,y,x
-z=this.CR
+z=this.ON
 y=J.U6(z)
 x=y.gB(z)
 if(typeof b!=="number")return H.s(b)
 return y.Zv(z,x-1-b)}},
 tx:{
-"^":"a;fN>",
+"^":"a;OB>",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$istx&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
+return!!J.x(b).$istx&&J.xC(this.OB,b.OB)},
+giO:function(a){var z=J.v1(this.OB)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
+bu:[function(a){return"Symbol(\""+H.d(this.OB)+"\")"},"$0","gCR",0,0,76],
 $istx:true,
 $isIN:true,
-static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
+static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["","",,H,{
 "^":"",
 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}}],["dart.async","dart:async",,P,{
+return z}}],["","",,P,{
 "^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
-return P.K7()},
-ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
+xg:function(){var z,y,x
+z={}
+if(self.scheduleImmediate!=null)return P.vd()
+if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
+x=self.document.createElement("span")
+z.a=null
+new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
+return new P.ha(z,y,x)}return P.K7()},
+ZV:[function(a){++init.globalState.Xz.kv
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
+Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
 VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
+z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
-else return b.wY(a)},
+else return b.cR(a)},
 BV:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
+P.cH(C.ny,new P.w4(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5397,8 +5431,8 @@
 z.c=0
 z.d=null
 z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+y=new P.j7(z,b)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.dn,null)
 w=Array(y)
@@ -5408,28 +5442,19 @@
 v=H.VM(new P.Zf(P.Dt(y)),[y])
 z.a=v
 return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.yK())
-$.S6=$.S6.gaw()
-throw z}},"$0","yK",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.yK())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-ji:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+Cx:function(){var z,y
+for(;z=$.S6,z!=null;){$.mg=null
+y=z.gaw()
+$.S6=y
+if(y==null)$.k8=null
+J.cG(z)}},
+BG:[function(){$.v5=!0
+try{P.Cx()}finally{$.mg=null
+$.v5=!1
+if($.S6!=null)$.ej().$1(P.yK())}},"$0","yK",0,0,17],
+rb:function(a){var z=$.X3
+if(C.NU===z){P.Tk(null,null,C.NU,a)
+return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5442,89 +5467,144 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","bW",2,0,20,21],
-Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,22,23,24,25],
-dL:[function(){},"$0","v3",0,0,18],
+QEz:[function(a){},"$1","yy",2,0,19,20],
+Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
+dL:[function(){},"$0","v3",0,0,17],
 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)
+y=new H.oP(x,null)
 c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.YM(new P.dR(b,c,d))
-else b.K5(c,d)},
+NX:function(a,b,c,d){var z=a.Gv()
+if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
+else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.YM(new P.QX(b,c))
-else b.rX(c)},
-rT:function(a,b){var z
+Bb:function(a,b,c){var z=a.Gv()
+if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
+else b.In(c)},
+cH:function(a,b){var z
 if(J.xC($.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()
+YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
+dp:function(a,b){var z=a.gVs()
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
+Cw:function(a){if(a.geT(a)==null)return
+return a.geT(a).gyL()},
+CK:[function(a,b,c,d,e){var z,y,x
+z=new P.OM(new P.FO(d,e),null)
+y=$.S6
+if(y==null){$.mg=z
+$.k8=z
+$.S6=z
+if(!$.v5)$.ej().$1(P.yK())}else{x=$.mg
+if(x==null){z.aw=y
+$.mg=z
+$.S6=z}else{z.aw=x.aw
+x.aw=z
+$.mg=z
+if(z.aw==null)$.k8=z}}},"$5","wLZ",10,0,25,26,27,28,23,24],
 Ki:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","r6",8,0,30,27,28,29,31],
+return y}finally{$.X3=z}},"$4","qKH",8,0,29,26,27,28,30],
 V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","tz",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-WN:[function(a,b,c,d){return d},"$4","L8",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","Lm",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","oQ",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-E1:[function(a,b,c,d,e){var z
+return y}finally{$.X3=z}},"$6","tz",12,0,33,26,27,28,30,8,9],
+EeK:[function(a,b,c,d){return d},"$4","qJ6",8,0,34,26,27,28,30],
+cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
+bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
+Tk:[function(a,b,c,d){var z,y
+if(C.NU!==c)d=c.ce(d)
+if($.S6==null){z=new P.OM(d,null)
+$.k8=z
+$.S6=z
+if(!$.v5)$.ej().$1(P.yK())}else{y=new P.OM(d,null)
+$.k8.aw=y
+$.k8=y}},"$4","G2",8,0,37,26,27,28,30],
+h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
+Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.Af(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Oj",10,0,44],
+if(d==null)d=C.Kk
+else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
+else{z=P.YM(null,null,null,null,null)
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.bC(c,d,z)
+return y},"$5","OjX",10,0,45,26,27,28,46,47],
+th:{
+"^":"Xs:12;a",
+$1:[function(a){var z,y
+H.cv()
+z=this.a
+y=z.a
+z.a=null
+y.$0()},"$1",null,2,0,null,13,"call"],
+$isEH:true},
+ha:{
+"^":"Xs:117;a,b,c",
+$1:function(a){var z,y;++init.globalState.Xz.kv
+this.a.a=a
+z=this.b
+y=this.c
+z.firstChild?z.removeChild(y):z.appendChild(y)},
+$isEH:true},
 C6:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
 $isXS:true},
+O6:{
+"^":"Ca;kc,I4",
+bu:[function(a){var z,y
+z="Uncaught Error: "+H.d(this.kc)
+y=this.I4
+return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,73],
+static:{Yq:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
+if(!!J.x(a).$isXS)return a.gI4()
+return}}},
 Ik:{
-"^":"u2;ly"},
+"^":"u2;BT"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,ly,pN,o7,Bd,Lj,Gv,lz,Ri",
-gly:function(){return this.ly},
-uR:function(a){var z=this.Ae
+"^":"yU4;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
+gBT:function(){return this.BT},
+uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&1)===a},
-Ac:function(){var z=this.Ae
+fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
+this.ru=z^1},
+gh0:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-dK:function(){var z=this.Ae
+Pa:function(){var z=this.ru
 if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
+this.ru=z|4},
+gKH:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+jy:[function(){},"$0","gb9",0,0,17],
+ie:[function(){},"$0","gxl",0,0,17],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
@@ -5532,26 +5612,28 @@
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
-SL:function(){var z=this.yx
+WH:function(){var z=this.Kj
 if(z!=null)return z
 z=P.Dt(null)
-this.yx=z
+this.Kj=z
 return z},
-p1:function(a){var z,y
+pW:function(a){var z,y
 z=a.gSJ()
 y=a.giE()
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.v3())
+MI:function(a,b,c,d){var z,y,x
+if((this.YM&4)!==0){if(c==null)c=P.v3()
+z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
+z.q1()
 return z}z=$.X3
-y=a?1:0
+y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
+x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5559,107 +5641,107 @@
 x.iE=this
 y.siE(x)
 this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
+x.ru=this.YM&1
+if(this.iE===x)P.ot(this.Ld)
 return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
+rR:function(a){if(a.giE()===a)return
+if(a.gh0())a.Pa()
+else{this.pW(a)
+if((this.YM&2)===0&&this.iE===this)this.hg()}return},
+Pm:function(a){},
+Bu:function(a){},
+Pq:function(){if((this.YM&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,null,116],
+h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
+this.MW(b)},"$1","ght",2,0,null,118],
 xO:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.SL()
-this.SY()
+z=this.YM
+if((z&4)!==0)return this.Kj
+if(z>=4)throw H.b(this.Pq())
+this.YM=z|4
+y=this.WH()
+this.PS()
 return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-Qj:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-Qz:function(a){var z,y,x,w
-z=this.Gv
+Rg:function(a,b){this.MW(b)},
+MR:function(a,b){this.y7(a,b)},
+AN:function(){var z=this.Hz
+this.Hz=null
+this.YM&=4294967287
+C.jN.dS(z)},
+HI:function(a){var z,y,x,w
+z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
 y=this.iE
 if(y===this)return
 x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
+this.YM=z^3
+for(;y!==this;)if(y.uO(x)){z=y.gru()
 if(typeof z!=="number")return z.k()
-y.sAe(z|2)
+y.sru(z|2)
 a.$1(y)
-y.Ac()
+y.fc()
 w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
+if(y.gKH())this.pW(y)
+z=y.gru()
 if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
+y.sru(z&4294967293)
 y=w}else y=y.giE()
-this.Gv&=4294967293
-if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.QC)}},
+this.YM&=4294967293
+if(this.iE===this)this.hg()},
+hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
+P.ot(this.Ro)}},
 zW:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z=this.iE
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+MW:function(a){var z=this.iE
 if(z===this)return
-if(z.giE()===this){this.Gv|=2
+if(z.giE()===this){this.YM|=2
 this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.Qz(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.Qz(new P.OR(this,a,b))},
-SY:function(){if(this.iE!==this)this.Qz(new P.Bg(this))
-else this.yx.OH(null)}},
+this.YM&=4294967293
+if(this.iE===this)this.hg()
+return}this.HI(new P.tK(this,a))},
+y7:function(a,b){if(this.iE===this)return
+this.HI(new P.OR(this,a,b))},
+PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+else this.Kj.Xf(null)}},
 tK:{
 "^":"Xs;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"Xs;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
+$1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"Xs;a",
-$1:function(a){a.Qj()},
+$1:function(a){a.AN()},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z,y
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+MW:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.Dn(a,b,null))},
-SY:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
+z.C2(y)}},
+y7:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
+PS:function(){var z=this.iE
+if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
+else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){var z,y,x,w
-try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
+try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
+y=new H.oP(x,null)
+this.b.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-mQ:{
-"^":"Xs:80;a,b",
+j7:{
+"^":"Xs:81;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5667,10 +5749,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,117,118,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,119,120,"call"],
 $isEH:true},
 Tw:{
-"^":"Xs:119;a,c,d",
+"^":"Xs:121;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5679,209 +5761,213 @@
 if(w<0||w>=x.length)return H.e(x,w)
 x[w]=a
 if(y===0){z=z.a.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,120,23,21],
+if(z.YM!==0)throw H.b(P.w("Future already completed"))
+z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,122,22,20],
 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,121,23,24,25]},
+if(z.YM!==0)throw H.b(P.w("Future already completed"))
+z.Nk(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,123,22,23,24]},
 Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
-gcg:function(){return this.Gv>=4},
-gWj:function(){return this.Gv===4},
-gNm:function(){return this.Gv===8},
-swG:function(a){if(a)this.Gv=2
-else this.Gv=0},
-gO1:function(){return this.Gv===2?null:this.OY},
-gyK:function(){return this.Gv===2?null:this.As},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
+"^":"a;YM,t9<,O1,nV@,bH?,kO?,bv?,Nw?",
+gnr:function(){return this.YM>=4},
+ga5:function(){return this.YM===4},
+gAT:function(){return this.YM===8},
+sKl:function(a){if(a)this.YM=2
+else this.YM=0},
+gdU:function(){return this.YM===2?null:this.bH},
+gp6:function(){return this.YM===2?null:this.kO},
+gTv:function(){return this.YM===2?null:this.bv},
+gco:function(){return this.YM===2?null:this.Nw},
 Rx:function(a,b){var z,y
 z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
-this.au(y)
+y=H.VM(new P.Gc(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
+this.xf(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
-co:function(a,b){var z,y,x
+pU:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.wY(b),y,null),[null])
-this.au(x)
+x=H.VM(new P.Gc(0,z,null,null,null,$.X3.cR(b),y,null),[null])
+this.xf(x)
 return x},
-OA:function(a){return this.co(a,null)},
-YM:function(a){var z,y
+OA:function(a){return this.pU(a,null)},
+wM:function(a){var z,y
 z=$.X3
 y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-this.au(y)
+this.xf(y)
 return y},
-gDL:function(){return this.jk},
-gcG:function(){return this.jk},
-Am:function(a){this.Gv=4
-this.jk=a},
-E6:function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},
-au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
-else{a.sBQ(this.jk)
-this.jk=a}},
-L3:function(){var z,y,x
-z=this.jk
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
+gDL:function(){return this.O1},
+gSt:function(){return this.O1},
+vd:function(a){this.YM=4
+this.O1=a},
+Is:function(a,b){this.YM=8
+this.O1=new P.Ca(a,b)},
+xf:function(a){if(this.YM>=4)this.t9.wr(new P.da(this,a))
+else{a.snV(this.O1)
+this.O1=a}},
+ah:function(){var z,y,x
+z=this.O1
+this.O1=null
+for(y=null;z!=null;y=z,z=x){x=z.gnV()
+z.snV(y)}return y},
+In:function(a){var z,y
 z=J.x(a)
 if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
 else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
+else{y=this.ah()
+this.vd(a)
 P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-this.Am(a)
+X2:function(a){var z=this.ah()
+this.vd(a)
 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,22,23,24,25],
-OH:function(a){var z
+ZL:[function(a,b){var z=this.ah()
+this.Is(a,b)
+P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,21,22,23,24],
+Xf:function(a){var z
 if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.eX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},
-X8:function(a,b,c){this.CG(a,b)},
-J9:function(a,b){this.OH(a)},
+if(!!z.$isb8){if(!!z.$isGc){z=a.YM
+if(z>=4&&z===8){if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.eX(this,a))},
+Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
+this.YM=1
+this.t9.wr(new P.ZL(this,a,b))},
+X8:function(a,b,c){this.Nk(a,b)},
+J9:function(a,b){this.Xf(a)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,dh",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.Gc(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.U7(b),new P.VL(b))},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
-do{z=b.gBQ()
-b.sBQ(null)
+return z},k3:function(a,b){b.sKl(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
+if(a.YM>=4)P.HZ(a,b)
+else a.xf(b)},yE:function(a,b){var z
+do{z=b.gnV()
+b.snV(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
 z={}
 z.e=a
 for(y=a;!0;){x={}
-if(!y.gcg())return
-w=z.e.gNm()
-if(w&&b==null){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
+if(!y.gnr())return
+w=z.e.gAT()
+if(w&&b==null){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())
 return}if(b==null)return
-if(b.gBQ()!=null){P.yE(z.e,b)
+if(b.gnV()!=null){P.yE(z.e,b)
 return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
+u=z.e.ga5()?z.e.gDL():null
 x.c=u
 x.d=!1
 y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
-if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
+if(!y||b.gdU()!=null||b.gco()!=null){t=b.gt9()
+if(w&&!z.e.gt9().fC(t)){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())
 return}s=$.X3
 if(s==null?t!=null:s!==t)$.X3=t
 else s=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
+if(y){if(b.gdU()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
+if(b.gco()!=null)new P.RT(z,x,w,b,t).$0()
 if(s!=null)$.X3=s
+b.sbH(null)
+b.skO(null)
+b.sbv(null)
+b.sNw(null)
 if(x.d)return
 if(x.b===!0){y=x.c
 y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
 if(y){r=x.c
-if(!!J.x(r).$isGc)if(r.Gv>=4){b.swG(!0)
+if(!!J.x(r).$isGc)if(r.YM>=4){b.sKl(!0)
 z.e=r
 y=r
 continue}else P.A9(r,b)
 else P.k3(r,b)
-return}}if(x.b===!0){q=b.L3()
-b.Am(x.c)}else{q=b.L3()
+return}}if(x.b===!0){q=b.ah()
+b.vd(x.c)}else{q=b.ah()
 v=x.c
-b.E6(J.w8(v),v.gI4())}z.e=b
+b.Is(J.w8(v),v.gI4())}z.e=b
 y=b
 b=q}}}},
 da:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
-"^":"Xs:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
+"^":"Xs:12;a",
+$1:[function(a){this.a.X2(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 VL:{
-"^":"Xs:122;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+"^":"Xs:124;b",
+$2:[function(a,b){this.b.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Xs:74;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.c.X2(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Xs:74;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b,c",
+$0:[function(){this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Xs:123;b,d,e,f",
+"^":"Xs:125;b,d,e,f",
 $0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
+try{this.b.c=this.f.FI(this.d.gdU(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"Xs:18;c,b,UI,bK",
+"^":"Xs:17;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()
+z=this.c.e.gSt()
 r=this.UI
-y=r.gyK()
+y=r.gp6()
 x=!0
 if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(q,null)
 r=J.w8(z)
 p=w
 o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
 r=this.b
 r.c=o
 r.b=!1
-return}u=r.go7()
+return}u=r.gTv()
 if(x===!0&&u!=null){try{r=u
 p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
+p=H.KT(p,[p,p]).Zg(r)
 n=this.bK
 m=this.b
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(q,null)
 r=J.w8(z)
 p=t
 o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
@@ -5893,111 +5979,111 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Xs:18;c,b,Gq,Rm,w3",
+"^":"Xs:17;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)
+try{z.a=this.w3.Gr(this.Rm.gco())}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
+x=new H.oP(w,null)
+if(this.Gq){v=J.w8(this.c.e.gSt())
 u=y
 u=v==null?u==null:v===u
 v=u}else v=!1
 u=this.b
-if(v)u.c=this.c.e.gcG()
+if(v)u.c=this.c.e.gSt()
 else u.c=new P.Ca(y,x)
 u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
+v.sKl(!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.ez(z,v))}},
 $isEH:true},
 jZ:{
-"^":"Xs:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,124,"call"],
+"^":"Xs:12;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,126,"call"],
 $isEH:true},
-FZ:{
-"^":"Xs:122;a,mG",
+ez:{
+"^":"Xs:124;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){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,23,24,25,"call"],
+y.Is(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.ip(this,"wS",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"wU",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},125],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},125],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},127],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},127],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
 x=P.p9("")
 z.a=null
 z.b=!0
-z.a=this.KR(new P.Yl(z,this,b,y,x),!0,new P.dW3(y,x),new P.Lp0(y))
+z.a=this.KR(new P.dW3(z,this,b,y,x),!0,new P.Lp0(y,x),new P.QCh(y))
 return y},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gaq())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
+z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
 return y},
 Vr:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
 return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
+this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
+z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.ip(this,"wS",0)])
-y=P.Dt([P.WO,H.ip(this,"wS",0)])
-this.KR(new P.lv(this,z),!0,new P.oo(z,y),y.gaq())
+z=H.VM([],[H.W8(this,"wS",0)])
+y=P.Dt([P.WO,H.W8(this,"wS",0)])
+this.KR(new P.lv(this,z),!0,new P.oo(z,y),y.gFa())
 return y},
 zH:function(a){var z,y
-z=P.Ls(null,null,null,H.ip(this,"wS",0))
-y=P.Dt([P.Jb,H.ip(this,"wS",0)])
-this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
+z=P.Ls(null,null,null,H.W8(this,"wS",0))
+y=P.Dt([P.Ol,H.W8(this,"wS",0)])
+this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.U6(this,b,null)
+z.mh(this,b,null)
 return z},
-gTw:function(a){var z,y
+gqG:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"wS",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
+z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"wS",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gaq())
+this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
 $iswS:true},
-Yl:{
+dW3:{
 "^":"Xs;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
 x=this.a
@@ -6005,432 +6091,335 @@
 x.b=!1
 try{this.e.KF(a)}catch(w){v=H.Ru(w)
 z=v
-y=new H.XO(w,null)
-P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,126,"call"],
+y=new H.oP(w,null)
+P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-Lp0:{
-"^":"Xs:13;f",
-$1:[function(a){this.f.Lp(a)},"$1",null,2,0,null,1,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+QCh:{
+"^":"Xs:12;f",
+$1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-dW3:{
-"^":"Xs:74;UI,bK",
-$0:[function(){this.UI.rX(this.bK.vM)},"$0",null,0,0,null,"call"],
+Lp0:{
+"^":"Xs:76;UI,bK",
+$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
+P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 LB:{
-"^":"Xs:74;e,f",
+"^":"Xs:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 z2:{
-"^":"Xs:127;a,UI",
+"^":"Xs:129;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 DO:{
-"^":"Xs:74;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;bK",
+$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Xs;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,126,"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,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"Xs:74;e,f",
+"^":"Xs:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-at:{
-"^":"Xs:13;",
+Jb:{
+"^":"Xs:12;",
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"Xs:74;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;UI",
+$0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.XPB(this.c,a),new P.h7d(z,y),P.TB(z.a,y))},"$1",null,2,0,null,126,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,128,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-XPB:{
-"^":"Xs:74;e,f",
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+WN:{
+"^":"Xs:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-h7d:{
-"^":"Xs:127;a,UI",
+XPB:{
+"^":"Xs:129;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
-"^":"Xs:74;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
+Ia:{
+"^":"Xs:76;bK",
+$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"Xs:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-uO:{
-"^":"Xs:74;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
+hh:{
+"^":"Xs:76;a,b",
+$0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
-"^":"Xs:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Wd:{
-"^":"Xs:74;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c",
+$0:[function(){this.c.In(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lv:{
 "^":"Xs;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,116,"call"],
+$1:[function(a){this.b.push(a)},"$1",null,2,0,null,118,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 oo:{
-"^":"Xs:74;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 oY:{
 "^":"Xs;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,116,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,118,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
-"^":"Xs:74;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;c,d",
+$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xp:{
+lU:{
 "^":"Xs;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-OC:{
-"^":"Xs:74;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+xp:{
+"^":"Xs:76;d",
+$0:[function(){var z,y,x,w
+try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.d.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
 "^":"Xs;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
+z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"Xs:74;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"],
+"^":"Xs:76;a,c",
+$0:[function(){var z,y,x,w
+x=this.a
+if(x.b){this.c.In(x.a)
+return}try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.c.ZL(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 yX:{
 "^":"a;",
 $isyX:true},
-nR:{
-"^":"a;",
-gvq:function(a){return H.VM(new P.u2(this),[null])},
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gDe:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.Qk(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-SL:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"nR")}],
-xO:function(a){var z=this.Gv
-if((z&4)!==0)return this.SL()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.SY()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.SL()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.Dn(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gDe()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gQC()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.YM(this.gQC())
-v=new P.Bc(this)
-if(z!=null)z=z.YM(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Xs:74;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"Xs:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-SY:function(){this.gEe().Qj()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.Dn(a,b,null))},
-SY:function(){this.gEe().w6(C.ZB)}},
-q1:{
-"^":"ZzD;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-MFI:{
-"^":"nR+TT;"},
 u2:{
-"^":"ez;ly",
-w4:function(a){return this.ly.ET(a)},
-giO:function(a){return(H.eQ(this.ly)^892482866)>>>0},
+"^":"ezY;",
+k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
+giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isu2)return!1
-return b.ly===this.ly},
+return b.BT===this.BT},
 $isu2:true},
-yU:{
-"^":"KA;ly<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gly().j0(this)},
-uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,18]},
+yU4:{
+"^":"KA;BT<",
+cZ:function(){return this.gBT().rR(this)},
+jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-ps:function(a){this.pN=this.Lj.wY(a)},
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
 fm:function(a,b){if(b==null)b=P.bx()
-this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
+this.Tv=P.VH(b,this.t9)},
+Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.YM(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-QE:[function(a){var z=this.Gv
+this.YM=(z+128|4)>>>0
+if(b!=null)b.wM(this.gDQ(this))
+if(z<128&&this.fk!=null)this.fk.IO()
+if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
-this.Gv=z
-if(z<128){if((z&64)!==0){z=this.Ri
+this.YM=z
+if(z<128){if((z&64)!==0){z=this.fk
 z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.IO()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
+if(z)this.fk.t2(this)
+else{z=(this.YM&4294967291)>>>0
+this.YM=z
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
+Gv:function(){var z=(this.YM&4294967279)>>>0
+this.YM=z
+if((z&8)!==0)return this.Qe
+this.WN()
+return this.Qe},
+gUF:function(){return this.YM>=128},
+WN:function(){var z=(this.YM|8)>>>0
+this.YM=z
+if((z&64)!==0)this.fk.IO()
+if((this.YM&32)===0)this.fk=null
+this.Qe=this.cZ()},
+Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
+if(z<32)this.MW(b)
+else this.C2(H.VM(new P.fZ(b,null),[null]))},
+MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.Dn(a,b,null))},
-Qj:function(){var z=this.Gv
+if(z<32)this.y7(a,b)
+else this.C2(new P.Dn(a,b,null))},
+AN:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
-this.Gv=z
-if(z<32)this.SY()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
+this.YM=z
+if(z<32)this.PS()
+else this.C2(C.ZB)},
+jy:[function(){},"$0","gb9",0,0,17],
+ie:[function(){},"$0","gxl",0,0,17],
+cZ:function(){return},
+C2:function(a){var z,y
+z=this.fk
 if(z==null){z=new P.Qk(null,null,0)
-this.Ri=z}z.h(0,a)
-y=this.Gv
+this.fk=z}z.h(0,a)
+y=this.YM
 if((y&64)===0){y=(y|64)>>>0
-this.Gv=y
-if(y<128)this.Ri.t2(this)}},
-Iv:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-this.Lj.m1(this.pN,a)
-this.Gv=(this.Gv&4294967263)>>>0
-this.ut((z&4)!==0)},
-pb:function(a,b){var z,y
-z=this.Gv
+this.YM=y
+if(y<128)this.fk.t2(this)}},
+MW:function(a){var z=this.YM
+this.YM=(z|32)>>>0
+this.t9.m1(this.dB,a)
+this.YM=(this.YM&4294967263)>>>0
+this.Iy((z&4)!==0)},
+y7:function(a,b){var z,y
+z=this.YM
 y=new P.x1(this,a,b)
-if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.YM(y)
+if((z&1)!==0){this.YM=(z|16)>>>0
+this.WN()
+z=this.Qe
+if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.ut((z&4)!==0)}},
-SY:function(){var z,y
+this.Iy((z&4)!==0)}},
+PS:function(){var z,y
 z=new P.qB(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.YM(z)
+this.WN()
+this.YM=(this.YM|16)>>>0
+y=this.Qe
+if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
+Ge:function(a){var z=this.YM
+this.YM=(z|32)>>>0
 a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.ut((z&4)!==0)},
-ut:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
+this.YM=(this.YM&4294967263)>>>0
+this.Iy((z&4)!==0)},
+Iy:function(a){var z,y
+if((this.YM&64)!==0){z=this.fk
 z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
+if(z){z=(this.YM&4294967231)>>>0
+this.YM=z
+if((z&4)!==0)if(z<128){z=this.fk
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
+if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
+if((z&8)!==0){this.fk=null
 return}y=(z&4)!==0
 if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
+this.YM=(z^32)>>>0
+if(y)this.jy()
+else this.ie()
+this.YM=(this.YM&4294967263)>>>0}z=this.YM
+if((z&64)!==0&&z<128)this.fk.t2(this)},
+Cy:function(a,b,c,d,e){var z=this.t9
+this.dB=z.cR(a)
+this.fm(0,b)
+this.EU=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,bG,nS,Ir9,nav,lkp,JAK,N3S,FF"}},
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,vo,FF",MG:function(a,b,c,d,e){var z,y
+z=$.X3
+y=d?1:0
+y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
+y.Cy(a,b,c,d,e)
+return y}}},
 x1:{
-"^":"Xs:18;a,b,c",
+"^":"Xs:17;a,b,c",
 $0:[function(){var z,y,x,w,v,u
 z=this.a
-y=z.Gv
+y=z.YM
 if((y&8)!==0&&(y&16)===0)return
-z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-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},"$0",null,0,0,null,"call"],
+z.YM=(y|32)>>>0
+y=z.Tv
+x=H.G3()
+x=H.KT(x,[x,x]).Zg(y)
+w=z.t9
+v=this.b
+u=z.Tv
+if(x)w.z8(u,v,this.c)
+else w.m1(u,v)
+z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Xs:18;a",
+"^":"Xs:17;a",
 $0:[function(){var z,y
 z=this.a
-y=z.Gv
+y=z.YM
 if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.YM=(y|42)>>>0
+z.t9.ww(z.EU)
+z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-ez:{
+ezY:{
 "^":"wS;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.ps(a)
-z.fm(0,d)
-z.y5(c)
-return z},
+KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
+k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
 fZ:{
 "^":"fIm;P>,aw",
-dP:function(a){a.Iv(this.P)}},
+dP:function(a){a.MW(this.P)}},
 Dn:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
+dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.SY()},
+dP:function(a){a.PS()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
 "^":"a;",
-t2:function(a){var z=this.Gv
+t2:function(a){var z=this.YM
 if(z===1)return
-if(z>=1){this.Gv=1
+if(z>=1){this.YM=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},
-IO:function(){if(this.Gv===1)this.Gv=3}},
+this.YM=1},
+IO:function(){if(this.YM===1)this.YM=3}},
 CR:{
-"^":"Xs:74;a,b",
+"^":"Xs:76;a,b",
 $0:[function(){var z,y
 z=this.a
-y=z.Gv
-z.Gv=0
+y=z.YM
+z.YM=0
 if(y===3)return
 z.vG(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
-"^":"B3P;zR,N6,Gv",
+"^":"B3P;zR,N6,YM",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
@@ -6442,340 +6431,403 @@
 this.zR=y
 if(y==null)this.N6=null
 z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
+V1:function(a){if(this.YM===1)this.YM=3
 this.N6=null
 this.zR=null}},
 EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-ps:function(a){},
+"^":"a;t9<,YM,EU",
+gUF:function(){return this.YM>=4},
+q1:function(){if((this.YM&2)!==0)return
+this.t9.wr(this.gpx())
+this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-QE:[function(a){var z=this.Gv
+Fv:[function(a,b){this.YM+=4
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+QE:[function(a){var z=this.YM
 if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-SY:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
+this.YM=z
+if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
+Gv:function(){return},
+PS:[function(){var z=(this.YM&4294967293)>>>0
+this.YM=z
 if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
+this.YM=(z|1)>>>0
+z=this.EU
+if(z!=null)this.t9.ww(z)},"$0","gpx",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 dR:{
-"^":"Xs:74;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b,c",
+$0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Xs:130;a,b",
+"^":"Xs:132;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"Xs:74;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
 "^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
+z=H.W8(this,"og",0)
+y=H.W8(this,"og",1)
 x=$.X3
 w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.ps(a)
-v.fm(0,d)
-v.y5(c)
-return v},
+w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w.Cy(a,d,c,b,y)
+w.JC(this,a,d,c,b,z,y)
+return w},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
-kM:function(a,b){b.Rg(0,a)},
+FC:function(a,b){b.Rg(0,a)},
 $aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
+"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
+Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
+MR:function(a,b){if((this.YM&2)!==0)return
+P.KA.prototype.MR.call(this,a,b)},
+jy:[function(){var z=this.lI
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
+z.WJ(0)},"$0","gb9",0,0,17],
+ie:[function(){var z=this.lI
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},116],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,131,24,25],
-Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
+z.QE(0)},"$0","gxl",0,0,17],
+cZ:function(){var z=this.lI
+if(z!=null){this.lI=null
+z.Gv()}return},
+Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},118],
+SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,133,23,24],
+oZ:[function(){this.AN()},"$0","gos",0,0,17],
+JC:function(a,b,c,d,e,f,g){var z,y
+z=this.gwU()
+y=this.gPr()
+this.lI=this.m7.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
-"^":"og;ZP,Sb",
-Dr:function(a){return this.ZP.$1(a)},
-kM:function(a,b){var z,y,x,w,v
+"^":"og;VL,Sb",
+Ub:function(a){return this.VL.$1(a)},
+FC:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.Dr(a)}catch(w){v=H.Ru(w)
+try{z=this.Ub(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
+x=new H.oP(w,null)
+b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
 $aswS:null},
 c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-kM:function(a,b){var z,y,x,w,v
+"^":"og;xj,Sb",
+Eh:function(a){return this.xj.$1(a)},
+FC:function(a,b){var z,y,x,w,v
 z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
+try{z=this.Eh(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
+x=new H.oP(w,null)
+b.MR(y,x)
 return}J.wx(b,z)}},
 AE:{
-"^":"og;pK,Sb",
-Iy:function(a){return this.pK.$1(a)},
-kM:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.Iy(a));w.G();){z=w.gl()
+"^":"og;yj,Sb",
+bZ:function(a){return this.yj.$1(a)},
+FC:function(a,b){var z,y,x,w,v
+try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
+x=new H.oP(v,null)
+b.MR(y,x)}}},
 pt:{
-"^":"og;Em,Sb",
-kM:function(a,b){var z=this.Em
-if(z>0){this.Em=z-1
+"^":"og;Km,Sb",
+FC:function(a,b){var z=this.Km
+if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-U6:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
 $aswS:null},
 kWp:{
 "^":"a;"},
-aYy:{
+fM:{
+"^":"a;M5,ig>"},
+n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,hY<,Ot<,jH<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,xk<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.hY.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
+"^":"a;lR,cP,U1,jH,Ka,Xp,o2,rb,Zqn,rF,JS,nw",
+hk:function(a,b){return this.lR.$2(a,b)},
+Gr:function(a){return this.cP.$1(a)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
-wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$1(a)},
+cR:function(a){return this.Xp.$1(a)},
+O8:function(a){return this.o2.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
-uN:function(a,b){return this.Zq.$2(a,b)},
+uN:function(a,b){return this.Zqn.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)}},
+iT:function(a){return this.nw.$1$specification(a)},
+$isyQ:true},
 e4y:{
 "^":"a;"},
 JBS:{
 "^":"a;"},
 Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-c1:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().ghY()==null;)z=z.geT(z)
-return z.gtp().ghY().$4(z,new P.Id(z.geT(z)),a,b)},
-Eo:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().gjH()==null;)z=z.geT(z)
-return z.gtp().gjH().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+"^":"a;bk",
 RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gxk()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gxk().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+z=this.bk.gOf()
+y=z.M5
+z.ig.$4(y,P.Cw(y),a,b)}},
+m0:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
-bH:function(a){var z,y,x,w
+fC:function(a){return this.gF7()===a.gF7()},
+$ism0:true},
+FQ:{
+"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
+gyL:function(){var z=this.ye
+if(z!=null)return z
+z=new P.Id(this)
+this.ye=z
+return z},
+gF7:function(){return this.pB.M5},
+ww:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
+if(b)return new P.OJ(this,z)
+else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
-rO:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
+rO:function(a,b){var z=this.cR(a)
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
 mS:function(a){return this.rO(a,!0)},
-cl:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.cZ(this,z)}},
-TF:{
-"^":"Xs:74;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Xs:74;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Xs:13;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Xs:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Xs:80;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-cZ:{
-"^":"Xs:80;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
+PT:function(a,b){var z=this.O8(a)
+if(b)return new P.N9(this,z)
+else return new P.ap(this,z)},
+t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
-if(y!=null||z.x4(0,b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).Eo(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).V6(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-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)}},
+if(y!=null||z.NZ(0,b))return y
+x=this.eT
+if(x!=null){w=J.UQ(x,b)
+if(w!=null)z.u(0,b,w)
+return w}return},
+hk:function(a,b){var z,y,x
+z=this.pB
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+c6:function(a,b){var z,y,x
+z=this.Gt
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){var z,y,x
+z=this.vr
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+FI:function(a,b){var z,y,x
+z=this.JY
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+mg:function(a,b,c){var z,y,x
+z=this.HG
+y=z.M5
+x=P.Cw(y)
+return z.ig.$6(y,x,this,a,b,c)},
+Al:function(a){var z,y,x
+z=this.Tr
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+cR:function(a){var z,y,x
+z=this.kX
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+O8:function(a){var z,y,x
+z=this.c5
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+wr:function(a){var z,y,x
+z=this.Of
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,a)},
+uN:function(a,b){var z,y,x
+z=this.x6
+y=z.M5
+x=P.Cw(y)
+return z.ig.$5(y,x,this,a,b)},
+Ch:function(a,b){var z,y,x
+z=this.kP
+y=z.M5
+x=P.Cw(y)
+return z.ig.$4(y,x,this,b)},
+bC:function(a,b,c){var z
+this.vr=this.eT.gvr()
+this.JY=this.eT.gJY()
+this.HG=this.eT.gHG()
+z=b.Ka
+this.Tr=z!=null?new P.fM(this,z):this.eT.gTr()
+z=b.Xp
+this.kX=z!=null?new P.fM(this,z):this.eT.gkX()
+this.c5=this.eT.gc5()
+this.Of=this.eT.gOf()
+this.x6=this.eT.gx6()
+this.Jy=this.eT.gJy()
+this.kP=this.eT.gkP()
+this.Gt=this.eT.gGt()
+this.pB=this.eT.gpB()}},
+OJ:{
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+Yn:{
+"^":"Xs:76;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+eP:{
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+aQ:{
+"^":"Xs:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+N9:{
+"^":"Xs:81;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+ap:{
+"^":"Xs:81;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
 FO:{
-"^":"Xs:74;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+"^":"Xs:76;a,b",
+$0:[function(){throw H.b(P.Yq(this.a,this.b))},"$0",null,0,0,null,"call"],
 $isEH:true},
-eM:{
-"^":"Xs:74;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Uez:{
-"^":"Xs:80;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-ghY:function(){return P.r6()},
-Gr:function(a){return this.ghY().$1(a)},
-gOt:function(){return P.MM()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-gjH:function(){return P.tz()},
-mg:function(a,b,c){return this.gjH().$3(a,b,c)},
-gKa:function(){return P.EU()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.L8()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.Lm()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.oQ()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gxk:function(){return P.Oj()},
-qp:function(a){return this.gxk().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"m0;",
+gvr:function(){return C.lk},
+gJY:function(){return C.Yl},
+gHG:function(){return C.Gu},
+gTr:function(){return C.pj},
+gkX:function(){return C.F6},
+gc5:function(){return C.Xk},
+gOf:function(){return C.Zc},
+gx6:function(){return C.Sq},
+gJy:function(){return C.NA},
+gkP:function(){return C.uo},
+gGt:function(){return C.mc},
+gpB:function(){return C.Rt},
 geT:function(a){return},
-gtp:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
+gSe:function(){return $.Rf()},
+gyL:function(){var z=$.Sk
+if(z!=null)return z
+z=new P.Id(this)
+$.Sk=z
+return z},
+gF7:function(){return this},
+ww:function(a){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$0()
+return x}x=P.Ki(null,null,this,a)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+m1:function(a,b){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$1(b)
+return x}x=P.V7(null,null,this,a,b)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+z8:function(a,b,c){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$2(b,c)
+return x}x=P.Mu(null,null,this,a,b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+xi:function(a,b){if(b)return new P.hj(this,a)
+else return new P.MK(this,a)},
+ce:function(a){return this.xi(a,!0)},
+rO:function(a,b){if(b)return new P.pQ(this,a)
+else return new P.XW(this,a)},
+mS:function(a){return this.rO(a,!0)},
+PT:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.E1(this,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.Ki(this,null,this,a)},
-FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
+hk:function(a,b){return P.CK(null,null,this,a,b)},
+c6:function(a,b){return P.E1(null,null,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){if($.X3===C.NU)return a.$0()
+return P.Ki(null,null,this,a)},
+FI:function(a,b){if($.X3===C.NU)return a.$1(b)
+return P.V7(null,null,this,a,b)},
+mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
+return P.Mu(null,null,this,a,b,c)},
 Al:function(a){return a},
-wY:function(a){return a},
+cR:function(a){return a},
 O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
+wr:function(a){P.Tk(null,null,this,a)},
+uN:function(a,b){return P.YF(a,b)},
+Ch:function(a,b){H.Af(b)},
+static:{"^":"ln,Sk"}},
+hj:{
+"^":"Xs:76;a,b",
+$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+MK:{
+"^":"Xs:76;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+pQ:{
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+XW:{
+"^":"Xs:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+Ze:{
+"^":"Xs:81;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+dM:{
+"^":"Xs:81;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true}}],["","",,P,{
 "^":"",
 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])},
-TQ:[function(a,b){return J.xC(a,b)},"$2","WbE",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,48,49,50],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
-return P.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+return P.uP(a,b,c,d,e)},
 Rd:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 Ix:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
@@ -6786,7 +6838,7 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.vM},
+return y.IN},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -6794,7 +6846,7 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-return z.gvM()},
+return z.gIN()},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -6851,101 +6903,101 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
+z.pop()}return y.gIN()},
 bA:{
-"^":"a;X5,vv,OX,OB,wV",
+"^":"a;X5,Mb,cG,Cs,Jp",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
 gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
 gUQ:function(a){return H.fR(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
-x4:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.Zt(b)},
-Zt:function(a){var z=this.OB
+NZ:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return y==null?!1:y[b]!=null}else return this.KY(b)},
+KY:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
+return this.DF(z[this.rk(a)],a)>=0},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
 else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.OX
+y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.cG
 if(w==null)y=null
 else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
+y=x===w?null:x}return y}else return this.c8(b)},
+c8:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 return x<0?null:y[x+1]},
 u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
+this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:function(a,b){var z,y,x,w
+z=this.Cs
 if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
+this.Cs=z}y=this.rk(a)
 x=z[y]
 if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
+this.Jp=null}else{w=this.DF(x,a)
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+this.Jp=null}}},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return;--this.X5
-this.wV=null
+this.Jp=null
 return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.Jp=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0}},
 aN:function(a,b){var z,y,x,w
-z=this.Ig()
+z=this.Nm()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
+if(z!==this.Jp)throw H.b(P.a4(this))}},
+Nm:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.Jp
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
-x=this.vv
+x=this.Mb
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
+s=this.cG
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
+for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.Jp=y
 return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
+u9:function(a,b,c){if(a[b]==null){++this.X5
+this.Jp=null}P.cW(a,b,c)},
+H4:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b];--this.X5
-this.wV=null
+this.Jp=null
 return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
@@ -6959,186 +7011,186 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
 $isEH:true},
 DJ:{
 "^":"Xs;a",
-$2:function(a,b){this.a.u(0,a,b)},
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.a,"bA")}},
 PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
+"^":"bA;X5,Mb,cG,Cs,Jp",
+rk:function(a){return H.CU(a)&0x3ffffff},
+DF:function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"bA;m6,RG,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.RG.$1(a)},
-Xy:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Xy(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a,b){if(this.Xy(b)!==!0)return!1
-return P.bA.prototype.Zt.call(this,b)},
-Rz:function(a,b){if(this.Xy(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
+"^":"bA;AH,dI,lO,X5,Mb,cG,Cs,Jp",
+Xm:function(a,b){return this.AH.$2(a,b)},
+jP:function(a){return this.dI.$1(a)},
+Bc:function(a){return this.lO.$1(a)},
+t:function(a,b){if(this.Bc(b)!==!0)return
+return P.bA.prototype.c8.call(this,b)},
+u:function(a,b,c){P.bA.prototype.Gk.call(this,b,c)},
+NZ:function(a,b){if(this.Bc(b)!==!0)return!1
+return P.bA.prototype.KY.call(this,b)},
+Rz:function(a,b){if(this.Bc(b)!==!0)return
+return P.bA.prototype.qg.call(this,b)},
+rk:function(a){return this.jP(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
+for(y=0;y<z;y+=2)if(this.Xm(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+static:{uP: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:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
 fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
+"^":"mW;ZD",
+gB:function(a){return this.ZD.X5},
+gl0:function(a){return this.ZD.X5===0},
+gA:function(a){var z=this.ZD
+z=new P.EQ(z,z.Nm(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Gs:function(a,b){return this.Fb.x4(0,b)},
+tg:function(a,b){return this.ZD.NZ(0,b)},
 aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
+z=this.ZD
+y=z.Nm()
 for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
+if(y!==z.Jp)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
-"^":"a;Fb,wV,zi,fD",
+"^":"a;ZD,Jp,iY,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
+z=this.Jp
+y=this.iY
+x=this.ZD
+if(z!==x.Jp)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
-this.zi=y+1
+this.iY=y+1
 return!0}}},
 YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
+"^":"a;X5,Mb,cG,Cs,HH,Nz,HU",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
 gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
 gUQ:function(a){return H.fR(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
-x4:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+NZ:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null)return!1
-return y[b]!=null}else return this.Zt(b)},
-Zt:function(a){var z=this.OB
+return y[b]!=null}else return this.KY(b)},
+KY:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 FV:function(a,b){J.Me(b,new P.pk(this))},
 t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return
 y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null)return
 y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
+return y==null?null:y.gcF()}else return this.c8(b)},
+c8:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
-return y[x].gcA()},
+return y[x].gcF()},
 u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
+this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:function(a,b){var z,y,x,w
+z=this.Cs
 if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
+this.Cs=z}y=this.rk(a)
 x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
+if(x==null)z[y]=[this.x4(a,b)]
+else{w=this.DF(x,a)
+if(w>=0)x[w].scF(b)
+else x.push(this.x4(a,b))}},
 to:function(a,b,c){var z
-if(this.x4(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.t(0,b)
 z=c.$0()
 this.u(0,b,z)
 return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x,w
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
+this.GS(w)
+return w.gcF()},
+V1:function(a){if(this.X5>0){this.Nz=null
+this.HH=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0
-this.zN=this.zN+1&67108863}},
+this.HU=this.HU+1&67108863}},
 aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(z),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
+z=this.HH
+y=this.HU
+for(;z!=null;){b.$2(z.gv8(z),z.gcF())
+if(y!==this.HU)throw H.b(P.a4(this))
+z=z.gtL()}},
+u9:function(a,b,c){var z=a[b]
+if(z==null)a[b]=this.x4(b,c)
+else z.scF(c)},
+H4:function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
-this.Vb(z)
+this.GS(z)
 delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
+return z.gcF()},
+x4:function(a,b){var z,y
 z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
+if(this.HH==null){this.Nz=z
+this.HH=z}else{y=this.Nz
+z.n8=y
+y.stL(z)
+this.Nz=z}++this.X5
+this.HU=this.HU+1&67108863
 return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+GS:function(a){var z,y
+z=a.gn8()
+y=a.gtL()
+if(z==null)this.HH=y
+else z.stL(y)
+if(y==null)this.Nz=z
+else y.sn8(z);--this.X5
+this.HU=this.HU+1&67108863},
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.up(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.nG(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isFo:true,
 $isT8:true,
 $asT8:null,
@@ -7147,290 +7199,290 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,132,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
 $isEH:true},
 pk:{
 "^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"YB")}},
 db:{
-"^":"a;kh>,cA@,DG@,zQ@"},
+"^":"a;v8>,cF@,tL@,n8@"},
 i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
+"^":"mW;ZD",
+gB:function(a){return this.ZD.X5},
+gl0:function(a){return this.ZD.X5===0},
 gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
+z=this.ZD
+y=new P.N6(z,z.HU,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
+y.Qx=z.HH
 return y},
-Gs:function(a,b){return this.Fb.x4(0,b)},
+tg:function(a,b){return this.ZD.NZ(0,b)},
 aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh(y))
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
+z=this.ZD
+y=z.HH
+x=z.HU
+for(;y!=null;){b.$1(y.gv8(y))
+if(x!==z.HU)throw H.b(P.a4(z))
+y=y.gtL()}},
 $isyN:true},
 N6:{
-"^":"a;Fb,zN,zq,fD",
+"^":"a;ZD,HU,Qx,fD",
 gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
+G:function(){var z=this.ZD
+if(this.HU!==z.HU)throw H.b(P.a4(z))
+else{z=this.Qx
 if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh(z)
-this.zq=this.zq.gDG()
+return!1}else{this.fD=z.gv8(z)
+this.Qx=this.Qx.gtL()
 return!0}}}},
 jg:{
-"^":"u3T;X5,vv,OX,OB,CQ",
-Ys:function(){var z=new P.jg(0,null,null,null,null)
+"^":"u3T;X5,Mb,cG,Cs,vw",
+iL:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
+gA:function(a){var z=new P.cN(this,this.ij(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-Gs:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
+tg:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return y==null?!1:y[b]!=null}else return this.PR(b)},
+PR:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 hV:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
-if(z)return this.Gs(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
+if(z)return this.tg(0,a)?a:null
+return this.GP(a)},
+GP:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 return J.UQ(y,x)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+this.Mb=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.jBG()
-this.OB=z}y=this.nm(b)
+this.cG=y
+x=y}return this.bQ(x,b)}else return this.B7(0,b)},
+B7:function(a,b){var z,y,x
+z=this.Cs
+if(z==null){z=P.V5()
+this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
+else{if(this.DF(x,b)>=0)return!1
 x.push(b)}++this.X5
-this.CQ=null
+this.vw=null
 return!0},
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return!1;--this.X5
-this.CQ=null
+this.vw=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.CQ=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.vw=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.CQ
+ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
 y.fixed$length=init
-x=this.vv
+x=this.Mb
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.OX
+s=this.cG
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.CQ=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.vw=y
 return y},
-jn:function(a,b){if(a[b]!=null)return!1
+bQ:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
-this.CQ=null
+this.vw=null
 return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.CQ=null
+H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
+this.vw=null
 return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{jBG:function(){var z=Object.create(null)
+static:{V5:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;O2,CQ,zi,fD",
+"^":"a;vY,vw,iY,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.CQ
-y=this.zi
-x=this.O2
-if(z!==x.CQ)throw H.b(P.a4(x))
+z=this.vw
+y=this.iY
+x=this.vY
+if(z!==x.vw)throw H.b(P.a4(x))
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
-this.zi=y+1
+this.iY=y+1
 return!0}}},
 D0:{
-"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
-Ys:function(){var z=new P.D0(0,null,null,null,null,null,0)
+"^":"u3T;X5,Mb,cG,Cs,HH,Nz,HU",
+iL:function(){var z=new P.D0(0,null,null,null,null,null,0)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
-z.zq=z.O2.H9
+gA:function(a){var z=H.VM(new P.zQ(this,this.HU,null,null),[null])
+z.Qx=z.vY.HH
 return z},
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-Gs:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+tg:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
 if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
+return y[b]!=null}else return this.PR(b)},
+PR:function(a){var z=this.Cs
 if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
+return this.DF(z[this.rk(a)],a)>=0},
 hV:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
-if(z)return this.Gs(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
+if(z)return this.tg(0,a)?a:null
+else return this.GP(a)},
+GP:function(a){var z,y,x
+z=this.Cs
 if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return
 return J.Nq(J.UQ(y,x))},
 aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
+z=this.HH
+y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
+if(y!==this.HU)throw H.b(P.a4(this))
+z=z.gtL()}},
+grZ:function(a){var z=this.Nz
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
+if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
+this.Mb=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
+this.cG=y
+x=y}return this.bQ(x,b)}else return this.B7(0,b)},
+B7:function(a,b){var z,y,x
+z=this.Cs
 if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
+this.Cs=z}y=this.rk(b)
 x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
+if(x==null)z[y]=[this.yo(b)]
+else{if(this.DF(x,b)>=0)return!1
+x.push(this.yo(b))}return!0},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
+else return this.qg(b)},
+qg:function(a){var z,y,x
+z=this.Cs
 if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
+y=z[this.rk(a)]
+x=this.DF(y,a)
 if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
+this.GS(y.splice(x,1)[0])
 return!0},
-Nk:function(a,b){this.h6(b,!0)},
-h6:function(a,b){var z,y,x,w,v
-z=this.H9
+uk:function(a,b){this.YS(b,!0)},
+YS:function(a,b){var z,y,x,w,v
+z=this.HH
 for(;z!=null;z=x){y=z.gGc(z)
-x=z.gDG()
-w=this.zN
+x=z.gtL()
+w=this.HU
 v=a.$1(y)
-if(w!==this.zN)throw H.b(P.a4(this))
+if(w!==this.HU)throw H.b(P.a4(this))
 if(b===v)this.Rz(0,y)}},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
+V1:function(a){if(this.X5>0){this.Nz=null
+this.HH=null
+this.Cs=null
+this.cG=null
+this.Mb=null
 this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
+this.HU=this.HU+1&67108863}},
+bQ:function(a,b){if(a[b]!=null)return!1
+a[b]=this.yo(b)
 return!0},
-Nv:function(a,b){var z
+H4:function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
-this.Vb(z)
+this.GS(z)
 delete a[b]
 return!0},
-xf:function(a){var z,y
+yo:function(a){var z,y
 z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
+if(this.HH==null){this.Nz=z
+this.HH=z}else{y=this.Nz
+z.n8=y
+y.stL(z)
+this.Nz=z}++this.X5
+this.HU=this.HU+1&67108863
 return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH:function(a,b){var z,y
+GS:function(a){var z,y
+z=a.gn8()
+y=a.gtL()
+if(z==null)this.HH=y
+else z.stL(y)
+if(y==null)this.Nz=z
+else y.sn8(z);--this.X5
+this.HU=this.HU+1&67108863},
+rk:function(a){return J.v1(a)&0x3ffffff},
+DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7439,16 +7491,16 @@
 delete z["<non-identifier-key>"]
 return z}}},
 tj:{
-"^":"a;Gc>,DG@,zQ@"},
+"^":"a;Gc>,tL@,n8@"},
 zQ:{
-"^":"a;O2,zN,zq,fD",
+"^":"a;vY,HU,Qx,fD",
 gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
+G:function(){var z=this.vY
+if(this.HU!==z.HU)throw H.b(P.a4(z))
+else{z=this.Qx
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
+this.Qx=this.Qx.gtL()
 return!0}}}},
 Yp:{
 "^":"w2Y;G4",
@@ -7458,15 +7510,15 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.Ys()
+zH:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.fR(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-Gs:function(a,b){var z
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
 aN:function(a,b){var z
@@ -7475,18 +7527,17 @@
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
+if(b===""){do{x=H.d(z.gl())
+y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
+for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.vM+=x}}return y.vM},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
+tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.ip(this,"mW",0))
+zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7495,7 +7546,7 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(H.DU())
@@ -7508,7 +7559,7 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,71],
+bu:[function(a){return P.Ix(this,"(",")")},"$0","gCR",0,0,73],
 $isQV:true,
 $asQV:null},
 ark:{
@@ -7522,7 +7573,7 @@
 $asQV:null},
 lD:{
 "^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
+gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.W8(a,"lD",0)])},
 Zv:function(a,b){return this.t(a,b)},
 aN:function(a,b){var z,y
 z=this.gB(a)
@@ -7532,7 +7583,7 @@
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
-Gs:function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(a)
 for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
@@ -7544,28 +7595,28 @@
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},
-ad: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.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+return z.IN},
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
+if(b){z=H.VM([],[H.W8(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
 y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
+z=H.VM(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y
-z=P.Ls(null,null,null,H.ip(a,"lD",0))
+z=P.Ls(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -7573,27 +7624,27 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-Nk:function(a,b){P.rC(a,b,!1)},
+uk:function(a,b){P.rC(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
 Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
+fV:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
 if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
 aM:function(a,b,c){var z,y,x,w
-this.pZ(a,b,c)
+this.fV(a,b,c)
 z=c-b
-y=H.VM([],[H.ip(a,"lD",0)])
+y=H.VM([],[H.W8(a,"lD",0)])
 C.Nm.sB(y,z)
 for(x=0;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
 y[x]=w}return y},
-Mu:function(a,b,c){this.pZ(a,b,c)
+Yc:function(a,b,c){this.fV(a,b,c)
 return H.c1(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
+oq:function(a,b,c){var z
+this.fV(a,b,c)
 z=c-b
 this.YW(a,b,this.gB(a)-z,a,c)
 this.sB(a,this.gB(a)-z)},
@@ -7615,7 +7666,7 @@
 if(c>=this.gB(a))return-1
 for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
 return-1},
-Mw:function(a,b){return this.XU(a,b,0)},
+OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
 c=this.gB(a)-1
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
@@ -7626,20 +7677,20 @@
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
 this.u(a,b,c)},
-oF:function(a,b,c){var z,y
+UG:function(a,b,c){var z,y
 if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.x(c)
 if(!!z.$isyN)c=z.br(c)
 y=J.q8(c)
 this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Yj(a,b,c)},
-Yj:function(a,b,c){var z,y
+this.Mh(a,b,c)},
+Mh:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -7654,67 +7705,98 @@
 aN:function(a,b){var z,y
 for(z=J.mY(this.gvc(this));z.G();){y=z.gl()
 b.$2(y,this.t(0,y))}},
-FV:function(a,b){var z,y,x,w
-for(z=J.RE(b),y=z.gvc(b),x=y.Fb,y=H.VM(new P.N6(x,x.zN,null,null),[H.u3(y,0)]),y.zq=y.Fb.H9;y.G();){w=y.fD
-this.u(0,w,z.t(b,w))}},
-x4:function(a,b){return J.wo(this.gvc(this),b)},
+FV:function(a,b){var z,y,x
+for(z=J.RE(b),y=z.gvc(b),y=y.gA(y);y.G();){x=y.gl()
+this.u(0,x,z.t(b,x))}},
+NZ:function(a,b){return J.kE(this.gvc(this),b)},
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.wU(this),[H.ip(this,"Yk",1)])},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
 wU:{
-"^":"mW;Fb",
-gB:function(a){var z=this.Fb
+"^":"mW;ZD",
+gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
-gl0:function(a){var z=this.Fb
+gl0:function(a){var z=this.ZD
 return J.FN(z.gvc(z))},
-gor:function(a){var z=this.Fb
+gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-grZ:function(a){var z=this.Fb
+grZ:function(a){var z=this.ZD
 return z.t(0,J.uY(z.gvc(z)))},
-gA:function(a){var z=this.Fb
+gA:function(a){var z=this.ZD
 z=new P.vc(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $isyN:true},
 vc:{
-"^":"a;wV,Fb,fD",
-G:function(){var z=this.wV
-if(z.G()){this.fD=this.Fb.t(0,z.gl())
+"^":"a;Jp,ZD,fD",
+G:function(){var z=this.Jp
+if(z.G()){this.fD=this.ZD.t(0,z.gl())
 return!0}this.fD=null
 return!1},
 gl:function(){return this.fD}},
+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"))},
+$isT8:true,
+$asT8:null},
+Pnf:{
+"^":"a;",
+t:function(a,b){return this.ZD.t(0,b)},
+u:function(a,b,c){this.ZD.u(0,b,c)},
+FV:function(a,b){this.ZD.FV(0,b)},
+V1:function(a){this.ZD.V1(0)},
+NZ:function(a,b){return this.ZD.NZ(0,b)},
+aN:function(a,b){this.ZD.aN(0,b)},
+gl0:function(a){return this.ZD.X5===0},
+gor:function(a){return this.ZD.X5!==0},
+gB:function(a){return this.ZD.X5},
+gvc:function(a){var z=this.ZD
+return H.VM(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.ZD.Rz(0,b)},
+bu:[function(a){return P.vW(this.ZD)},"$0","gCR",0,0,73],
+gUQ:function(a){var z=this.ZD
+return z.gUQ(z)},
+$isT8:true,
+$asT8:null},
+A2:{
+"^":"Pnf+KPM;ZD",
+$isT8:true,
+$asT8:null},
 LG:{
-"^":"Xs:80;a,b",
-$2:function(a,b){var z=this.a
+"^":"Xs:81;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,135,66,"call"],
 $isEH:true},
 Sw:{
-"^":"mW;v5,av,zX,qT",
-gA:function(a){var z=new P.fO(this,this.zX,this.qT,this.av,null)
+"^":"mW;dr,QN,Bq,Wf",
+gA:function(a){var z=new P.fO(this,this.Bq,this.Wf,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.zX;y=(y+1&this.v5.length-1)>>>0){x=this.v5
+z=this.Wf
+for(y=this.QN;y!==this.Bq;y=(y+1&this.dr.length-1)>>>0){x=this.dr
 if(y<0||y>=x.length)return H.e(x,y)
 b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.zX},
-gB:function(a){return(this.zX-this.av&this.v5.length-1)>>>0},
+if(z!==this.Wf)H.vh(P.a4(this))}},
+gl0:function(a){return this.QN===this.Bq},
+gB:function(a){return(this.Bq-this.QN&this.dr.length-1)>>>0},
 grZ:function(a){var z,y,x
-z=this.av
-y=this.zX
+z=this.QN
+y=this.Bq
 if(z===y)throw H.b(H.DU())
-z=this.v5
+z=this.dr
 x=z.length
 y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
@@ -7723,90 +7805,90 @@
 if(b){z=H.VM([],[H.u3(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}this.Ix(z)
+z=H.VM(y,[H.u3(this,0)])}this.BR(z)
 return z},
 br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
+h:function(a,b){this.B7(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=b.length
 y=this.gB(this)
 x=y+z
-w=this.v5
+w=this.dr
 v=w.length
-if(x>=v){u=P.uay(x)
+if(x>=v){u=P.ra(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.u3(this,0)])
-this.zX=this.Ix(t)
-this.v5=t
-this.av=0
+this.Bq=this.BR(t)
+this.dr=t
+this.QN=0
 H.qG(t,y,x,b,0)
-this.zX+=z}else{x=this.zX
+this.Bq+=z}else{x=this.Bq
 s=v-x
 if(z<s){H.qG(w,x,x+z,b,0)
-this.zX+=z}else{r=z-s
+this.Bq+=z}else{r=z-s
 H.qG(w,x,x+s,b,0)
-x=this.v5
+x=this.dr
 H.qG(x,0,r,b,s)
-this.zX=r}}++this.qT},
+this.Bq=r}}++this.Wf},
 Rz:function(a,b){var z,y
-for(z=this.av;z!==this.zX;z=(z+1&this.v5.length-1)>>>0){y=this.v5
+for(z=this.QN;z!==this.Bq;z=(z+1&this.dr.length-1)>>>0){y=this.dr
 if(z<0||z>=y.length)return H.e(y,z)
-if(J.xC(y[z],b)){this.bB(z);++this.qT
+if(J.xC(y[z],b)){this.qg(z);++this.Wf
 return!0}}return!1},
-h6:function(a,b){var z,y,x,w
-z=this.qT
-y=this.av
-for(;y!==this.zX;){x=this.v5
+YS:function(a,b){var z,y,x,w
+z=this.Wf
+y=this.QN
+for(;y!==this.Bq;){x=this.dr
 if(y<0||y>=x.length)return H.e(x,y)
 x=a.$1(x[y])
-w=this.qT
+w=this.Wf
 if(z!==w)H.vh(P.a4(this))
-if(b===x){y=this.bB(y)
-z=++this.qT}else y=(y+1&this.v5.length-1)>>>0}},
-Nk:function(a,b){this.h6(b,!0)},
+if(b===x){y=this.qg(y)
+z=++this.Wf}else y=(y+1&this.dr.length-1)>>>0}},
+uk:function(a,b){this.YS(b,!0)},
 V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.zX
-if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.zX=0
-this.av=0;++this.qT}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
+z=this.QN
+y=this.Bq
+if(z!==y){for(x=this.dr,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
+x[z]=null}this.Bq=0
+this.QN=0;++this.Wf}},
+bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
-z=this.av
-if(z===this.zX)throw H.b(H.DU());++this.qT
-y=this.v5
+z=this.QN
+if(z===this.Bq)throw H.b(H.DU());++this.Wf
+y=this.dr
 x=y.length
 if(z>=x)return H.e(y,z)
 w=y[z]
 y[z]=null
-this.av=(z+1&x-1)>>>0
+this.QN=(z+1&x-1)>>>0
 return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.zX
+B7:function(a,b){var z,y,x
+z=this.dr
+y=this.Bq
 x=z.length
 if(y<0||y>=x)return H.e(z,y)
 z[y]=b
 x=(y+1&x-1)>>>0
-this.zX=x
-if(this.av===x)this.M9();++this.qT},
-bB:function(a){var z,y,x,w,v,u,t,s
-z=this.v5
+this.Bq=x
+if(this.QN===x)this.OO();++this.Wf},
+qg:function(a){var z,y,x,w,v,u,t,s
+z=this.dr
 y=z.length
 x=y-1
-w=this.av
-v=this.zX
+w=this.QN
+v=this.Bq
 if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
 if(t<0||t>=y)return H.e(z,t)
 v=z[t]
 if(u<0||u>=y)return H.e(z,u)
 z[u]=v}if(w>=y)return H.e(z,w)
 z[w]=null
-this.av=(w+1&x)>>>0
+this.QN=(w+1&x)>>>0
 return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.zX=w
+this.Bq=w
 for(u=a;u!==w;u=s){s=(u+1&x)>>>0
 if(s<0||s>=y)return H.e(z,s)
 v=z[s]
@@ -7814,52 +7896,52 @@
 z[u]=v}if(w<0||w>=y)return H.e(z,w)
 z[w]=null
 return a}},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
+OO:function(){var z,y,x,w
+z=Array(this.dr.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.u3(this,0)])
-z=this.v5
-x=this.av
+z=this.dr
+x=this.QN
 w=z.length-x
 H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
+z=this.QN
+x=this.dr
 H.qG(y,w,w+z,x,0)
-this.av=0
-this.zX=this.v5.length
-this.v5=y},
-Ix:function(a){var z,y,x,w,v
-z=this.av
-y=this.zX
-x=this.v5
+this.QN=0
+this.Bq=this.dr.length
+this.dr=y},
+BR:function(a){var z,y,x,w,v
+z=this.QN
+y=this.Bq
+x=this.dr
 if(z<=y){w=y-z
 H.qG(a,0,w,x,z)
 return w}else{v=x.length-z
 H.qG(a,0,v,x,z)
-z=this.zX
-y=this.v5
+z=this.Bq
+y=this.dr
 H.qG(a,v,v+z,y,0)
-return this.zX+v}},
-Pt:function(a,b){var z=Array(8)
+return this.Bq+v}},
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
-this.v5=H.VM(z,[b])},
+this.dr=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",uay:function(a){var z
+static:{"^":"TNe",ra: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}}}},
 fO:{
-"^":"a;Lz,pP,qT,Dc,fD",
+"^":"a;dk,pP,Wf,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
+z=this.dk
+if(this.Wf!==z.Wf)H.vh(P.a4(z))
 y=this.Dc
 if(y===this.pP){this.fD=null
-return!1}z=z.v5
+return!1}z=z.dr
 x=z.length
 if(y>=x)return H.e(z,y)
 this.fD=z[y]
@@ -7873,8 +7955,8 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
-Nk:function(a,b){var z,y,x
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
+uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
@@ -7887,24 +7969,23 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Rdf",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
+if(b===""){do{x=H.d(z.gl())
+y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
+for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.vM+=x}}return y.vM},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
@@ -7915,30 +7996,30 @@
 do y=z.gl()
 while(z.G())
 return y},
-$isJb:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 Vj5:{
 "^":"lfu;"},
 oz:{
-"^":"a;G3>,Bb>,T8>",
+"^":"a;nl>,Bb>,T8>",
 $isoz:true},
 jp:{
-"^":"oz;P*,G3,Bb,T8",
+"^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
+oB:function(a){var z,y,x,w,v,u,t,s
+z=this.og
 if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
+y=this.fu
+for(x=y,w=x,v=null;!0;){v=this.R2(z.nl,a)
 u=J.Wx(v)
 if(u.D(v,0)){u=z.Bb
 if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(v,0)){t=z.Bb
+v=this.R2(u.nl,a)
+if(J.xZ(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -7947,7 +8028,7 @@
 x=z
 z=s}else{if(u.C(v,0)){u=z.T8
 if(u==null)break
-v=this.yV(u.G3,a)
+v=this.R2(u.nl,a)
 if(J.u6(v,0)){t=z.T8
 z.T8=t.Bb
 t.Bb=z
@@ -7959,71 +8040,71 @@
 x.Bb=z.T8
 z.Bb=y.T8
 z.T8=y.Bb
-this.aY=z
+this.og=z
 y.T8=null
-y.Bb=null;++this.bb
+y.Bb=null;++this.wq
 return v},
-Xu:function(a){var z,y
+nJ:function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
 y.Bb=z}return z},
-bB:function(a){var z,y,x
-if(this.aY==null)return
-if(!J.xC(this.vh(a),0))return
-z=this.aY;--this.J0
+qg:function(a){var z,y,x
+if(this.og==null)return
+if(!J.xC(this.oB(a),0))return
+z=this.og;--this.hm
 y=z.Bb
-if(y==null)this.aY=z.T8
+if(y==null)this.og=z.T8
 else{x=z.T8
-y=this.Xu(y)
-this.aY=y
-y.T8=x}++this.qT
+y=this.nJ(y)
+this.og=y
+y.T8=x}++this.Wf
 return z},
-K8:function(a,b){var z,y;++this.J0;++this.qT
-if(this.aY==null){this.aY=a
+Oa:function(a,b){var z,y;++this.hm;++this.Wf
+if(this.og==null){this.og=a
 return}z=J.u6(b,0)
-y=this.aY
+y=this.og
 if(z){a.Bb=y
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
+y.Bb=null}this.og=a}},
 Ba:{
-"^":"vX1;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Xy:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
+"^":"vX1;V2s,lO,og,fu,hm,Wf,wq",
+L4:function(a,b){return this.V2s.$2(a,b)},
+Bc:function(a){return this.lO.$1(a)},
+R2:function(a,b){return this.L4(a,b)},
 t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Xy(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
+if(this.Bc(b)!==!0)return
+if(this.og!=null)if(J.xC(this.oB(b),0))return this.og.P
 return},
 Rz:function(a,b){var z
-if(this.Xy(b)!==!0)return
-z=this.bB(b)
+if(this.Bc(b)!==!0)return
+z=this.qg(b)
 if(z!=null)return z.P
 return},
 u:function(a,b,c){var z
 if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
+z=this.oB(b)
+if(J.xC(z,0)){this.og.P=c
+return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
 FV:function(a,b){H.bQ(b,new P.QG(this))},
-gl0:function(a){return this.aY==null},
-gor:function(a){return this.aY!=null},
+gl0:function(a){return this.og==null},
+gor:function(a){return this.og!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
+y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Wf,this.wq,null),[z])
+y.Dd(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-this.J0=0;++this.qT},
-x4:function(a,b){return this.Xy(b)===!0&&J.xC(this.vh(b),0)},
+b.$2(z.gnl(x),z.gP(x))}},
+gB:function(a){return this.hm},
+V1:function(a){this.og=null
+this.hm=0;++this.Wf},
+NZ:function(a,b){return this.Bc(b)===!0&&J.xC(this.oB(b),0)},
 gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
-gUQ:function(a){var z=new P.ro(this)
+gUQ:function(a){var z=new P.JO(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
 $asT8:null,
@@ -8033,7 +8114,7 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -8041,419 +8122,523 @@
 "^":"Xs;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
-gl:function(){var z=this.ya
+gl:function(){var z=this.Ju
 if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
+return this.Gf(z)},
+Zq:function(a){var z
+for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
+z=this.OC
+if(this.Wf!==z.Wf)throw H.b(P.a4(z))
+y=this.x5
+if(y.length===0){this.Ju=null
+return!1}if(z.wq!==this.wq&&this.Ju!=null){x=this.Ju
 C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+if(x==null)this.Zq(z.og)
+else{z.oB(x.nl)
+this.Zq(z.og.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
-this.ya=z
-this.Az(z.T8)
+this.Ju=z
+this.Zq(z.T8)
 return!0},
-Qf:function(a,b){this.Az(a.aY)}},
+Dd:function(a,b){this.Zq(a.og)}},
 nF:{
-"^":"mW;lT",
-gB:function(a){return this.lT.J0},
-gl0:function(a){return this.lT.J0===0},
+"^":"mW;OC",
+gB:function(a){return this.OC.hm},
+gl0:function(a){return this.OC.hm===0},
 gA:function(a){var z,y
-z=this.lT
-y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
+z=this.OC
+y=new P.DN(z,H.VM([],[P.oz]),z.Wf,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.u3(this,0))
+y.Dd(z,H.u3(this,0))
 return y},
 $isyN:true},
-ro:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.J0},
-gl0:function(a){return this.Fb.J0===0},
+JO:{
+"^":"mW;ZD",
+gB:function(a){return this.ZD.hm},
+gl0:function(a){return this.ZD.hm===0},
 gA:function(a){var z,y
-z=this.Fb
-y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
+z=this.ZD
+y=new P.ZM(z,H.VM([],[P.oz]),z.Wf,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.u3(this,1))
+y.Dd(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+"^":"S6B;OC,x5,Wf,wq,Ju",
+Gf:function(a){return a},
+$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
+VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
+KH:function(a){var z
+if(a==null)return
+if(typeof a!="object")return a
+if(Object.getPrototypeOf(a)!==Array.prototype)return new P.r4(a,Object.create(null),null)
+for(z=0;z<a.length;++z)a[z]=P.KH(a[z])
+return a},
 jc: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","Jn",2,0,49,50],
-JC:{
-"^":"Xs:80;",
-$2:function(a,b){return b},
-$isEH:true},
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+else return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
-"^":"Xs:13;a",
-$1:function(a){var z,y,x,w,v,u,t
+"^":"Xs:12;a",
+$1:function(a){var z,y,x,w,v,u
 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]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-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},
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+return a}z=Object.create(null)
+x=new P.r4(a,z,null)
+w=x.KN()
+for(v=this.a,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.PF=z
+return x},
 $isEH:true},
-Ukr:{
+r4:{
+"^":"a;PF,LK,Mq",
+t:function(a,b){var z,y
+z=this.LK
+if(z==null)return this.Mq.t(0,b)
+else if(typeof b!=="string")return
+else{y=z[b]
+return typeof y=="undefined"?this.fb(b):y}},
+gB:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z},
+gl0:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z===0},
+gor:function(a){var z
+if(this.LK==null){z=this.Mq
+z=z.gB(z)}else z=this.KN().length
+return z>0},
+gvc:function(a){var z
+if(this.LK==null){z=this.Mq
+return z.gvc(z)}z=this.KN()
+return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+gUQ:function(a){var z
+if(this.LK==null){z=this.Mq
+return z.gUQ(z)}return H.fR(this.KN(),new P.A5(this),null,null)},
+u:function(a,b,c){var z,y
+if(this.LK==null)this.Mq.u(0,b,c)
+else if(this.NZ(0,b)){z=this.LK
+z[b]=c
+y=this.PF
+if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
+FV:function(a,b){H.bQ(b,new P.E5(this))},
+NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
+if(typeof b!=="string")return!1
+return Object.prototype.hasOwnProperty.call(this.PF,b)},
+to:function(a,b,c){var z
+if(this.NZ(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
+Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
+return this.tZ().Rz(0,b)},
+V1:function(a){var z
+if(this.LK==null)this.Mq.V1(0)
+else{z=this.Mq
+if(z!=null)J.Z8(z)
+this.LK=null
+this.PF=null
+this.Mq=P.Fl(null,null)}},
+aN:function(a,b){var z,y,x,w
+if(this.LK==null)return this.Mq.aN(0,b)
+z=this.KN()
+for(y=0;y<z.length;++y){x=z[y]
+w=this.LK[x]
+if(typeof w=="undefined"){w=P.KH(this.PF[x])
+this.LK[x]=w}b.$2(x,w)
+if(z!==this.Mq)throw H.b(P.a4(this))}},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+KN:function(){var z=this.Mq
+if(z==null){z=Object.keys(this.PF)
+this.Mq=z}return z},
+tZ:function(){var z,y,x,w,v
+if(this.LK==null)return this.Mq
+z=P.Fl(null,null)
+y=this.KN()
+for(x=0;w=y.length,x<w;++x){v=y[x]
+z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
+else C.Nm.sB(y,0)
+this.LK=null
+this.PF=null
+this.Mq=z
+return z},
+fb:function(a){var z
+if(!Object.prototype.hasOwnProperty.call(this.PF,a))return
+z=P.KH(this.PF[a])
+return this.LK[a]=z},
+$isFo:true,
+$asFo:function(){return[null,null]},
+$isT8:true,
+$asT8:function(){return[null,null]}},
+A5:{
+"^":"Xs:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,134,"call"],
+$isEH:true},
+E5:{
+"^":"Xs:81;a",
+$2:function(a,b){this.a.u(0,a,b)},
+$isEH:true},
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-l6:{
-"^":"XS;Pc,FN",
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+AJ:{
+"^":"XS;Ct,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"$0","gAY",0,0,71],
-static:{Gy:function(a,b){return new P.l6(a,b)}}},
+else return"Converting object did not return an encodable object."},"$0","gCR",0,0,73],
+static:{Gy:function(a,b){return new P.AJ(a,b)}}},
 K8:{
-"^":"l6;Pc,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
+"^":"AJ;Ct,FN",
+bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;qa<,q4",
-pW:function(a,b){return P.jc(a,this.gP1().qa)},
-kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
+"^":"Uk;qa<,Ha",
+cW:function(a,b){return P.jc(a,this.gP1().qa)},
+iQ:function(a){return this.cW(a,null)},
+N7:function(a,b){var z=this.gZE()
+return P.Vg(a,z.Wl,z.UM)},
+KP:function(a){return this.N7(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
-"^":"wIe;UM,SI",
+"^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
 c5:{
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;q4,cP,ol",
-iY:function(a){return this.q4.$1(a)},
+"^":"a;Ha,qR,SK",
+HT:function(a){return this.Ha.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cP
+x=this.qR
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
 if(u>92)continue
 if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
+x.IN+=t}w=v+1
 t=H.mx(92)
-x.vM+=t
+x.IN+=t
 switch(u){case 8:t=H.mx(98)
-x.vM+=t
+x.IN+=t
 break
 case 9:t=H.mx(116)
-x.vM+=t
+x.IN+=t
 break
 case 10:t=H.mx(110)
-x.vM+=t
+x.IN+=t
 break
 case 12:t=H.mx(102)
-x.vM+=t
+x.IN+=t
 break
 case 13:t=H.mx(114)
-x.vM+=t
+x.IN+=t
 break
 default:t=H.mx(117)
-x.vM+=t
+x.IN+=t
 t=H.mx(48)
-x.vM+=t
+x.IN+=t
 t=H.mx(48)
-x.vM+=t
+x.IN+=t
 t=u>>>4&15
 t=H.mx(t<10?48+t:87+t)
-x.vM+=t
+x.IN+=t
 t=u&15
 t=H.mx(t<10?48+t:87+t)
-x.vM+=t
+x.IN+=t
 break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
+x.IN+=t}w=v+1
 t=H.mx(92)
-x.vM+=t
+x.IN+=t
 t=H.mx(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
+x.IN+=t}}if(w===0)x.KF(a)
+else if(w<y)x.KF(z.Nj(a,w,y))},
 WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
+for(z=this.SK,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
-try{z=this.iY(a)
+try{z=this.HT(a)
 if(!this.Jc(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
+throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.Gy(a,y))}}},
-Jc:function(a){var z,y,x,w,v,u
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cP.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cP.KF("true")
-return!0}else if(a===!1){this.cP.KF("false")
-return!0}else if(a==null){this.cP.KF("null")
-return!0}else if(typeof a==="string"){z=this.cP
+Jc:function(a){var z,y,x,w
+z={}
+if(typeof a==="number"){if(!C.CD.gzr(a))return!1
+this.qR.KF(C.CD.bu(a))
+return!0}else if(a===!0){this.qR.KF("true")
+return!0}else if(a===!1){this.qR.KF("false")
+return!0}else if(a==null){this.qR.KF("null")
+return!0}else if(typeof a==="string"){z=this.qR
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.cP
-y.KF("[")
-if(z.gB(a)>0){this.rl(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.rl(z.t(a,x))}}y.KF("]")
-this.pg(a)
-return!0}else if(!!z.$isT8){this.WD(a)
-y=this.cP
-y.KF("{")
-for(w=J.mY(z.gvc(a)),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.rl(z.t(a,u))}y.KF("}")
-this.pg(a)
+return!0}else{y=J.x(a)
+if(!!y.$isWO){this.WD(a)
+z=this.qR
+z.KF("[")
+if(y.gB(a)>0){this.rl(y.t(a,0))
+for(x=1;x<y.gB(a);++x){z.IN+=","
+this.rl(y.t(a,x))}}z.KF("]")
+this.E5(a)
+return!0}else if(!!y.$isT8){this.WD(a)
+w=this.qR
+w.KF("{")
+z.a="\""
+y.aN(a,new P.tF(z,this))
+w.KF("}")
+this.E5(a)
 return!0}else return!1}},
-pg:function(a){var z=this.ol
+E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,dH,BLm,KQz,Ho,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,dH,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-return z.vM}}},
-z0:{
-"^":"Ziv;IE",
+return z.IN}}},
+tF:{
+"^":"Xs:82;a,b",
+$2:[function(a,b){var z,y,x
+z=this.b
+y=z.qR
+x=this.a
+y.KF(x.a)
+x.a=",\""
+z.Ip(a)
+y.KF("\":")
+z.rl(b)},"$2",null,4,0,null,79,20,"call"],
+$isEH:true},
+u5F:{
+"^":"Ziv;QA",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
 "^":"wIe;",
-WJ:function(a){var z,y,x
+Sw: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=Array(y)
+y.fixed$length=init
+y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.Hn(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.mJ)},
+if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.Hn(z.gB(a),1)),0)
+return C.Nm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;So,mJ,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.mJ
+"^":"a;F6,o9,Zj",
+O6:function(a,b){var z,y,x,w,v
+z=this.Zj
+y=this.o9
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.mJ=w
+this.o9=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.mJ=y
+this.o9=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.mJ=w
+this.o9=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.mJ=w+1
+this.o9=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.mJ=w
+this.o9=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.mJ=y
+this.o9=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.mJ=y+1
+this.o9=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
-rw:function(a,b,c){var z,y,x,w,v,u,t,s
+Gx:function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.Pp(a,J.Hn(c,1))&64512)===55296)c=J.Hn(c,1)
 if(typeof c!=="number")return H.s(c)
-z=this.IT
+z=this.Zj
 y=z.length
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.mJ
+if(v<=127){u=this.o9
 if(u>=y)break
-this.mJ=u+1
-z[u]=v}else if((v&64512)===55296){if(this.mJ+3>=y)break
+this.o9=u+1
+z[u]=v}else if((v&64512)===55296){if(this.o9+3>=y)break
 t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.mJ
+if(this.O6(v,x.j(a,t)))w=t}else if(v<=2047){u=this.o9
 s=u+1
 if(s>=y)break
-this.mJ=s
+this.o9=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.mJ=s+1
-z[s]=128|v&63}else{u=this.mJ
+this.o9=s+1
+z[s]=128|v&63}else{u=this.o9
 if(u+2>=y)break
 s=u+1
-this.mJ=s
+this.o9=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.mJ=u
+this.o9=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.mJ=u+1
+this.o9=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;IE",
-WJ:function(a){var z,y
+"^":"wIe;QA",
+Sw:function(a){var z,y
 z=P.p9("")
-y=new P.LD(this.IE,z,!0,0,0,0)
+y=new P.Dd(this.QA,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-return z.vM},
+return z.IN},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
-LD:{
-"^":"a;IE,ZB,AX,FU,kN,NY",
+Dd:{
+"^":"a;QA,C4,YN,FU,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IE!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
-this.ZB.KF(H.mx(65533))
+fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
+this.C4.KF(H.mx(65533))
 this.FU=0
-this.kN=0
-this.NY=0}},
-ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=this.FU
-x=this.kN
-w=this.NY
-z.a=0
+this.rw=0
+this.pt=0}},
+ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=this.FU
+y=this.rw
+x=this.pt
 this.FU=0
-this.kN=0
-this.NY=0
-v=new P.zC(z,this,a)
-$loop$0:for(u=this.ZB,t=this.IE!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
+this.rw=0
+this.pt=0
+w=new P.wh(c)
+v=new P.yn(this,a,b,c)
+$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
-this.AX=!1
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.YN=!1
 p=H.mx(65533)
-u.vM+=p
-x=0
-break $multibyte$2}else{y=(y<<6|p.i(q,63))>>>0;--x;++r}}while(x>0)
-p=w-1
+u.IN+=p
+y=0
+break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
+p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(y<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(y,16)))
-y=65533
-x=0
-w=0}if(y>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(y,16)))
-y=65533}if(!this.AX||y!==65279){p=H.mx(y)
-u.vM+=p}this.AX=!1}}for(;r<c;r=o){o=r+1
+if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+z=65533
+y=0
+x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+z=65533}if(!this.YN||z!==65279){p=H.mx(z)
+u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
+if(J.xZ(o,0)){this.YN=!1
+if(typeof o!=="number")return H.s(o)
+n=r+o
+v.$2(r,n)
+if(n===c)break
+r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){n=z.a
-if(n>0){m=o-1
-v.$2(m-n,m)}if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+C.CD.WZ(p.J(q),16)))
+if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
-u.vM+=p}else if(p.E(q,127)){this.AX=!1;++z.a}else{n=z.a
-if(n>0){m=o-1
-v.$2(m-n,m)}if(p.i(q,224)===192){y=p.i(q,31)
+u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
+y=1
 x=1
-w=1
-continue $loop$0}if(p.i(q,240)===224){y=p.i(q,15)
+continue $loop$0}if(p.i(q,240)===224){z=p.i(q,15)
+y=2
 x=2
-w=2
-continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){y=p.i(q,7)
+continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
+y=3
 x=3
-w=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
-this.AX=!1
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.YN=!1
 p=H.mx(65533)
-u.vM+=p
-y=65533
-x=0
-w=0}}break $loop$0}z=z.a
-if(z>0)v.$2(r-z,c)
-if(x>0){this.FU=y
-this.kN=x
-this.NY=w}},
+u.IN+=p
+z=65533
+y=0
+x=0}}break $loop$0}if(y>0){this.FU=z
+this.rw=y
+this.pt=x}},
 static:{"^":"ADi"}},
-zC:{
-"^":"Xs:133;a,b,c",
+wh:{
+"^":"Xs:136;a",
+$2:function(a,b){var z,y,x,w
+z=this.a
+for(y=J.U6(a),x=b;x<z;++x){w=y.t(a,x)
+if(J.mQ(w,127)!==w)return x-b}return z-b},
+$isEH:true},
+yn:{
+"^":"Xs:137;b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.ZB.KF(P.nB(x))
-else y.ZB.KF(P.nB(J.Fd(x,a,b)))
-this.a.a=0},
-$isEH:true}}],["dart.core","dart:core",,P,{
+if(z)y.C4.KF(P.HM(x))
+else y.C4.KF(P.HM(J.Fd(x,a,b)))},
+$isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,51,46,47],
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
 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="\""
+z.IN="\""
 for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
+if(v<=31)if(v===10)w=z.IN+="\\n"
+else if(v===13)w=z.IN+="\\r"
+else if(v===9)w=z.IN+="\\t"
+else{w=z.IN+="\\x"
+if(v<16)z.IN=w+"0"
+else{z.IN=w+"1"
 v-=16}w=H.mx(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
+w=z.IN+=w}else if(v===92)w=z.IN+="\\\\"
+else if(v===34)w=z.IN+="\\\""
 else{w=H.mx(v)
-w=z.vM+=w}}y=w+"\""
-z.vM=y
+w=z.IN+=w}}y=w+"\""
+z.IN=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+kC:[function(a,b){return a==null?b==null:a===b},"$2","Bx",4,0,54],
+NS:[function(a){return H.CU(a)},"$1","cEg",2,0,55],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -8463,18 +8648,18 @@
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
-if(y==null)H.qw(z)
+if(y==null)H.Af(z)
 else y.$1(z)},
-nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.u(0,a.gOB(a),b)},
 $isEH:true},
 CL:{
-"^":"Xs:134;a",
+"^":"Xs:138;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(J.ro(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b));++z.b},
 $isEH:true},
@@ -8485,12 +8670,12 @@
 fRn:{
 "^":"a;"},
 iP:{
-"^":"a;y3<,aL",
+"^":"a;rq<,aL",
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.FW(this.y3,b.gy3())},
-giO:function(a){return this.y3},
+return J.xC(this.rq,b.rq)&&this.aL===b.aL},
+iM:function(a,b){return J.FW(this.rq,b.grq())},
+giO:function(a){return this.rq},
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.aL
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
@@ -8501,15 +8686,15 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,71],
-h:function(a,b){return P.Wu(J.WB(this.y3,b.gVs()),this.aL)},
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
+h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
 EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
+RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
-if(z!=null){y=new P.MF()
-x=z.QK
+static:{"^":"Oj2,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+if(z!=null){y=new P.mw()
+x=z.pX
 if(1>=x.length)return H.e(x,1)
 w=H.BU(x[1],null,null)
 if(2>=x.length)return H.e(x,2)
@@ -8523,7 +8708,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.LL(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -8540,7 +8725,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.Hn(s,n*l)}k=!0}else k=!1
 j=H.fu(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)
+if(j==null)throw H.b(P.cD("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -8552,13 +8738,13 @@
 if(a>=10)return"0"+a
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
-MF:{
-"^":"Xs:135;",
+mw:{
+"^":"Xs:139;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Xs:136;",
+"^":"Xs:140;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8567,36 +8753,38 @@
 $isVf:true},
 "+double":0,
 a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),0,0,0)},
+"^":"a;m5<",
+g:function(a,b){return P.ii(0,0,this.m5+b.gm5(),0,0,0)},
+W:function(a,b){return P.ii(0,0,this.m5-b.gm5(),0,0,0)},
 U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
+return P.ii(0,0,C.CD.yu(C.CD.RE(this.m5*b)),0,0,0)},
 Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
 if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
+return P.ii(0,0,C.CD.Z(this.m5,b),0,0,0)},
+C:function(a,b){return this.m5<b.gm5()},
+D:function(a,b){return this.m5>b.gm5()},
+E:function(a,b){return this.m5<=b.gm5()},
+F:function(a,b){return this.m5>=b.gm5()},
+gVs:function(){return C.CD.BU(this.m5,1000)},
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
+return this.m5===b.m5},
+giO:function(a){return this.m5&0x1FFFFFFF},
+iM:function(a,b){return C.CD.iM(this.m5,b.gm5())},
 bu:[function(a){var z,y,x,w,v
 z=new P.DW()
-y=this.Fq
+y=this.m5
 if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
+x=z.$1(C.CD.JV(C.CD.BU(y,60000000),60))
+w=z.$1(C.CD.JV(C.CD.BU(y,1000000),60))
 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)},"$0","gAY",0,0,71],
+return H.d(C.CD.BU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,73],
+Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
+J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Xs:15;",
+"^":"Xs:14;",
 $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)
@@ -8605,106 +8793,145 @@
 return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"Xs:15;",
+"^":"Xs:14;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gAY",0,0,71]},
+bu:[function(a){return"Throw of null."},"$0","gCR",0,0,73]},
 OY:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gAY",0,0,71],
+return"Illegal argument(s)"},"$0","gCR",0,0,73],
 static:{u:function(a){return new P.OY(a)}}},
 Sn:{
 "^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
+bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
 static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
 JS:{
-"^":"XS;uF,UP,mP,SA,FZ",
+"^":"XS;uF,vI,mP,ae,wI",
 bu:[function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
 for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.vM+=", "}v=z.a
+v.IN+=", "}v=z.a
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,71],
+v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gCR",0,0,73],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,71],
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,73],
 $isXS:true,
 static:{nO:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,71],
+bu:[function(a){return"Bad state: "+this.G1},"$0","gCR",0,0,73],
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"XS;YA",
 bu:[function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,73],
 static:{a4:function(a){return new P.UV(a)}}},
 k5C:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
+bu:[function(a){return"Out of Memory"},"$0","gCR",0,0,73],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,71],
+bu:[function(a){return"Stack Overflow"},"$0","gCR",0,0,73],
 gI4:function(){return},
 $isXS:true},
 t7:{
 "^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,71],
+bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gCR",0,0,73],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
 bu:[function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
+return"Exception: "+H.d(z)},"$0","gCR",0,0,73]},
 oe:{
-"^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
-static:{cD:function(a){return new P.oe(a)}}},
+"^":"a;G1>,FF>,D7>",
+bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.G1
+y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
+x=this.D7
+w=this.FF
+if(typeof w!=="string")return x!=null?y+(" (at offset "+H.d(x)+")"):y
+if(x!=null)if(!(x<0)){z=J.q8(w)
+if(typeof z!=="number")return H.s(z)
+z=x>z}else z=!0
+else z=!1
+if(z)x=null
+if(x==null){z=J.U6(w)
+if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(r===10){if(u!==s||t!==!0)++v
+u=s+1
+t=!1}else if(r===13){++v
+u=s+1
+t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
+q=z.gB(w)
+s=x
+while(!0){p=z.gB(w)
+if(typeof p!=="number")return H.s(p)
+if(!(s<p))break
+r=z.j(w,s)
+if(r===10||r===13){q=s
+break}++s}p=J.Wx(q)
+if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+n=u
+m=""
+l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+o=q
+l=""}else{n=x-36
+o=x+36
+l="..."}m="..."}else{o=q
+n=u
+m=""
+l=""}k=z.Nj(w,n,o)
+if(typeof n!=="number")return H.s(n)
+return y+m+k+l+"\n"+C.xB.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
+bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
 static:{ts:function(){return new P.eV()}}},
 qo:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
-u:function(a,b,c){var z=H.of(b,"expando$values")
+bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
+t:function(a,b){var z=H.vA(b,"expando$values")
+return z==null?null:H.vA(z,this.V2())},
+u:function(a,b,c){var z=H.vA(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
+H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
+V2:function(){var z,y
+z=H.vA(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
 H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
+static:{"^":"bZT,rly,Km"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -8716,7 +8943,7 @@
 "^":"a;",
 $isQV:true,
 $asQV:null},
-Dk:{
+Anv:{
 "^":"a;"},
 WO:{
 "^":"a;",
@@ -8732,7 +8959,7 @@
 $asT8:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gAY",0,0,71]},
+bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
 FK:{
 "^":"a;",
@@ -8742,87 +8969,77 @@
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"$0","gAY",0,0,71],
+bu:[function(a){return H.a5(this)},"$0","gCR",0,0,73],
 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.wO(this),null)},
 $isa:true},
 ns:{
 "^":"a;",
 $isns:true},
-Jb:{
+Ol:{
 "^":"mW;",
-$isJb:true,
+$isOl:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.mD()
-else{z=H.mD()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}},
+"^":"a;n2,Mw",
+wE:function(a){var z,y
+z=this.n2==null
+if(!z&&this.Mw==null)return
+y=$.hG
+if(z)this.n2=y.$0()
+else{this.n2=J.Hn(y.$0(),J.Hn(this.Mw,this.n2))
+this.Mw=null}},
 CH:function(a){var z
-if(this.yz==null)return
-z=H.mD()
-this.yz=z
-if(this.wj!=null)this.wj=z},
+if(this.n2==null)return
+z=$.hG.$0()
+this.n2=z
+if(this.Mw!=null)this.Mw=z},
 giU:function(){var z,y
-z=this.yz
+z=this.n2
 if(z==null)return 0
-y=this.wj
-if(y==null){z=H.mD()
-y=this.yz
-if(typeof y!=="number")return H.s(y)
-y=z-y
-z=y}else{if(typeof y!=="number")return y.W()
-if(typeof z!=="number")return H.s(z)
-z=y-z}return z}},
+y=this.Mw
+return y==null?J.Hn($.hG.$0(),this.n2):J.Hn(y,z)},
+static:{"^":"Ji"}},
 qU:{
 "^":"a;",
 $isqU:true},
 "+String":0,
-WU:{
-"^":"a;Cb,R0,C3,Wn",
-gl:function(){return this.Wn},
+Xa:{
+"^":"a;Cb,R0,So,ft",
+gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.So
 this.R0=z
 y=this.Cb
 x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
+if(z===x.gB(y)){this.ft=null
 return!1}w=x.j(y,this.R0)
 v=this.R0+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
-if((u&64512)===56320){this.C3=v+1
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
+if((u&64512)===56320){this.So=v+1
+this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
+return!0}}this.So=v
+this.ft=w
 return!0}},
 Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
+"^":"a;IN<",
+gB:function(a){return this.IN.length},
+gl0:function(a){return this.IN.length===0},
+gor:function(a){return this.IN.length!==0},
+KF:function(a){this.IN+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
 z=J.mY(a)
 if(!z.G())return
-if(b.length===0)do{y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
+if(b.length===0){do{y=z.gl()
+this.IN+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
+for(;z.G();){this.IN+=b
 y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:[function(a){return this.vM},"$0","gAY",0,0,71],
-PD:function(a){if(typeof a==="string")this.vM=a
+this.IN+=typeof y==="string"?y:H.d(y)}}},
+V1:function(a){this.IN=""},
+bu:[function(a){return this.IN},"$0","gCR",0,0,73],
+PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
@@ -8834,30 +9051,23 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,mn,pO,Fi,ku,tP,BJ,ldN,yWg",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.mn,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.mn},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.bm()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-yM:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.mB(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
+"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z=this.Kk
+if(z==null)return""
+if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+return z},
+gtp:function(a){var z=this.QB
+if(z==null)return P.bG(this.Fi)
+return z},
+gIi:function(a){return this.Ee},
+pi:function(a,b){if(a==="")return"/"+b
+return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
+jI:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
+return C.xB.OY(a,"/.")!==-1},
+jn:function(a){var z,y,x,w,v
+if(!this.jI(a))return a
 z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.lo
+for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.G();){w=y.Ff
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -8867,242 +9077,364 @@
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y
+bu:[function(a){var z,y,x,w
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
+z.KF(":")}x=this.Kk
+w=x==null
+if(!w||C.xB.nC(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.mn,0)){z.KF(":")
-z.KF(J.AG(this.mn))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"$0","gAY",0,0,71],
-n:function(a,b){var z,y,x
+if(C.xB.gor(y)){z.KF(y)
+z.KF("@")}if(!w)z.KF(x)
+y=this.QB
+if(y!=null){z.KF(":")
+z.KF(y)}}z.KF(this.Ee)
+y=this.xu
+if(y!=null){z.KF("?")
+z.KF(y)}y=this.ys
+if(y!=null){z.KF("#")
+z.KF(y)}return z.IN},"$0","gCR",0,0,73],
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)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.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
+z=z.gtp(b)
+if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+y=z==null
+x=b.xu
+w=x==null
+if(!y===!w){if(y)z=""
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+y=z==null
+x=b.ys
+w=x==null
+if(!y===!w){if(y)z=""
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
-giO:function(a){var z=new P.Wf()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.mn=0
-else if(h==="https"&&J.xC(e,443))this.mn=0
-else this.mn=e
-this.pO=this.x6(c,d)},
+giO:function(a){var z,y,x,w,v
+z=new P.XZ()
+y=this.gJf(this)
+x=this.gtp(this)
+w=this.xu
+if(w==null)w=""
+v=this.ys
+return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,pkL,lM,FsP,qfW,dRC,u0I,TGN,OP,c4,Fm,Bx,Hiw,H5t,zst,VFG,nJd,SpW,GPf,JA7,yw1,SQU,fbQ",hK:function(a0){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
-x=new P.OF()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.mKy,q)
-q=(C.mKy[q]&C.jn.KI(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.KU(h)
-z=new P.q5(P.L7(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-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.RD(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.RD(a)
-return"["+a+"]"}}return a},KU:function(a){var z,y,x,w,v,u
-z=new P.Mr()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.mKy,u)
-u=(C.mKy[u]&C.jn.KI(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
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,c4,Fm,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+if(a==="https")return 443
+return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z={}
+z.a=""
+z.b=""
+z.c=null
+z.d=null
+z.e=0
+z.f=-1
+w=a.length
+v=0
+while(!0){if(!(v<w)){y=0
+x=0
+break}if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35){y=0
+x=0
+break}if(u===47){x=v===0?2:1
+y=0
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+z.a=P.iy(a,v);++v
+if(v===w){z.f=-1
+x=0}else{if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35)x=0
+else x=u===47?2:1}y=v
+break}++v
+z.f=-1}z.e=v
+if(x===2){t=v+1
+z.e=t
+if(t===w){z.f=-1
+x=0}else{u=C.xB.j(a,t)
+z.f=u
+if(u===47){++z.e
+new P.BH(z,a,-1).$0()
+y=z.e}s=z.f
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+u=a.charCodeAt(s)
+z.f=u
+if(u===63||u===35)break
+z.f=-1}s=z.a
+r=z.c
+q=P.qd(a,y,z.e,null,r!=null,s==="file")
+s=z.f
+if(s===63){p=C.xB.XU(a,"#",z.e+1)
+s=z.e+1
+if(p<0){o=P.AN(a,s,w,null)
+n=null}else{o=P.AN(a,s,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+o=null}w=z.a
+s=z.b
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return a},L7:function(a,b,c,d){var z,y
+if(a==null)return
+if(b===c)return""
+if(C.xB.j(a,b)===91){z=c-1
+if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+P.eg(a,b+1,z)
+return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+if(a.charCodeAt(y)===58){P.eg(a,b,c)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.IN=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+if(v){t=C.xB.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.IN+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.IN=""}if(y<z){v=C.xB.Nj(a,y,z)
+x.toString
+x.IN=x.IN+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
+if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.IN=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+v=P.mC(u)
+x.IN+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
+if(b===0)return""
+a.toString
+z=a.length
+if(0>=z)H.vh(P.N(0))
+y=a.charCodeAt(0)
+x=y>=97
+if(!(x&&y<=122))w=y>=65&&y<=90
+else w=!0
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
+t=a.charCodeAt(u)
+if(t<128){s=t>>>4
+if(s>=8)return H.e(C.qq,s)
+s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
+if(w&&v)x=!1}a=J.Nj(a,0,b)
+return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
+return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
+z=a==null
+if(z&&!0)return f?"/":""
+z=!z
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(C.xB.gl0(y)){if(f)return"/"}else if((f||e)&&C.xB.j(y,0)!==47)return"/"+y
+return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
-if(y&&!0)return""
+if(y&&!0)return
 y=!y
-if(y);if(y)return P.Xc(a)
+if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(b,new P.Ue(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).Mw(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.QB()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.mx(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.mx(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.mx(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-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)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+C.jN.aN(d,new P.Ue(z,x))
+return x.IN},o6:function(a,b,c){if(a==null)return
+return P.Xc(a,b,c,C.o5)},wW:function(a){if(57>=a)return 48<=a
+a|=32
+return 97<=a&&102>=a},Qw:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+z=b+2
+y=a.length
+if(z>=y)return"%"
+x=b+1
+a.toString
+if(x<0)H.vh(P.N(x))
+if(x>=y)H.vh(P.N(x))
+w=a.charCodeAt(x)
+if(z<0)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(!P.wW(w)||!P.wW(v))return"%"
+u=P.Qw(w)*16+P.Qw(v)
+if(u<127){z=C.jn.wG(u,4)
+if(z>=8)return H.e(C.B2,z)
+z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
+if(a<128){z=Array(3)
+z.fixed$length=init
+z[0]=37
+y=a>>>4
+if(y>=16)H.vh(P.N(y))
+z[1]="0123456789ABCDEF".charCodeAt(y)
+z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
+w=4}else{x=224
+w=3}else{x=192
+w=2}y=3*w
+z=Array(y)
+z.fixed$length=init
+for(v=0;--w,w>=0;x=128){u=C.jn.PK(a,6*w)&63|x
+if(v>=y)return H.e(z,v)
+z[v]=37
+t=v+1
+s=u>>>4
+if(s>=16)H.vh(P.N(s))
+s="0123456789ABCDEF".charCodeAt(s)
+if(t>=y)return H.e(z,t)
+z[t]=s
+s=v+2
+t="0123456789ABCDEF".charCodeAt(u&15)
+if(s>=y)return H.e(z,s)
+z[s]=t
+v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(v<127){u=v>>>4
+if(u>=8)return H.e(d,u)
+u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
+continue}if("%"===t){t="%25"
+s=1}else s=3}else{if(v<=93){u=v>>>4
+if(u>=8)return H.e(C.rz,u)
+u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
+if(u){P.iV(a,z,"Invalid character")
+t=null
+s=null}else{if((v&64512)===55296){u=z+1
+if(u<c){if(u<0)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
+r=a.charCodeAt(u)
+if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
+s=2}else s=1}else s=1}else s=1
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.IN=""}w=C.xB.Nj(a,y,z)
+x.toString
+x.IN=x.IN+w
+x.IN+=typeof t==="string"?t:H.d(t)
+if(typeof s!=="number")return H.s(s)
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 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.to(z)),[null,null]).br(0)},RD:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
+return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+if(c==null)c=J.q8(a)
+z=new P.x8(a)
+y=new P.JTs(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
+w=b
+u=b
+t=!1
+while(!0){s=c
 if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
+if(!(u<s))break
 s=a
+s.toString
+if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
+if(u>=r)H.vh(P.N(u))
+if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
+s.toString
+if(u<0)H.vh(P.N(u))
+if(u>=J.q8(s))H.vh(P.N(u))
+if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
+w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
 J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
+t=!0}else J.bi(x,y.$2(w,u))
+w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
+q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(J.UQ(v,0),8)
+if(q&&!p)z.$2("expected a part after last `:`",c)
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+try{v=P.Dy(J.Nj(a,w,c))
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.lf(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.bi(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.oA(x,new P.EY(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
+z.$2("invalid end of IPv6 address.",w)}}if(t){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")
+n=Array(16)
+n.$builtinTypeInfo=[P.KN]
+u=0
+m=0
+while(!0){s=J.q8(x)
+if(typeof s!=="number")return H.s(s)
+if(!(u<s))break
+l=J.UQ(x,u)
+s=J.x(l)
+if(s.n(l,-1)){k=9-J.q8(x)
+for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
+n[m]=0
+s=m+1
+if(s>=16)return H.e(n,s)
+n[s]=0
+m+=2}}else{r=s.m(l,8)
+if(m<0||m>=16)return H.e(n,m)
+n[m]=r
+r=m+1
+s=s.i(l,255)
+if(r>=16)return H.e(n,r)
+n[r]=s
+m+=2}++u}return n},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)
+x=c.gZE().Sw(b)
 for(w=0;w<x.length;++w){v=x[w]
 u=J.Wx(v)
 if(u.C(v,128)){t=u.m(v,4)
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.KI(1,u.i(v,15)))!==0}else t=!1
+t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
 if(t){u=H.mx(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.mx(43)
-y.vM+=u}else{u=H.mx(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM},oh:function(a,b){var z,y,x,w
+y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
+y.IN+=u}else{u=H.mx(37)
+y.IN+=u
+z.$2(v,y)}}return y.IN},oh:function(a,b){var z,y,x,w
 for(z=J.rY(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9116,7 +9448,7 @@
 if(!(x<w&&y))break
 v=z.j(a,x)
 y=v!==37&&v!==43;++x}if(y)if(b===C.xM||!1)return a
-else u=z.gYC(a)
+else u=z.gNq(a)
 else{u=[]
 x=0
 while(!0){w=z.gB(a)
@@ -9129,36 +9461,53 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.oh(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.IE
-return new P.GY(t).WJ(u)}}},
-OF:{
-"^":"Xs:137;",
-$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.KI(1,a&15))!==0}else z=!1
-return z},
+else u.push(v);++x}}t=b.QA
+return new P.GY(t).Sw(u)}}},
+hP2:{
+"^":"Xs:141;",
+$1:function(a){a.C(0,128)
+return!1},
 $isEH:true},
-Uo:{
-"^":"Xs:138;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+BH:{
+"^":"Xs:17;a,b,c",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=this.a
+y=z.e
+x=this.b
+w=x.length
+if(y===w){z.f=this.c
+return}z.f=J.Pp(x,y)
+for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+r=x.charCodeAt(s)
+z.f=r
+if(r===47||r===63||r===35)break
+if(r===64){t=z.e
+u=-1}else if(r===58)u=z.e
+else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+if(q===-1){z.e=w
+z.f=v
+u=-1
+break}else z.e=q
+u=-1}++z.e
+z.f=v}p=z.e
+if(t>=0){z.b=P.ua(x,y,t)
+y=t+1}if(u>=0){o=u+1
+if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
+m=x.charCodeAt(o)
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
+n=n*10+(m-48)}else n=null
+z.d=P.JF(n,z.a)
+p=u}z.c=P.L7(x,y,p,!0)
+s=z.e
+if(s<w)z.f=C.xB.j(x,s)},
 $isEH:true},
-Mr:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.JH,z)
-z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-bm:{
-"^":"Xs:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
+UU:{
+"^":"Xs:12;",
+$1:function(a){return P.jW(C.jr,a,C.xM,!1)},
 $isEH:true},
 Ue:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -9168,130 +9517,75 @@
 z.KF("=")
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
-Al:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Xs:137;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-QB:{
-"^":"Xs:137;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Xs:138;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(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},
-$isEH:true},
-QE:{
-"^":"Xs:138;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},
-$isEH:true},
-YP:{
-"^":"Xs:18;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))},
-$isEH:true},
-Wf:{
-"^":"Xs:139;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+XZ:{
+"^":"Xs:142;",
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
-y=z.Mw(b,"=")
+y=z.OY(b,"=")
 if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
 J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
-"^":"Xs:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
+"^":"Xs:44;",
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
 to:{
-"^":"Xs:13;a",
+"^":"Xs:12;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,140,"call"],
+return z},"$1",null,2,0,null,143,"call"],
 $isEH:true},
 x8:{
-"^":"Xs:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
+"^":"Xs:144;a",
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
+$1:function(a){return this.$2(a,null)},
 $isEH:true},
-JT:{
-"^":"Xs:99;a,b",
+JTs:{
+"^":"Xs:100;b,c",
 $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)
+if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(J.Nj(this.b,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`")
+if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
 $isEH:true},
-EY:{
-"^":"Xs:13;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)]},
-$isEH:true},
 rI:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
+$isEH:true}}],["","",,W,{
 "^":"",
 Q8:function(a,b,c,d){var z,y,x
 z=document.createEvent("CustomEvent")
-J.QD(z,d)
+J.YSV(z,d)
 if(!J.x(d).$isWO)if(!J.x(d).$isT8){y=d
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
 if(y)try{d=P.pf(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
+J.G9(z,a,b,c,d)}catch(x){H.Ru(x)
+J.G9(z,a,b,c,null)}else J.G9(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-Og:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+qw: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
 z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
-C.Ar.eo(x,"GET",a,!0)
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.u3(z,0)]).Zz()
-z=H.VM(new W.RO(x,C.JN.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.u3(z,0)]).Zz()
+C.W3.eo(x,"GET",a,!0)
+z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
+z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
 Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
@@ -9311,31 +9605,31 @@
 return W.P1(a)},
 qc:function(a){var z
 if(a==null)return
-if("setInterval" in a){z=W.P1(a)
+if("postMessage" in a){z=W.P1(a)
 if(!!J.x(z).$isPZ)return z
 return}else return a},
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Gi:function(a,b){return new W.zZ(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,13,54],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,13,54],
-Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,55,54,56,57,58],
+v8:function(a,b){return new W.zZ(a,b)},
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
+Hx:[function(a){return J.pa(a)},"$1","Z6",2,0,12,56],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct: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
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
@@ -9347,10 +9641,10 @@
 if(a==null)return
 return $.X3.rO(a,!0)},
 Iq:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.cl(a,!0)},
-Bo:{
+return $.X3.PT(a,!0)},
+M8:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|pv|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V2|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|V46|vr|oEY|kn|V47|fI|V48|zM|V49|Rk|V50|Ti|V51|Um|V52|VZ|V53|WG|ImK|CY|V54|nm|V55|uw|V56|Pa|V57|D2|I5|V58|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|SaM|JI|WZq|ZP|pva|nJ|KAf|Eg|i7|cda|Gk|waa|J3|V10|MJ|T53|DK|V11|BS|V12|Vb|V13|Ly|ZzR|Im|pR|V14|hx|V15|L4|Mb|V16|mO|DE|V17|U1|V18|H8|WS|qh|V19|oF|V20|Q6|uE|V21|Zn|V22|n5|V23|Ma|wN|V24|ds|V25|qM|oEY|av|V26|uz|V27|kK|oa|V28|St|V29|IW|V30|Qh|V31|Oz|V32|Z4|V33|qk|V34|vj|LU|V35|CX|V36|md|V37|Bm|V38|Ya|V39|Ww|ye|V40|G1|V41|fl|V42|UK|V43|wM|V44|NK|V45|Zx|V46|F1|V47|ov|V48|vr|qeq|kn|V49|fI|V50|zM|V51|Rk|V52|Ti|V53|Um|V54|VZ|V55|WG|V56|f7|ImK|CY|V57|nm|V58|uw|V59|Pa|V60|D2|I5|V61|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9360,29 +9654,29 @@
 $asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+"^":"M8;N:target%,t5:type=,mH:href%,aB:protocol=",
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
 fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+"^":"M8;N:target%,mH:href%,aB:protocol=",
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"M8;mH:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
 "^":"Gv;t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
-"^":"Bo;",
+"^":"M8;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
 Ox:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"M8;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
 Ny9:{
-"^":"Bo;fg:height%,R:width}",
+"^":"M8;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
 Oi:{
@@ -9397,7 +9691,7 @@
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
 nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
+"^":"KV;Rn:data=,B:length=,ke:nextElementSibling=",
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
@@ -9406,20 +9700,20 @@
 di:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-Rb:{
-"^":"ea;M3:_dartDetail}",
+DG4:{
+"^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isRb:true,
+GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
+$isDG4:true,
 "%":"CustomEvent"},
 Q3:{
-"^":"Bo;",
+"^":"M8;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDetailsElement"},
 rV:{
-"^":"Bo;",
+"^":"M8;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
 YN:{
@@ -9427,7 +9721,7 @@
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
+XT:function(a,b){return a.querySelector(b)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isYN:true,
 "%":"XMLDocument;Document"},
@@ -9436,9 +9730,9 @@
 gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
+XT:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rz:{
+cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 BK:{
@@ -9447,22 +9741,22 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isBK:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
+"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
 gks:function(a){return new W.VG(a,a.children)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
-gD7:function(a){return P.T7(C.CD.yu(C.CD.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
+gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-dQ:function(a){},
+Lx:function(a){},
 wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
-bu:[function(a){return a.localName},"$0","gAY",0,0,71],
+bu:[function(a){return a.localName},"$0","gCR",0,0,73],
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
@@ -9473,53 +9767,59 @@
 do{if(J.Uv(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-Gj:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
+PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
+XT:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+LX:function(a){},
 $ish4:true,
 $isPZ:true,
 "%":";Element"},
 fC:{
-"^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
+"^":"M8;fg:height%,oc:name%,t5:type=,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;It:_selector},Ii:path=,ee:timeStamp=,t5:type=",
-gSd:function(a){return W.qc(a.currentTarget)},
+"^":"Gv;dl:_selector},Ii:path=,ee:timeStamp=,t5:type=",
+gCa:function(a){return W.qc(a.currentTarget)},
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
 PZ:{
 "^":"Gv;",
-gI:function(a){return new W.kd(a)},
-Yb:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-H2:function(a,b){return a.dispatchEvent(b)},
+gI:function(a){return new W.xd(a)},
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+Ph:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
 Ao:{
-"^":"Bo;oc:name%,t5:type=",
+"^":"M8;oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rz;tT:code=",
+"^":"cmJ;tT:code=",
 "%":"FileError"},
+H05:{
+"^":"PZ;kc:error=",
+gyG:function(a){var z=a.result
+if(!!J.x(z).$isaI)return H.GG(z,0,null)
+return z},
+"%":"FileReader"},
 jH:{
-"^":"Bo;B:length=,oc:name%,N:target%",
+"^":"M8;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
-iGN:{
-"^":"Bo;ih:color%",
+u9:{
+"^":"M8;ih:color%",
 "%":"HTMLHRElement"},
 pl:{
 "^":"Gv;B:length=",
@@ -9561,48 +9861,48 @@
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
-"^":"Bo;fg:height%,oc:name%,R:width}",
+"^":"M8;fg:height%,oc:name%,R:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
 "^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pAv:{
-"^":"Bo;fg:height%,EE:isMap=,R:width}",
+"^":"M8;fg:height%,EE:isMap=,R:width}",
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,oc:name%,t5:type=,P:value%,R:width}",
+"^":"M8;d4:checked%,fg:height%,jx:list=,oc:name%,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
 $isMi:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
+AD:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;oc:name%,t5:type=",
+In:{
+"^":"M8;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 pL:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+"^":"M8;mH:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
 "^":"Gv;mH:href=,aB:protocol=",
-RE:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+VD:function(a){return a.reload()},
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
 jJ:{
-"^":"Bo;oc:name%",
+"^":"M8;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
-"^":"Bo;kc:error=",
+"^":"M8;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
@@ -9611,28 +9911,29 @@
 Wyx:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-wq:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
-D80:{
+CM:{
 "^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
 "%":"MediaStreamEvent"},
-Hy:{
+cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$isHy:true,
+gFF:function(a){return W.qc(a.source)},
+$iscxu:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"Bo;q1:content=,oc:name%",
+"^":"M8;rz:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLMeterElement"},
 PGY:{
 "^":"ea;",
@@ -9641,31 +9942,31 @@
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-yt:{
+bnE:{
 "^":"Imr;",
-FY:function(a,b,c){return a.send(b,c)},
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
 "^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.Ph,!1),[null])},
+giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
 "%":"MIDIInput;MIDIPort"},
 AjY:{
-"^":"w6O;YK:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
 else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
 z=W.qc(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.jC(J.tG(z)))
-return H.VM(new P.hL(J.Hh(y.x),J.Hh(y.y)),[null])}},
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
+return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
 $isAjY:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
-y=new W.QR(z)
+y=new W.DB(z)
 y.$2("childList",h)
 y.$2("attributes",e)
 y.$2("characterData",f)
@@ -9684,29 +9985,29 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"PZ;lb:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
 gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
+J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$iswi){z=b.NL
+if(!!z.$iswi){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
-pj:function(a){var z
+D4:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
 bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,71],
+return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
-Gs:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-dR:function(a,b,c){return a.replaceChild(b,c)},
+tg:function(a,b){return a.contains(b)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
+AS:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
+yk:{
 "^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -9727,48 +10028,48 @@
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 VSm:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLOListElement"},
 G77:{
-"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
+"^":"M8;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
-"^":"Bo;ph:label%",
+"^":"M8;ph:label%",
 "%":"HTMLOptGroupElement"},
 Qlt:{
-"^":"Bo;vH:index=,ph:label%,P:value%",
+"^":"M8;vH:index=,ph:label%,P:value%",
 "%":"HTMLOptionElement"},
 Xp:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"M8;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
-"^":"Bo;oc:name%,P:value%",
+"^":"M8;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-f5:{
+PF:{
 "^":"ea;",
-$isf5:true,
+$isPF:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-qW:{
+Qls:{
 "^":"nx;N:target=",
 "%":"ProcessingInstruction"},
 KRv:{
-"^":"Bo;P:value%",
+"^":"M8;P:value%",
 "%":"HTMLProgressElement"},
-ew:{
+ew7:{
 "^":"ea;ox:loaded=",
-$isew:true,
+$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bT:{
-"^":"ew;O3:url=",
+"^":"ew7;O3:url=",
 "%":"ResourceProgressEvent"},
 j24:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLScriptElement"},
 lpR:{
-"^":"Bo;B:length%,oc:name%,t5:type=,P:value%",
+"^":"M8;B:length%,oc:name%,t5:type=,P:value%",
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -9776,7 +10077,7 @@
 $isI0:true,
 "%":"ShadowRoot"},
 yNV:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLSourceElement"},
 zD9:{
 "^":"ea;kc:error=,G1:message=",
@@ -9787,13 +10088,13 @@
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-AsS:{
+Cd:{
 "^":"Gv;",
 FV:function(a,b){H.bQ(b,new W.AA(a))},
-x4:function(a,b){return a.getItem(b)!=null},
+NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
 Rz:function(a,b){var z=a.getItem(b)
@@ -9816,48 +10117,48 @@
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]},
 "%":"Storage"},
-KL:{
-"^":"ea;G3:key=,O3:url=",
+iiu:{
+"^":"ea;nl:key=,O3:url=",
 "%":"StorageEvent"},
 fqq:{
-"^":"Bo;t5:type=",
+"^":"M8;t5:type=",
 "%":"HTMLStyleElement"},
 v6:{
-"^":"Bo;",
+"^":"M8;",
 $isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
 inA:{
-"^":"Bo;",
+"^":"M8;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
 tV:{
-"^":"Bo;RH:rowIndex=",
+"^":"M8;RH:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $istV:true,
 "%":"HTMLTableRowElement"},
-IV:{
-"^":"Bo;",
+BTK:{
+"^":"M8;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
 fX:{
-"^":"Bo;q1:content=",
+"^":"M8;rz:content=",
 $isfX:true,
-"%":";HTMLTemplateElement;RS|k5d|q6"},
+"%":";HTMLTemplateElement;GLL|k5d|q6"},
 Un:{
 "^":"nx;",
 $isUn:true,
 "%":"CDATASection|Text"},
 FBi:{
-"^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
+"^":"M8;oc:name%,vp:rows=,t5:type=,P:value%",
 "%":"HTMLTextAreaElement"},
-xVu:{
+R0:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
-"^":"Bo;fY:kind=,ph:label%",
+"^":"M8;fY:kind=,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
@@ -9867,33 +10168,33 @@
 "%":"HTMLVideoElement"},
 EKW:{
 "^":"PZ;aB:protocol=,O3:url=",
-LG:function(a,b,c){return a.close(b,c)},
+XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
 "^":"PZ;bq:history=,oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-pl:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
+ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
 b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
 b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
+hn:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
+X6:function(a,b,c){return this.hn(a,b,c,null)},
+bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
-Bn:{
+U3:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-o5:{
+FR:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,71],
+bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
@@ -9917,12 +10218,12 @@
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
 NfA:{
-"^":"Bo;",
+"^":"M8;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
@@ -9966,51 +10267,51 @@
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
-"^":"ark;MW,wM",
-Gs:function(a,b){return J.wo(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
+"^":"ark;dA,jS",
+tg:function(a,b){return J.kE(this.jS,b)},
+gl0:function(a){return this.dA.firstElementChild==null},
+gB:function(a){return this.jS.length},
+t:function(a,b){var z=this.jS
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.wM
+u:function(a,b,c){var z=this.jS
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
+this.dA.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
+h:function(a,b){this.dA.appendChild(b)
 return b},
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
-Nk:function(a,b){this.zU(b,!1)},
-zU:function(a,b){var z,y,x
-z=this.MW
+uk:function(a,b){this.aO(b,!1)},
+aO:function(a,b){var z,y,x
+z=this.dA
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
-if(!!J.x(b).$ish4){z=this.MW
+if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
 xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
+if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.jS
 y=z.length
-x=this.MW
+x=this.dA
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
-Yj:function(a,b,c){throw H.b(P.nO(null))},
-V1:function(a){J.r4(this.MW)},
+Mh:function(a,b,c){throw H.b(P.nO(null))},
+V1:function(a){J.Wf(this.dA)},
 mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
+if(z!=null)this.dA.removeChild(z)
 return z},
-grZ:function(a){var z=this.MW.lastElementChild
+grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
@@ -10018,47 +10319,47 @@
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 tN:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
+"^":"ark;jt,xa",
+gB:function(a){return this.jt.length},
+t:function(a,b){var z=this.jt
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-Un:function(a,b){var z=C.t5.ad(this.Sn,new W.ty())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
+grZ:function(a){return C.t5.grZ(this.jt)},
+gDD:function(a){return W.or(this.xa)},
+S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
+this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.Un(a,b)
+z.S8(a,b)
 return z}}},
 ty:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 QI:{
 "^":"Gv;"},
-kd:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
+xd:{
+"^":"a;c9<",
+t:function(a,b){return H.VM(new W.RO(this.gc9(),b,!1),[null])}},
 DM:{
-"^":"kd;WK:YO<,WK",
+"^":"xd;c9:Yg<,c9",
 t:function(a,b){var z,y
 z=$.nn()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.JF(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.JF(this.YO,b,!1),[null])},
+if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cqa(this.Yg,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.Cqa(this.Yg,b,!1),[null])},
 static:{"^":"fDX"}},
 RAp:{
 "^":"Gv+lD;",
@@ -10075,15 +10376,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Xs:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,141,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 bU2:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"Xs:13;b,c",
+"^":"Xs:12;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -10091,61 +10392,61 @@
 y=y>=200&&y<300||y===0||y===304
 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,1,"call"],
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-QR:{
-"^":"Xs:80;a",
+DB:{
+"^":"Xs:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
+"^":"ark;uR",
+grZ:function(a){var z=this.uR.lastChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
-h:function(a,b){this.NL.appendChild(b)},
+h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
 xe:function(a,b,c){var z,y,x
-if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.NL
+if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.uR
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-oF:function(a,b,c){var z,y
-z=this.NL
+UG:function(a,b,c){var z,y
+z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 J.r5(z,c,y[b])},
-Yj:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
-z=this.NL
+z=this.uR
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
-zU:function(a,b){var z,y,x
-z=this.NL
+aO:function(a,b){var z,y,x
+z=this.uR
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
-Nk:function(a,b){this.zU(b,!0)},
-V1:function(a){J.r4(this.NL)},
+uk:function(a,b){this.aO(b,!0)},
+V1:function(a){J.Wf(this.uR)},
 u:function(a,b,c){var z,y
-z=this.NL
+z=this.uR
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.childNodes)},
+gA:function(a){return C.t5.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
+gB:function(a){return this.uR.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
+t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 $iswi:true,
@@ -10168,15 +10469,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -10209,216 +10510,216 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.JO(this))},
+FV:function(a,b){J.Me(b,new W.Za(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
-z=this.MW.attributes
+z=this.dA.attributes
 y=H.VM([],[P.qU])
 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},
+if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
+y.push(J.DA(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
+z=this.dA.attributes
 y=H.VM([],[P.qU])
 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)
+if(this.O2(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},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-JO:{
-"^":"Xs:80;a",
+Za:{
+"^":"Xs:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
-"^":"a7B;MW",
-x4:function(a,b){return this.MW.hasAttribute(b)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
+"^":"a7B;dA",
+NZ:function(a,b){return this.dA.hasAttribute(b)},
+t:function(a,b){return this.dA.getAttribute(b)},
+u:function(a,b,c){this.dA.setAttribute(b,c)},
 Rz:function(a,b){var z,y
-z=this.MW
+z=this.dA
 y=z.getAttribute(b)
 z.removeAttribute(b)
 return y},
 gB:function(a){return this.gvc(this).length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.qm(z))
+O2:function(a){return a.namespaceURI==null}},
+nFk:{
+"^":"As3;RN,AL",
+DG:function(){var z=P.Ls(null,null,null,P.qU)
+this.AL.aN(0,new W.pd(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.lo,z)},
-OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-Rz:function(a,b){return this.Q6(new W.FcD(b))},
-Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
+for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
+H9:function(a){this.AL.aN(0,new W.uS(a))},
+Rz:function(a,b){return this.Fm(new W.Bj(b))},
+Fm:function(a){return this.AL.es(0,!1,new W.hD(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.Zu()),[null,null])},
+static:{or:function(a){var z=new W.nFk(a,null)
+z.b1(a)
 return z}}},
-Xw:{
-"^":"Xs:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
+Zu:{
+"^":"Xs:12;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-qm:{
-"^":"Xs:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
+pd:{
+"^":"Xs:12;a",
+$1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
-Jt:{
-"^":"Xs:13;a",
-$1:function(a){return a.OS(this.a)},
+uS:{
+"^":"Xs:12;a",
+$1:function(a){return a.H9(this.a)},
 $isEH:true},
-FcD:{
-"^":"Xs:13;a",
+Bj:{
+"^":"Xs:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
+"^":"As3;dA",
+DG:function(){var z,y,x
 z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.lo)
+for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
 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," "))}},
+J.Pw(this.dA,a.zV(0," "))}},
 FkO:{
-"^":"a;Ph"},
+"^":"a;fA"},
 RO:{
-"^":"wS;bi,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.Ph,W.aF(a),this.Sg)
+"^":"wS;bi,fA,el",
+KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.aF(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
+z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-JF:{
-"^":"RO;bi,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"wS",0),null])},
+Cqa:{
+"^":"RO;bi,fA,el",
+WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
 $iswS:true},
 ie:{
-"^":"Xs:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
+"^":"Xs:12;a",
+$1:function(a){return J.We(J.l2(a),this.a)},
 $isEH:true},
-rg:{
-"^":"Xs:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+tS:{
+"^":"Xs:12;b",
+$1:[function(a){J.A6L(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
-"^":"yX;VP,bi,Ph,u7,Sg",
-ed:function(){if(this.bi==null)return
-this.Ns()
+"^":"yX;UU,bi,fA,H2,el",
+Gv:function(){if(this.bi==null)return
+this.EO()
 this.bi=null
-this.u7=null
+this.H2=null
 return},
-Fv:[function(a,b){if(this.bi==null)return;++this.VP
-this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,128,23,129],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.V5(this.bi,this.Ph,z,this.Sg)},
-Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.bi,this.Ph,z,this.Sg)}},
+Fv:[function(a,b){if(this.bi==null)return;++this.UU
+this.EO()
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,130,22,131],
+gUF:function(){return this.UU>0},
+QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
+this.DN()},"$0","gDQ",0,0,17],
+DN:function(){var z=this.H2
+if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
+EO:function(){var z=this.H2
+if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
+gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
 h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
-Nk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
+uk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 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."))},
+oq:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-Rz:function(a,b){return J.V1(this.xa,b)},
-V1:function(a){J.Z8(this.xa)},
-t:function(a,b){var z=this.xa
+"^":"ark;xN",
+gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
+gB:function(a){return this.xN.length},
+h:function(a,b){J.bi(this.xN,b)},
+Rz:function(a,b){return J.V1(this.xN,b)},
+V1:function(a){J.Z8(this.xN)},
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xa
+u:function(a,b,c){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
+sB:function(a,b){J.wg(this.xN,b)},
+GT:function(a,b){J.LH(this.xN,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(this.xa,b,c)},
-Mw:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xa,b,c)},
+XU:function(a,b,c){return J.G0(this.xN,b,c)},
+OY:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return J.ff(this.xN,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.CP(this.xa,b,c,d,e)},
+xe:function(a,b,c){return J.Vk(this.xN,b,c)},
+YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.O2(this.xa,b,c)}},
+oq:function(a,b,c){J.Cz(this.xN,b,c)}},
 LV:{
 "^":"a;qD",
 G:function(){return this.qD.G()},
 gl:function(){return this.qD.QZ}},
 W9:{
-"^":"a;nj,vN,Nq,QZ",
+"^":"a;NX,vN,G3,QZ",
 G:function(){var z,y
-z=this.Nq+1
+z=this.G3+1
 y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
+if(z<y){this.QZ=J.UQ(this.NX,z)
+this.G3=z
 return!0}this.QZ=null
-this.Nq=y
+this.G3=y
 return!1},
 gl:function(){return this.QZ}},
 zZ:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;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,54,"call"],
+return this.a(a)},"$1",null,2,0,null,56,"call"],
 $isEH:true},
 dW:{
-"^":"a;Ui",
-gbq:function(a){return W.zK(this.Ui.history)},
-geT:function(a){return W.P1(this.Ui.parent)},
-xO:function(a){return this.Ui.close()},
-xc:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+"^":"a;uU",
+gbq:function(a){return W.zK(this.uU.history)},
+geT:function(a){return W.P1(this.uU.parent)},
+xO:function(a){return this.uU.close()},
+hn:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
+X6:function(a,b,c){return this.hn(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Yb:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+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."))},
 $isPZ:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
 VP:{
-"^":"a;IP",
+"^":"a;nA",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
+"%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
 "^":"tpr;N:target=,mH:href=",
@@ -10435,8 +10736,8 @@
 pfc:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5G;kp:operator=,fg:height=,yG:result=,x=,y=",
+lF:{
+"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
 EfE:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -10450,7 +10751,7 @@
 ihH:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
-ym:{
+tk2:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
@@ -10459,8 +10760,8 @@
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-yu:{
-"^":"d5G;kp:operator=,fg:height=,yG:result=,x=,y=",
+yum:{
+"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI8:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -10471,7 +10772,7 @@
 bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
 HX:{
@@ -10483,10 +10784,10 @@
 OE5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
+l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
@@ -10502,7 +10803,7 @@
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 fQ:{
-"^":"en;fg:height=,x=,y=",
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
 "^":"d5G;t5:type=,mH:href=",
@@ -10516,11 +10817,11 @@
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"SH<"}},
+static:{"^":"JQ<"}},
 hy:{
 "^":"tpr;fg:height=,x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
@@ -10543,52 +10844,40 @@
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
 "^":"As3;LO",
-lF:function(){var z,y,x,w
+DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
+"%":"SQLError"}}],["","",,P,{
 "^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
 hq:{
 "^":"a;",
-$ishq:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+$ishq:true}}],["","",,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)},
+z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","uuA",8,0,null,40,61,26,62],
 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},
 Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
-if(a==null)return
-else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 else{z=J.x(a)
 if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
 else if(!!z.$isiP)return H.o2(a)
-else if(!!z.$isE4)return a.eh
+else if(!!z.$isE4)return a.S1
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
 hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -10599,31 +10888,31 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,52,63],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
-else return P.iQ(a,$.LZ(),new P.np())},
+else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.np())
+else return P.iQ(a,$.LZ(),new P.Ut())},
 iQ:function(a,b,c){var z=P.Jk(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
-"^":"a;eh",
+"^":"a;S1",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.eh[b])},
+return P.dU(this.S1[b])},
 u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.eh[b]=P.wY(c)},
+this.S1[b]=P.wY(c)},
 giO:function(a){return 0},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
+return!!J.x(b).$isE4&&this.S1===b.S1},
+Eg:function(a){return a in this.S1},
 Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.u("property is not a String or num"))
-delete this.eh[a]},
+delete this.S1[a]},
 bu:[function(a){var z,y
-try{z=String(this.eh)
+try{z=String(this.S1)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,71],
+return P.a.prototype.bu.call(this,this)}},"$0","gCR",0,0,73],
 V7:function(a,b){var z,y
-z=this.eh
+z=this.S1
 y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
 nQ:function(a){return this.V7(a,null)},
@@ -10636,12 +10925,12 @@
 x=z.bind.apply(z,y)
 String(x)
 return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
-return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-if(z.x4(0,a))return z.t(0,a)
+if(z.NZ(0,a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isT8){x={}
 z.u(0,a,x)
@@ -10649,19 +10938,19 @@
 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,61,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 r7:{
-"^":"E4;eh",
+"^":"E4;S1",
 qP:function(a,b){var z,y
 z=P.wY(b)
 y=P.F(H.VM(new H.A8(a,P.En()),[null,null]),!0,null)
-return P.dU(this.eh.apply(z,y))},
+return P.dU(this.S1.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"Wk;eh",
+"^":"Wk;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -10670,7 +10959,7 @@
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
 if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.eh.length
+gB:function(a){var z=this.S1.length
 if(typeof z==="number"&&z>>>0===z)return z
 throw H.b(P.w("Bad JsArray length"))},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
@@ -10678,7 +10967,7 @@
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
 xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-UZ:function(a,b,c){P.uF(b,c,this.gB(this))
+oq:function(a,b,c){P.NH(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -10691,9 +10980,9 @@
 C.Nm.FV(x,J.Ld(d,e).rh(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
+GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{uF:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{NH:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
 Wk:{
 "^":"E4+lD;",
@@ -10703,27 +10992,27 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Xs:13;",
-$1:function(a){var z=P.xZ(a,!1)
+"^":"Xs:12;",
+$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
-Jd:{
-"^":"Xs:13;",
+np:{
+"^":"Xs:12;",
 $1:function(a){return H.VM(new P.GD(a),[null])},
 $isEH:true},
-np:{
-"^":"Xs:13;",
+Ut:{
+"^":"Xs:12;",
 $1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
+$isEH:true}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -10754,26 +11043,26 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;Nd,ii",
-hv:function(){var z,y,x,w,v,u
-z=this.Nd
+"^":"a;xx,vz",
+SR:function(){var z,y,x,w,v,u
+z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.ii
+u=v+x+this.vz
 z=(u&4294967295)>>>0
-this.Nd=z
-this.ii=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.xx=z
+this.vz=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hv()
-return(this.Nd&z)>>>0}do{this.hv()
-y=this.Nd
+if((a&z)===0){this.SR()
+return(this.xx&z)>>>0}do{this.SR()
+y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mf:function(a){var z,y,x,w,v,u,t,s
+mK:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
@@ -10783,36 +11072,36 @@
 a=J.Cl(y.W(a,w),4294967296)
 v=((~x&4294967295)>>>0)+(x<<21>>>0)
 u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.BU(v-u,4294967296)&4294967295
 v=((u^(u>>>24|w<<8))>>>0)*265
 x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+w=((w^w>>>24)>>>0)*265+C.jn.BU(v-x,4294967296)&4294967295
 v=((x^(x>>>14|w<<18))>>>0)*21
 x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+w=((w^w>>>14)>>>0)*21+C.jn.BU(v-x,4294967296)&4294967295
 x=(x^(x>>>28|w<<4))>>>0
 w=(w^w>>>28)>>>0
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Nd*1037
+y=C.jn.BU(v-u,4294967296)
+v=this.xx*1037
 t=(v&4294967295)>>>0
-this.Nd=t
-s=(this.ii*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.ii=s
-this.Nd=(t^u)>>>0
-this.ii=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.ii===0&&this.Nd===0)this.Nd=23063
-this.hv()
-this.hv()
-this.hv()
-this.hv()},
-static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
-z.mf(a)
+this.xx=t
+s=(this.vz*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
+this.vz=s
+this.xx=(t^u)>>>0
+this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.vz===0&&this.xx===0)this.xx=23063
+this.SR()
+this.SR()
+this.SR()
+this.SR()},
+static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.mK(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
@@ -10867,7 +11156,7 @@
 "^":"a;",
 gT8:function(a){return this.gBb(this)+this.R},
 gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,71],
+bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gCR",0,0,73],
 n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -10877,7 +11166,7 @@
 return z},
 giO:function(a){var z=this.G6
 return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -10887,221 +11176,173 @@
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
 "^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"v0;Rp"},
-v0:{
-"^":"Nx3+B8q;",
-$isT8:true,
-$asT8:null},
-B8q:{
+moY:{
+"^":"a;JH",
+static:{"^":"aRn,aLE,Rwl"}},
+V2:{
 "^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-Rz:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isT8:true,
-$asT8:null},
-Nx3:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-x4:function(a,b){return this.Rp.x4(0,b)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(a){var z=this.Rp
-return H.VM(new P.i5(z),[H.u3(z,0)])},
-gB:function(a){return this.Rp.X5},
-Rz:function(a,b){return this.Rp.Rz(0,b)},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
-$isT8:true,
-$asT8:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
+$isAS:true}}],["","",,H,{
 "^":"",
+Hj:function(a,b,c){},
 m6:function(a){a.toString
 return a},
 jZN:function(a){a.toString
 return a},
 aRu:function(a){a.toString
 return a},
+GG:function(a,b,c){H.Hj(a,b,c)
+return new Uint8Array(a,b)},
 WZ:{
-"^":"Gv;",
+"^":"Gv;H3:byteLength=",
 gbx:function(a){return C.uh},
+kq:function(a,b,c){H.Hj(a,b,c)
+return new DataView(a,b)},
 $isWZ:true,
+$isaI:true,
 "%":"ArrayBuffer"},
 eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
+"^":"Gv;bg:buffer=,H3:byteLength=,Vl:byteOffset=",
+aq:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
 else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
+Lu:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
+Mz:function(a,b,c,d){var z=d+1
+this.Lu(a,b,z)
+this.Lu(a,c,z)
+if(b>c)throw H.b(P.TE(b,0,c))
+return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|ObS|GVy|Dg|fjp|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.dP},
+gbx:function(a){return C.nW},
+mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]},
-$isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.NS},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+gbx:function(a){return C.nC},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]},
-$isAS:true,
 "%":"Float64Array"},
 xja:{
 "^":"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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int16Array"},
-dE:{
+dE5:{
 "^":"Pg;",
-gbx:function(a){return C.XI},
+gbx:function(a){return C.hg},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
 gbx:function(a){return C.laj},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Int8Array"},
-pd:{
+wfF:{
 "^":"Pg;",
-gbx:function(a){return C.oZ},
+gbx:function(a){return C.M5},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint16Array"},
 Pqh:{
 "^":"Pg;",
-gbx:function(a){return C.UR},
+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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
 gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
 gbx:function(a){return C.Wr},
 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)
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
+aM:function(a,b,c){return new Uint8Array(a.subarray(b,this.Mz(a,b,c,a.length)))},
+$isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]},
-$isAS:true,
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
+SM:function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
+this.Lu(a,b,z)
+this.Lu(a,c,z)
 if(b>c)throw H.b(P.TE(b,0,c))
 y=c-b
 if(e<0)throw H.b(P.u(e))
@@ -11112,27 +11353,31 @@
 $isXj:true},
 Dg:{
 "^":"GVy;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+return a[b]},
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+a[b]=c},
+YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.SM(a,b,c,d,e)
 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,
-$isWO:true,
-$asWO:function(){return[P.Vf]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.Vf]}},
-Ui:{
-"^":"we+lD;",
+$isDg:true},
+ObS:{
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.Vf]}},
 GVy:{
-"^":"Ui+SU7;"},
+"^":"ObS+SU7;"},
 Pg:{
 "^":"Ipv;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.aq(a,b,z)
+a[b]=c},
+YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.SM(a,b,c,d,e)
 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,
@@ -11141,48 +11386,48 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-ObS:{
-"^":"we+lD;",
+fjp:{
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+Af:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){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)}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
+"^":"WZq;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gkc:function(a){return a.Ew},
+skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wI.ZL(a)
-C.wI.XI(a)
+a.n9=x
+a.wy=w
+C.On.LX(a)
+C.On.XI(a)
 return a}}},
-D13:{
+WZq:{
 "^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"pva;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 ga4:function(a){return a.a3},
 sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
@@ -11193,11 +11438,11 @@
 sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
 gCf:function(a){return a.y4},
 sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
+hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,114,1,105,106],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,115,2,106,107],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -11206,9 +11451,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,114,1,105,106],
-o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,142,1],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,115,2,106,107],
+o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,146,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11218,28 +11463,28 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.GhT.ZL(a)
-C.GhT.XI(a)
+a.n9=w
+a.wy=v
+C.Jh.LX(a)
+C.Jh.XI(a)
 return a}}},
-WZq:{
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Xs:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"^":"Xs:12;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gv8:function(a){return a.fe},
-sv8:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
+"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gO9:function(a){return a.fe},
+sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
 sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
 gFR:function(a){return a.bY},
@@ -11250,11 +11495,11 @@
 skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
 gyG:function(a){return a.oy},
 syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-wB:[function(a,b,c,d){var z=a.fe
+cg:[function(a,b,c,d){var z=a.fe
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,84,46,47,85],
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11266,32 +11511,32 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.qL.ZL(a)
+a.n9=x
+a.wy=w
+C.qL.LX(a)
 C.qL.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"Xs:144;a",
+"^":"Xs:148;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,95,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 uv:{
-"^":"Xs:74;b",
+"^":"Xs:76;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+$isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11299,92 +11544,92 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MC.ZL(a)
+a.n9=x
+a.wy=w
+C.MC.LX(a)
 C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"cda;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
 static:{cYO:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.LTI.ZL(a)
+a.n9=x
+a.wy=w
+C.LTI.LX(a)
 C.LTI.XI(a)
 return a}}},
-pva:{
+cda:{
 "^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"waa;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
 static:{TsF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MO0.ZL(a)
-C.MO0.XI(a)
+a.n9=x
+a.wy=w
+C.n0.LX(a)
+C.n0.XI(a)
 return a}}},
-cda:{
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V10;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gQR:function(a){return a.Zc},
+sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Hb.ZL(a)
-C.Hb.XI(a)
+a.n9=x
+a.wy=w
+C.ls6.LX(a)
+C.ls6.XI(a)
 return a}}},
-waa:{
+V10:{
 "^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -11395,66 +11640,67 @@
 w=P.Fl(null,null)
 a.PQ=!0
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Xo.ZL(a)
+a.n9=x
+a.wy=w
+C.Xo.LX(a)
 C.Xo.XI(a)
 return a}}},
 T53:{
 "^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V2;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V11;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.P6).YM(b)},"$1","gWp",2,0,20,101],
+pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.PJ8.ZL(a)
+a.n9=x
+a.wy=w
+C.PJ8.LX(a)
 C.PJ8.XI(a)
 return a}}},
-V2:{
+V11:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+$isd3:true}}],["","",,O,{
 "^":"",
 Hz:{
-"^":"a;zE,UG",
-sih:function(a,b){var z=this.UG
+"^":"a;zE,y5",
+sih:function(a,b){var z=this.y5
 C.yp.zB(J.Qd(this.zE),z,z+4,b)},
-gih:function(a){var z=this.UG
-return C.yp.Mu(J.Qd(this.zE),z,z+4)},
-rA:[function(){return new O.Hz(this.zE,this.UG+4)},"$0","gaw",0,0,145],
-gvH:function(a){return C.CD.cU(this.UG,4)},
+gih:function(a){var z=this.y5
+return C.yp.Yc(J.Qd(this.zE),z,z+4)},
+PY:[function(){return new O.Hz(this.zE,this.y5+4)},"$0","gaw",0,0,149],
+gvH:function(a){return C.CD.BU(this.y5,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
-z=b.gy(b)
-y=J.eY(a)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
+z=J.RE(b)
+y=z.gy(b)
+x=J.eY(a)
+if(typeof y!=="number")return y.U()
 if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
+z=z.gx(b)
+if(typeof z!=="number")return H.s(z)
+return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,tL"},
+"^":"a;Yu<,yT"},
 Vb:{
-"^":"V10;hi,An,dW,rM,Aj,UL,PA,oj,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V12;A6,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -11462,39 +11708,39 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
+a.A6=z
 z=J.Q9(z)
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.u3(z,0)]).Zz()
-z=J.mZ(a.hi)
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.u3(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
+z=J.GW(a.A6)
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
+Zt:function(a,b){var z,y,x
+for(z=J.mY(b),y=0;z.G();){x=z.Ff
 if(typeof x!=="number")return H.s(x)
 y=y*256+x}return y},
-fJ:function(a,b,c,d){var z=J.It(c,"@")
+OU:function(a,b,c,d){var z=J.It(c,"@")
 if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Aj.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,w=a.Aj;z.G();){v=z.gl()
+a.Cv.u(0,b,z[0])
+a.Tl.u(0,b,d)
+a.GE.u(0,this.Zt(a,d),b)},
+DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
+for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.It(v.r0,"/")),null,null)
-t=u==null?C.pr:P.Nh(u)
+continue}u=H.BU(C.Nm.grZ(J.It(v.TU,"/")),null,null)
+t=u==null?C.pr:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.It(v.bN,"@")
 if(0>=r.length)return H.e(r,0)
 y.u(0,u,r[0])
 x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.R2())
-this.fJ(a,0,"",$.Qg())},
-WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.dW
-y=J.eY(a.An)
+w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.aw())
+this.OU(a,0,"",$.Qg())},
+Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=a.rn
+y=J.eY(a.WC)
 if(typeof z!=="number")return z.U()
 if(typeof y!=="number")return H.s(y)
 x=z*y
-w=C.CD.cU(O.x6(a.An,b).UG,4)
+w=C.CD.BU(O.x6(a.WC,b).y5,4)
 v=C.CD.Z(w,x)
 u=C.CD.Y(w,x)
 t=J.UQ(a.oj,"pages")
@@ -11520,57 +11766,57 @@
 y=J.UQ(a.oj,"unit_size_bytes")
 if(typeof y!=="number")return H.s(y)
 return new O.x2(J.WB(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
-U8:[function(a,b){var z,y,x,w,v
+bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
-y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
+y=this.Tm(a,z.gD7(b))
+x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
-z=O.x6(a.An,z)
-w=z.UG
-v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
+z=O.x6(a.WC,z)
+w=z.y5
+v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,142,2],
-H3:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,142,2],
-My:function(a){var z,y,x,w,v
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,146,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,146,87],
+UV:function(a){var z,y,x,w,v
 z=a.oj
-if(z==null||a.hi==null)return
-this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
+if(z==null||a.A6==null)return
+this.DO(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
 y=J.UQ(a.oj,"pages")
-z=a.hi.parentElement
+z=a.A6.parentElement
 z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(z.clientHeight)),null).R
+x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
 z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
-a.dW=z
+a.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.Ry(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.eY(w))
-J.OE(a.hi,J.OB(a.An))
-this.Fc(a,0)},
-Fc:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+w=P.f9(J.Ry(a.A6).createImageData(x,v))
+a.WC=w
+J.vP(a.A6,J.eY(w))
+J.OE(a.A6,J.OB(a.WC))
+this.Ky(a,0)},
+Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
 a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
+x=a.rn
 if(typeof x!=="number")return H.s(x)
 w=b*x
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.An)
+if(!(b>=x)){x=J.OB(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
+u=O.x6(a.WC,H.VM(new P.hL(0,w),[null]))
 t=J.UQ(y.t(z,b),"objects")
 y=J.U6(t)
-x=a.rM
+x=a.Tl
 s=0
 while(!0){r=y.gB(t)
 if(typeof r!=="number")return H.s(r)
@@ -11578,11 +11824,11 @@
 q=y.t(t,s)
 p=x.t(0,y.t(t,s+1))
 for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.UG
+n=u.y5
 m=n+4
 C.yp.zB(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.UG
-x=C.CD.cU(y,4)
+u=new O.Hz(r,m)}s+=2}while(!0){y=u.y5
+x=C.CD.BU(y,4)
 r=u.zE
 n=J.RE(r)
 m=n.gR(r)
@@ -11596,14 +11842,14 @@
 x=$.Qg()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.hi)
-x=a.An
+u=new O.Hz(r,m)}y=J.Ry(a.A6)
+x=a.WC
 J.kZ(y,x,0,0,0,w,J.eY(x),v)
 P.BV(new O.R5(a,b),null)},
-SK:[function(a,b){var z=a.oj
+pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,101],
-YS:[function(a,b){P.BV(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.Wq()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.BV(new O.oc(a),null)},"$1","gRh",2,0,19,59],
 static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -11613,54 +11859,54 @@
 v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
 u=P.Fl(null,null)
 t=P.Fl(null,null)
-a.rM=z
-a.Aj=y
-a.UL=x
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Tl=z
+a.GE=y
+a.Cv=x
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=w
 a.ZQ=v
-a.iQ=u
-a.Xi=t
-C.wc.ZL(a)
+a.n9=u
+a.wy=t
+C.wc.LX(a)
 C.wc.XI(a)
 return a}}},
-V10:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Xs:74;a,b",
-$0:function(){J.MU(this.a,this.b+1)},
+"^":"Xs:76;a,b",
+$0:function(){J.AC(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,146,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,150,"call"],
 $isEH:true},
-z4:{
-"^":"Xs:80;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,147,"call"],
+Wq:{
+"^":"Xs:81;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,151,"call"],
 $isEH:true},
 oc:{
-"^":"Xs:74;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"^":"Xs:76;a",
+$0:function(){J.oO(this.a)},
+$isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
+"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
+wA:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.hI(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
+return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.wA.call(this,a,b)}},
 Ly:{
-"^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V13;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
 scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 god:function(a){return a.Sk},
@@ -11668,37 +11914,37 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
+a.jF=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
+z=new G.yD(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Ya:function(a){var z,y,x,w
+a.Uv=z
+a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
+Y1:function(a){var z,y,x,w
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,"class")
 if(w==null)continue
 w.gUY().eC(x.t(y,"new"))
 w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.Ai()
+FS:function(a){var z,y,x,w,v,u,t,s,r,q
+a.Rp.Ai()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
 if(y==null)continue
 if(y.gMp())continue
-x=y.gUY().ghb().rT
-w=y.gUY().ghb().wf
-v=y.gUY().gl().rT
+x=y.gUY().gEJ().wY
+w=y.gUY().gEJ().wf
+v=y.gUY().gl().wY
 u=y.gUY().gl().wf
-t=y.gxQ().ghb().rT
-s=y.gxQ().ghb().wf
-r=y.gxQ().gl().rT
+t=y.gxQ().gEJ().wY
+s=y.gxQ().gEJ().wf
+r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.an(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),c)
+J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
+As:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
 J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
@@ -11706,18 +11952,18 @@
 while(!0){v=J.q8(x.gUQ(z))
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{if(C.Nm.Gs(C.NG,w))break c$0
+c$0:{if(C.Nm.tg(C.NG,w))break c$0
 u=J.UQ(y.gks(b),w)
 v=J.RE(u)
 v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
+v.sa4(u,a.Rp.Gu(c,w))}++w}},
+ya:function(a){var z,y,x,w,v,u,t,s
+z=J.Mx(a.Na)
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
+y=z.gB(z)-a.Rp.gzz().length
+for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
+w=J.Mx(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -11736,28 +11982,28 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
+J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-AE:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+this.As(a,J.Mx(a.Na).t(0,x),s)}},
+BB:[function(a,b,c,d){var z,y,x
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-x=a.nc
+x=a.Rp
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,104,1,105,106],
-SK:[function(a,b){var z=a.Ol
+a.Rp.sT3(!0)}else x.sT3(!x.gT3())
+J.II(a.Rp)
+this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,101],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,101],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,101],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,148,149],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,152,153],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11769,84 +12015,84 @@
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
-a.MF=this.ct(a,C.TN,a.MF,z)}z=a.GQ.KJ
+a.MF=this.ct(a,C.TN,a.MF,z)}z=a.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 x=J.aT(a.Ol)
-z=a.GQ
+z=a.Xe
 w=x.gUY().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
-v=a.GQ
-z=J.Hn(x.gUY().gCs(),x.gUY().gSU())
-v=v.KJ
+v=a.Xe
+z=J.Hn(x.gUY().gkV(),x.gUY().gSU())
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.GQ
+w=a.Xe
 v=x.gUY().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.Oc.KJ
+z=a.FX.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
+z=a.FX
 w=x.gxQ().gSU()
-z=z.KJ
+z=z.Yb
 v=[]
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
-v=a.Oc
-z=J.Hn(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.KJ
+v=a.FX
+z=J.Hn(x.gxQ().gkV(),x.gxQ().gSU())
+v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
 v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.Oc
+w=a.FX
 v=x.gxQ().gMX()
-w=w.KJ
+w=w.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Ya(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
+this.Y1(a)
+this.FS(a)
+this.ya(a)
+a.jF.Am(a.Xe)
+a.Uv.Am(a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
-Ar:[function(a,b){var z,y,x
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,150,151],
-uW:[function(a,b){var z,y
+return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,154,155],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,150,151],
-F9:[function(a,b){var z,y
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,154,155],
+o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,150,151],
+return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,154,155],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
+a.Xe=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.GQ.KJ.V7("addColumn",["number","Size"])
+a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Oc=new G.Kf(z)
+a.FX=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.KJ.V7("addColumn",["number","Size"])
+a.FX.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.pg()),new G.Kt("Accumulated Instances",G.IZ()),new G.Kt("Current Size",G.pg()),new G.Kt("Current Instances",G.IZ()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.pg()),new G.Kt("Accumulator Instances",G.IZ()),new G.Kt("Current Size",G.pg()),new G.Kt("Current Instances",G.IZ())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(2)},
-static:{Ut:function(a){var z,y,x,w
+static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -11854,28 +12100,28 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vc.ZL(a)
+a.n9=x
+a.wy=w
+C.Vc.LX(a)
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V11:{
+V13:{
 "^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
+$isd3:true}}],["","",,P,{
 "^":"",
 pf:function(a){var z,y
 z=[]
-y=new P.Tm(new P.OW([],z),new P.rG(z),new P.fh(z)).$1(a)
-new P.uS().$0()
+y=new P.kd(new P.wF([],z),new P.rG(z),new P.aj(z)).$1(a)
+new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.GW([],z),new P.D6(z),new P.KC(z)).$1(a)},
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
@@ -11888,8 +12134,8 @@
 if(z==null){z=J.NT(window.navigator.userAgent,"Opera",0)
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
-OW:{
-"^":"Xs:48;b,c",
+wF:{
+"^":"Xs:51;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -11899,23 +12145,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Xs:152;d",
+"^":"Xs:156;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-fh:{
-"^":"Xs:153;e",
+aj:{
+"^":"Xs:157;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
-uS:{
-"^":"Xs:74;",
+Qa:{
+"^":"Xs:76;",
 $0:function(){},
 $isEH:true},
-Tm:{
-"^":"Xs:13;f,UI,bK",
+kd:{
+"^":"Xs:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -11923,8 +12169,8 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSE)throw H.b(P.nO("structured clone of RegExp"))
+if(!!y.$isiP)return new Date(a.rq)
+if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -11949,11 +12195,11 @@
 w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"Xs:80;a,Gq",
-$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
+"^":"Xs:81;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-GW:{
-"^":"Xs:48;a,b",
+CA:{
+"^":"Xs:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -11963,19 +12209,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Xs:152;c",
+"^":"Xs:156;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Xs:153;d",
+"^":"Xs:157;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"Xs:13;e,f,UI,bK",
+"^":"Xs:12;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
@@ -11988,7 +12234,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -12008,184 +12254,239 @@
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,71],
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
+bu:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,73],
+gA:function(a){var z=this.DG()
+z=H.VM(new P.zQ(z,z.HU,null,null),[null])
+z.Qx=z.vY.HH
 return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,154,31],
-ad:function(a,b){var z=this.lF()
+aN:function(a,b){this.DG().aN(0,b)},
+zV:function(a,b){return this.DG().zV(0,b)},
+ez:[function(a,b){var z=this.DG()
+return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,158,30],
+ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,155,31],
-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},
-gB:function(a){return this.lF().X5},
-Gs:function(a,b){return this.lF().Gs(0,b)},
-hV:function(a){return this.lF().Gs(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
+lM:[function(a,b){var z=this.DG()
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,159,30],
+Vr:function(a,b){return this.DG().Vr(0,b)},
+gl0:function(a){return this.DG().X5===0},
+gor:function(a){return this.DG().X5!==0},
+gB:function(a){return this.DG().X5},
+tg:function(a,b){return this.DG().tg(0,b)},
+hV:function(a){return this.DG().tg(0,a)?a:null},
+h:function(a,b){return this.H9(new P.GE(b))},
 Rz:function(a,b){var z,y
 if(typeof b!=="string")return!1
-z=this.lF()
+z=this.DG()
 y=z.Rz(0,b)
 this.p5(z)
 return y},
-FV:function(a,b){this.OS(new P.rl(b))},
-Nk:function(a,b){this.OS(new P.PR(b))},
-grZ:function(a){var z=this.lF().lX
+FV:function(a,b){this.H9(new P.rl(b))},
+uk:function(a,b){this.H9(new P.PR(b))},
+grZ:function(a){var z=this.DG().Nz
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
+tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
 zH:function(a){var z,y
-z=this.lF()
-y=z.Ys()
+z=this.DG()
+y=z.iL()
 y.FV(0,z)
 return y},
-eR:function(a,b){var z=this.lF()
+eR:function(a,b){var z=this.DG()
 return H.ke(z,b,H.u3(z,0))},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
+V1:function(a){this.H9(new P.uQ())},
+H9:function(a){var z,y
+z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isJb:true,
-$asJb:function(){return[P.qU]},
+$isOl:true,
+$asOl:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
-"^":"Xs:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 rl:{
-"^":"Xs:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 PR:{
-"^":"Xs:13;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.Ei(a,this.a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 uQ:{
-"^":"Xs:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,156,"call"],
+"^":"Xs:12;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 D7:{
-"^":"ark;NJ,iz",
-gye:function(){var z=this.iz
+"^":"ark;ew,kG",
+gd3:function(){var z=this.kG
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
+aN:function(a,b){H.bQ(this.gd3(),b)},
+u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
+J.DG(z[b],c)},
+sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.NL.appendChild(b)},
+this.oq(0,b,z)},
+h:function(a,b){this.kG.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
-Gs:function(a,b){if(!J.x(b).$ish4)return!1
-return b.parentNode===this.NJ},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
+tg:function(a,b){if(!J.x(b).$ish4)return!1
+return b.parentNode===this.ew},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
+oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.GS())},
+V1:function(a){J.Wf(this.kG.uR)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)J.Mp(z)
 return z},
-xe:function(a,b,c){this.iz.xe(0,b,c)},
-oF:function(a,b,c){var z,y
-z=this.iz.NL
+xe:function(a,b,c){this.kG.xe(0,b,c)},
+UG:function(a,b,c){var z,y
+z=this.kG.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
 J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
-for(z=0;z<this.gye().length;++z){y=this.gye()
+for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
 if(x===b){J.Mp(x)
 return!0}}return!1},
-gB:function(a){return this.gye().length},
-t:function(a,b){var z=this.gye()
+gB:function(a){return this.gd3().length},
+t:function(a,b){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gye()
+gA:function(a){var z=this.gd3()
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
+$isEH:true}}],["","",,O,{
 "^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
-else{y=J.w1(z)
+Im:{
+"^":"ZzR;jw,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gV8:function(a){return J.UQ(a.tY,"slot")},
+gyg:function(a){var z=J.UQ(a.tY,"slot")
+return typeof z==="number"},
+gWk:function(a){return!!J.x(J.UQ(a.tY,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.tY,"slot"),"type"),"@Field")},
+gFF:function(a){return J.UQ(a.tY,"source")},
+gyK:function(a){return a.jw},
+syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
+rT:[function(a,b){return J.aT(J.UQ(a.tY,"source")).cv(J.WB(J.eS(J.UQ(a.tY,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){var z,y
+if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
+else{z=a.tY
+y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,157,158,101],
-static:{lu:function(a){var z,y,x,w
+c.$0()}},"$2","gus",4,0,161,162,102],
+static:{Xn:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.po.ZL(a)
-C.po.XI(a)
+a.n9=x
+a.wy=w
+C.QFk.LX(a)
+C.QFk.XI(a)
+return a}}},
+ZzR:{
+"^":"xI+Pi;",
+$isd3:true},
+cC:{
+"^":"Xs:114;a",
+$1:[function(a){var z,y,x
+z=this.a
+y=J.UQ(a,"references")
+x=Q.ch(null,null)
+x.FV(0,y)
+z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,150,"call"],
+$isEH:true},
+qm:{
+"^":"Xs:12;a",
+$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,B,{
+"^":"",
+pR:{
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gXt:function(a){var z=a.tY
+if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gXt.call(this,a)},
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){var z,y
+z=a.tY
+if(b===!0)J.LE(z).ml(new B.Ng(a)).wM(c)
+else{y=J.w1(z)
+y.u(z,"fields",null)
+y.u(z,"elements",null)
+c.$0()}},"$2","gus",4,0,161,162,102],
+static:{luW:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.Pe=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.n9=x
+a.wy=w
+C.hM.LX(a)
+C.hM.XI(a)
 return a}}},
 Ng:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
-a.sTX(z.t(a,"valueAsString"))}z=this.a
+a.sTE(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 hx:{
-"^":"V12;VQ,VR,MV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V14;VQ,VR,Cm,MV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
 gIi:function(a){return a.VR},
 sIi:function(a,b){a.VR=this.ct(a,C.XM,a.VR,b)},
+gyK:function(a){return a.Cm},
+syK:function(a,b){a.Cm=this.ct(a,C.uO,a.Cm,b)},
 gCF:function(a){return a.MV},
 sCF:function(a,b){a.MV=this.ct(a,C.tg,a.MV,b)},
-vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-S1:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retained")).ml(new Z.Pz(a))},"$1","ghN",2,0,110,112],
-Pr:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,110,33],
-SK:[function(a,b){J.cI(a.VQ).YM(b)},"$1","gvC",2,0,20,101],
+vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+zs:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retained")).ml(new Z.dQ(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,111,32],
+rT:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/inbound_references?limit="+H.d(b))).ml(new Z.Fs(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,19,102],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12193,194 +12494,199 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.MV=null
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.yKx.ZL(a)
+a.n9=x
+a.wy=w
+C.yKx.LX(a)
 C.yKx.XI(a)
 return a}}},
-V12:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
-Pz:{
-"^":"Xs:113;a",
+dQ:{
+"^":"Xs:114;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.MV=J.Q5(z,C.tg,z.MV,y)},"$1",null,2,0,null,95,"call"],
+z.MV=J.Q5(z,C.tg,z.MV,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 cL:{
-"^":"Xs:144;a",
+"^":"Xs:148;a",
 $1:[function(a){var z=this.a
-z.VR=J.Q5(z,C.XM,z.VR,a)},"$1",null,2,0,null,95,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+z.VR=J.Q5(z,C.XM,z.VR,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true},
+Fs:{
+"^":"Xs:148;a",
+$1:[function(a){var z=this.a
+z.Cm=J.Q5(z,C.uO,z.Cm,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V15;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
 static:{p4t:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wd.ZL(a)
-C.wd.XI(a)
+a.n9=x
+a.wy=w
+C.j1o.LX(a)
+C.j1o.XI(a)
 return a}}},
-V13:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{vH:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ag.ZL(a)
+a.n9=x
+a.wy=w
+C.Ag.LX(a)
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V16;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
 static:{Ch:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ie.ZL(a)
+a.n9=x
+a.wy=w
+C.Ie.LX(a)
 C.Ie.XI(a)
 return a}}},
-V14:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{oB:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ig.ZL(a)
+a.n9=x
+a.wy=w
+C.Ig.LX(a)
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V17;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,101],
-Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
+pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
+T9:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.x4.ZL(a)
-C.x4.XI(a)
+a.n9=x
+a.wy=w
+C.VLs.LX(a)
+C.VLs.XI(a)
 return a}}},
-V15:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
-Kv:{
-"^":"Xs:74;a",
+XB:{
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,101],
-Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
+"^":"V18;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gPB:function(a){return a.OS},
+sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
+pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
+T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.GII.ZL(a)
-C.GII.XI(a)
+a.n9=x
+a.wy=w
+C.tO.LX(a)
+C.tO.XI(a)
 return a}}},
-V16:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{jS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12388,176 +12694,176 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ug.ZL(a)
-C.Ug.XI(a)
+a.n9=x
+a.wy=w
+C.bP.LX(a)
+C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{Sc:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{va:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wK.ZL(a)
+a.n9=x
+a.wy=w
+C.wK.LX(a)
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V19;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{UE:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{RN:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ozm.ZL(a)
+a.n9=x
+a.wy=w
+C.ozm.LX(a)
 C.ozm.XI(a)
 return a}}},
-V17:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V20;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
 static:{chF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.rU.ZL(a)
+a.n9=x
+a.wy=w
+C.rU.LX(a)
 C.rU.XI(a)
 return a}}},
-V18:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{AW:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{Jz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Fw.ZL(a)
+a.n9=x
+a.wy=w
+C.Fw.LX(a)
 C.Fw.XI(a)
 return a}}},
 Zn:{
-"^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{O3:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{kf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.ij.ZL(a)
+a.n9=x
+a.wy=w
+C.ij.LX(a)
 C.ij.XI(a)
 return a}}},
-V19:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V22;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.aV.ZL(a)
+a.n9=x
+a.wy=w
+C.aV.LX(a)
 C.aV.XI(a)
 return a}}},
-V20:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
-static:{Ii1:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
+static:{Ii:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.iR.ZL(a)
+a.n9=x
+a.wy=w
+C.iR.LX(a)
 C.iR.XI(a)
 return a}}},
-V21:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{ML:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12565,79 +12871,79 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.L6.ZL(a)
-C.L6.XI(a)
+a.n9=x
+a.wy=w
+C.RVQ.LX(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V24;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,101],
-Po:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
+pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
+O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.yr.ZL(a)
-C.yr.XI(a)
+a.n9=x
+a.wy=w
+C.wP.LX(a)
+C.wP.XI(a)
 return a}}},
-V22:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 mj:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
 static:{tX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.wvk.ZL(a)
+a.n9=x
+a.wy=w
+C.wvk.LX(a)
 C.wvk.XI(a)
 return a}}},
-V23:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"oEY;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -12648,88 +12954,88 @@
 w=P.Fl(null,null)
 a.CB=!1
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OkI.ZL(a)
-C.OkI.XI(a)
+a.n9=x
+a.wy=w
+C.hU.LX(a)
+C.hU.XI(a)
 return a}}},
-ZzR:{
+oEY:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V24;RX,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gNN:function(a){return a.RX},
-Fn:function(a){return this.gNN(a).$0()},
-sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,101],
-Po:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
+"^":"V26;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gpE:function(a){return a.RX},
+Fn:function(a){return this.gpE(a).$0()},
+spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
+pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZFP:function(a){var z,y,x,w
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
+if(z!=null){z.Gv()
+a.c3=null}},
+static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.bZ.ZL(a)
+a.n9=x
+a.wy=w
+C.bZ.LX(a)
 C.bZ.XI(a)
 return a}}},
-V24:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,SF,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
+"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
 gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
+Pz:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
 x=this.ks
 if(x.length>0)return
 for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
-s=J.X9(t.gAv(),w.gAv())
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(s>y||J.X9(J.on(t).gDu(),u.Av)>y))continue
+if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
 x.push(X.SJ(z,u,t,this))}},
-o8:function(){},
+cO:function(){},
 Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.X9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
 y=J.RE(z)
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.SF.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.zg=G.dj(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.SF.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
+this.zg=G.dj(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
 z.push(this.vs)
-z.push(this.ki)},
+z.push(this.zg)},
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?d.yt+1:0
@@ -12738,7 +13044,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V25;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V27;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -12780,38 +13086,38 @@
 a.fE=this.ct(a,C.aH,a.fE,v)
 J.aT(a.oi).N3(a.oi)
 J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.kf(z,null,null)
+a.Hm=new G.ih(z,null,null)
 this.Zb(a)},
-m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,57],
-SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,101],
+TN:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
+pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
+this.FG(a)},
+FG:function(a){var z,y,x,w,v
+z=J.aT(a.oi).gqo()
 if(z==null)return
-try{a.Hm.mA(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+x=new H.oP(w,null)
+N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,102,103],
-ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,102,103],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
+Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$istV)try{w=a.Hm
 v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,104,1,105,106],
+x=new H.oP(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{"^":"B6",jD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12826,28 +13132,28 @@
 a.ev=""
 a.XX=0.0002
 a.TM="uv"
-a.WC="#tableTree"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Xg="#tableTree"
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.kS.ZL(a)
+a.n9=x
+a.wy=w
+C.kS.LX(a)
 C.kS.XI(a)
 return a}}},
-V25:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Xs:113;a",
+"^":"Xs:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,159,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,163,"call"],
+$isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{IB:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12855,19 +13161,19 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.LN.ZL(a)
+a.n9=x
+a.wy=w
+C.LN.LX(a)
 C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V26;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V28;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -12876,76 +13182,76 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OoF.ZL(a)
+a.n9=x
+a.wy=w
+C.OoF.LX(a)
 C.OoF.XI(a)
 return a}}},
-V26:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V29;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.fp(a.ow)},"$1","gX0",2,0,160,14],
-kf:[function(a,b){$.Kh.x3(a.ow)
-return J.df(a.ow)},"$1","gDQ",2,0,160,14],
-tb:[function(a,b){$.Kh.x3(a.ow)
-return J.eg(a.ow)},"$1","gLc",2,0,160,14],
-jA:[function(a,b){$.Kh.x3(a.ow)
-return J.J1(a.ow)},"$1","gqF",2,0,160,14],
-Cx:[function(a,b){$.Kh.x3(a.ow)
-return J.Fy(a.ow)},"$1","gVX",2,0,160,14],
+Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,164,13],
+kf:[function(a,b){$.Kh.pZ(a.ow)
+return J.df(a.ow)},"$1","gDQ",2,0,164,13],
+PyB:[function(a,b){$.Kh.pZ(a.ow)
+return J.UR(a.ow)},"$1","gLc",2,0,164,13],
+XQ:[function(a,b){$.Kh.pZ(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,164,13],
+Cx:[function(a,b){$.Kh.pZ(a.ow)
+return J.Fy(a.ow)},"$1","gZp",2,0,164,13],
 static:{zr:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.F2.ZL(a)
+a.n9=x
+a.wy=w
+C.F2.LX(a)
 C.F2.XI(a)
 return a}}},
-V27:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{b2:function(a){var z,y,x,w
+static:{Qj:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vi.ZL(a)
-C.Vi.XI(a)
+a.n9=x
+a.wy=w
+C.rCJ.LX(a)
+C.rCJ.XI(a)
 return a}}},
-V28:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -12954,23 +13260,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ji.ZL(a)
-C.Ji.XI(a)
+a.n9=x
+a.wy=w
+C.mb.LX(a)
+C.mb.XI(a)
 return a}}},
-V29:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
-"^":"a;Y0,WL",
+"^":"a;NK,aF",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.KJ
+z=this.NK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -12982,97 +13288,97 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V30;wd,iw,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V32;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ak:[function(a,b){var z,y,x
+o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.Gv!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
 z=a.iw
 if(z==null)return
 z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
 if(y!=null){z=a.iw
-x=z.WL
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x=z.aF
+if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
+z.aF=x}x.Am(z.NK)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.aXP.ZL(a)
+a.n9=x
+a.wy=w
+C.aXP.LX(a)
 C.aXP.XI(a)
 return a}}},
-V30:{
+V32:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+$isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;Yi,S2",
+"^":"a;KK,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.KJ
+z=this.KK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.lo
+for(y=J.mY(a.gaf());y.G();){x=y.Ff
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.mB(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+w=J.Q0(a.gaf(),"Idle")
+v=a.gvh()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
-r=y[u].OQ
+r=y[u].jf
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V31;TO,Cn,Fs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V33;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,18],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
 z=a.Cn
-if(z!=null){z.ed()
+if(z!=null){z.Gv()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.TO).YM(b)},"$1","gWp",2,0,20,101],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,160,14],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,160,14],
+pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,164,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,164,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13080,96 +13386,96 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.Fs=new L.Lr(new G.Kf(z),null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.LR=new L.Lr(new G.Kf(z),null)
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.Xe.ZL(a)
-C.Xe.XI(a)
+a.n9=w
+a.wy=v
+C.hys.LX(a)
+C.hys.XI(a)
 return a}}},
-V31:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.Fs
+y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
+v=new G.yD(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,161,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.w0(z))},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 CV:{
-"^":"Xs:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,143,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 Vq:{
-"^":"Xs:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,143,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"^":"Xs:12;a",
+$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,147,"call"],
+$isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-LE:function(a,b){var z,y,x,w,v,u,t,s
+KW:function(a,b){var z,y,x,w,v,u,t,s
 z=this.GO
-if(z.Gs(0,a))return
+if(z.tg(0,a))return
 z.h(0,a)
 for(y=J.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
 t=y.t(a,u)
 s=J.x(t)
 if(!!s.$isT8){s=C.xB.U("  ",b)
-w.vM+=s
+w.IN+=s
 s="\""+H.d(u)+"\": {\n"
-w.vM+=s
-this.LE(t,v)
+w.IN+=s
+this.KW(t,v)
 s=C.xB.U("  ",b)
-s=w.vM+=s
-w.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
-w.vM+=s
+s=w.IN+=s
+w.IN=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+w.IN+=s
 s="\""+H.d(u)+"\": [\n"
-w.vM+=s
-this.aK(t,v)
+w.IN+=s
+this.J7(t,v)
 s=C.xB.U("  ",b)
-s=w.vM+=s
-w.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-w.vM+=s
+s=w.IN+=s
+w.IN=s+"]\n"}else{s=C.xB.U("  ",b)
+w.IN+=s
 s="\""+H.d(u)+"\": "+H.d(t)
-s=w.vM+=s
-w.vM=s+"\n"}}z.Rz(0,a)},
-aK:function(a,b){var z,y,x,w,v,u
+s=w.IN+=s
+w.IN=s+"\n"}}z.Rz(0,a)},
+J7:function(a,b){var z,y,x,w,v,u
 z=this.GO
-if(z.Gs(0,a))return
+if(z.tg(0,a))return
 z.h(0,a)
 for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
 if(!!u.$isT8){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"{\n"
-this.LE(v,w)
+u=x.IN+=u
+x.IN=u+"{\n"
+this.KW(v,w)
 u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"[\n"
-this.aK(v,w)
+u=x.IN+=u
+x.IN=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
+u=x.IN+=u
+x.IN=u+"[\n"
+this.J7(v,w)
 u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
+u=x.IN+=u
+x.IN=u+"]\n"}else{u=C.xB.U("  ",b)
+x.IN+=u
+u=x.IN+=typeof v==="string"?v:H.d(v)
+x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V32;Ly,cs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V34;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13179,127 +13485,129 @@
 z=P.p9("")
 y=P.Ls(null,null,null,null)
 x=a.Ly
-z.vM=""
+z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
+new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y,x,w
+z=z.IN
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Yt.ZL(a)
+a.n9=x
+a.wy=w
+C.Yt.LX(a)
 C.Yt.XI(a)
 return a}}},
-V32:{
+V34:{
 "^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
+$isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{V4:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{rA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Z3.ZL(a)
+a.n9=x
+a.wy=w
+C.Z3.LX(a)
 C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V35;iI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.WB(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,108,109],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.iI).YM(b)},"$1","gWp",2,0,20,101],
+vV:[function(a,b){return J.aT(a.iI).cv(J.WB(J.eS(a.iI),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.iI).wM(b)},"$1","gDX",2,0,19,102],
 static:{as:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.MG.ZL(a)
-C.MG.XI(a)
+a.n9=x
+a.wy=w
+C.Bn.LX(a)
+C.Bn.XI(a)
 return a}}},
-V33:{
+V35:{
 "^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
+$isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,n2,Cj>,ks>,tg",
+"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.xC(J.O6(z),"")
+y=z==null||J.xC(J.DA(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.n2
+gOR:function(){if($.RL){var z=this.cK
 if(z!=null)return z
 z=this.eT
-if(z!=null)return z.gOR()}return $.Y4},
-sOR:function(a){if($.RL&&this.eT!=null)this.n2=a
+if(z!=null)return z.gOR()}return $.DR},
+sOR:function(a){if($.RL&&this.eT!=null)this.cK=a
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
-$.Y4=a}},
-gSZ:function(){return this.tQ()},
+$.DR=a}},
+gSZ:function(){return this.qX()},
 mL:function(a){return a.P>=this.gOR().P},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
+if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.AG(b)
+z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
 x=$.xO
 $.xO=x+1
 w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){v.cB(w)
-v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
-Ny:function(a){return this.TF(a,null,null)},
-ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZW(a,null,null)},
-wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.wF(a,null,null)},
+if($.RL)for(v=this;v!=null;){v.js(w)
+v=J.Lp(v)}else N.QM("").js(w)}},
+X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
+kS:function(a){return this.X2A(a,null,null)},
+Da:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.Da(a,null,null)},
+DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.DH(a,null,null)},
+r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.r0(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
 YX:function(a){return this.WB(a,null,null)},
-tQ:function(){if($.RL||this.eT==null){var z=this.tg
+qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.tg=z}z.toString
-return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").tQ()},
-cB:function(a){var z=this.tg
-if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)}},
+this.z3=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
+js:function(a){var z=this.z3
+if(z!=null){if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)}},
 QL:function(a,b,c){var z=this.eT
-if(z!=null)J.Tr(z).u(0,this.oc,this)},
+if(z!=null)J.jd(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"Xs:74;a",
+"^":"Xs:76;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 '.'"))
@@ -13307,7 +13615,7 @@
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.xB.Nj(z,0,y))
 z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
+v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
 v.QL(z,x,w)
 return v},
 $isEH:true},
@@ -13331,44 +13639,44 @@
 if(typeof z!=="number")return H.s(z)
 return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gAY",0,0,71],
+bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gAY",0,0,71],
+"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
 $isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
+static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e471())
+N.QM("").gSZ().yI(new F.e486())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"google")
+z=J.UQ($.Xw(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e472())},
-e471:{
-"^":"Xs:163;",
+$.Ib().MM.ml(G.vN()).ml(new F.e487())},
+e486:{
+"^":"Xs:167;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.wo(z.gG1(a),"Can't assign to null: ")===!0||J.wo(z.gG1(a),"Expression is not assignable: ")===!0
+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.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,162,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,166,"call"],
 $isEH:true},
-e472:{
-"^":"Xs:13;",
+e487:{
+"^":"Xs:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V34;i4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V36;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -13378,28 +13686,28 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.kD.ZL(a)
+a.n9=x
+a.wy=w
+C.kD.LX(a)
 C.kD.XI(a)
 return a}}},
-V34:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V35;KU,V4,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V37;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
+gwp:function(a){return a.V4},
+swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJm:function(a){var z,y,x,w
+static:{yU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13408,26 +13716,26 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.IG.ZL(a)
+a.n9=x
+a.wy=w
+C.IG.LX(a)
 C.IG.XI(a)
 return a}}},
-V35:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V36;KU,V4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V38;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{vn:function(a){var z,y,x,w
+gwp:function(a){return a.V4},
+swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
+static:{JR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13435,75 +13743,75 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Nk.ZL(a)
+a.n9=x
+a.wy=w
+C.Nk.LX(a)
 C.Nk.XI(a)
 return a}}},
-V36:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V37;rU,SB,z2,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V39;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gFR:function(a){return a.rU},
 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)},
 gjl:function(a){return a.SB},
 sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Kp:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.Hq},
+sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
+VV:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,114,1,105,106],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,115,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
+static:{wC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.z2="Refresh"
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.Hq="Refresh"
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Y6.ZL(a)
-C.Y6.XI(a)
+a.n9=x
+a.wy=w
+C.J7.LX(a)
+C.J7.XI(a)
 return a}}},
-V37:{
+V39:{
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-static:{W1:function(a){var z,y,x,w
+"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.br.ZL(a)
+a.n9=x
+a.wy=w
+C.br.LX(a)
 C.br.XI(a)
 return a}}},
 G1:{
-"^":"V38;Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V40;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{Br:function(a){var z,y,x,w
@@ -13513,26 +13821,26 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.OKl.ZL(a)
+a.n9=x
+a.wy=w
+C.OKl.LX(a)
 C.OKl.XI(a)
 return a}}},
-V38:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V39;Jo,iy,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V41;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,57],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13544,47 +13852,47 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.RRl.ZL(a)
+a.n9=x
+a.wy=w
+C.RRl.LX(a)
 C.RRl.XI(a)
 return a}}},
-V39:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V40;VW,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V42;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{Qj:function(a){var z,y,x,w
+static:{IV:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.S3.ZL(a)
-C.S3.XI(a)
+a.n9=x
+a.wy=w
+C.ctm.LX(a)
+C.ctm.XI(a)
 return a}}},
-V40:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V41;Au,Jo,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V43;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -13596,21 +13904,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.HR.ZL(a)
-C.HR.XI(a)
+a.n9=x
+a.wy=w
+C.ic.LX(a)
+C.ic.XI(a)
 return a}}},
-V41:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V42;rv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V44;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 static:{Xii:function(a){var z,y,x,w
@@ -13619,58 +13927,58 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Mn.ZL(a)
+a.n9=x
+a.wy=w
+C.Mn.LX(a)
 C.Mn.XI(a)
 return a}}},
-V42:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V43;rv,Wx,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V45;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-kf:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,160,14],
-tb:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.eg(J.aT(a.Wx))},"$1","gLc",2,0,160,14],
-jA:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.J1(J.aT(a.Wx))},"$1","gqF",2,0,160,14],
-Cx:[function(a,b){$.Kh.x3(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gVX",2,0,160,14],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,164,1,105,106],
-static:{yno:function(a){var z,y,x,w
+kf:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,164,13],
+PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,164,13],
+XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,164,13],
+Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,164,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,168,2,106,107],
+static:{zC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.L88.ZL(a)
-C.L88.XI(a)
+a.n9=x
+a.wy=w
+C.L8.LX(a)
+C.L8.XI(a)
 return a}}},
-V43:{
+V45:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
+$isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V44;qC,i6=,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V46;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gz2:function(a){return a.qC},
+sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
 if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.ch(null,D.Mk),null,null)
@@ -13678,122 +13986,128 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.V3("targetManager"),Q.ch(null,null),null,null,null,null)
-x.Ff()
+x.lK()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+static:{JT8:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.YpE.ZL(a)
-C.YpE.XI(a)
+a.n9=x
+a.wy=w
+C.k0.LX(a)
+C.k0.XI(a)
 return a}}},
-V44:{
+V46:{
 "^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
+$isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gi6:function(a){return $.Kh},
-gKw:function(a){return J.pP(this.gi6(a).Ef)},
+gl6:function(a){return J.D8(this.gi6(a).fN)},
 Es:function(a){A.zs.prototype.Es.call(this,a)
-this.Tt(a)},
+this.U2(a)},
 wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)
-this.Q4(a)},
-e1:function(a){A.zs.prototype.e1.call(this,a)},
+Lx:function(a){A.zs.prototype.Lx.call(this,a)
+this.yM(a)},
+I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
-Lq:[function(a,b){if(a.tB!=null)this.Tt(a)
-else this.Q4(a)},"$1","gj8",2,0,20,57],
-Tt:function(a){var z
+uc:[function(a,b){if(a.tB!=null)this.U2(a)
+else this.yM(a)},"$1","grX",2,0,19,59],
+U2:function(a){var z
 if(a.tB==null)return
-z=a.kR
-if(z!=null)z.ed()
-a.kR=P.rT(a.tB,this.gwZ(a))},
-Q4:function(a){var z=a.kR
-if(z!=null)z.ed()
-a.kR=null},
-Lu:[function(a){var z
+z=a.Qf
+if(z!=null)z.Gv()
+a.Qf=P.cH(a.tB,this.gPs(a))},
+yM:function(a){var z=a.Qf
+if(z!=null)z.Gv()
+a.Qf=null},
+Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,18],
-wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gRh",6,0,164,2,105,106],
-KN:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,165,166],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,167,168],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-Kq:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,135,21],
-z4:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,169,170],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,169,170],
-OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,169,170],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,169,170],
-KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,169,170],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,169,170],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,169,170],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,169,170],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,169,170],
-Dz:[function(a,b){return!C.Nm.Gs(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,169,170],
-static:{EE:function(a){var z,y,x,w
+if(z==null){this.yM(a)
+return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,168,87,106,107],
+XD:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gGs",2,0,169,170],
+Qb:[function(a,b){return G.mG(b)},"$1","gSs",2,0,171,172],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,139,20],
+z4:[function(a,b){return b!=null&&J.xC(b.gzS(),"Null")&&J.xC(J.eS(b),"objects/null")},"$1","gHh",2,0,93,173],
+zi:[function(a,b){return b!=null&&J.xC(b.gzS(),"Null")&&!J.xC(J.eS(b),"objects/null")},"$1","gIt",2,0,93,173],
+uL:[function(a,b){return b!=null&&J.xC(b.gzS(),"Error")},"$1","gt3",2,0,93,173],
+wS:[function(a,b){var z
+if(b!=null)z=J.xC(b.gzS(),"Smi")||J.xC(b.gzS(),"Mint")||J.xC(b.gzS(),"Bigint")
+else z=!1
+return z},"$1","gWL",2,0,93,173],
+RU:[function(a,b){return b!=null&&J.xC(b.gzS(),"Bool")},"$1","gFY",2,0,93,173],
+T1:[function(a,b){return b!=null&&J.xC(b.gzS(),"String")},"$1","gu7",2,0,93,173],
+wm:[function(a,b){return b!=null&&J.xC(b.gzS(),"Instance")},"$1","gNs",2,0,93,173],
+Lb:[function(a,b){return b!=null&&J.xC(b.gzS(),"Double")},"$1","gzx",2,0,93,173],
+qc:[function(a,b){var z
+if(b!=null)z=J.xC(b.gzS(),"GrowableObjectArray")||J.xC(b.gzS(),"Array")
+else z=!1
+return z},"$1","gK4",2,0,93,173],
+tR:[function(a,b){return b!=null&&J.xC(b.gzS(),"Type")},"$1","gqN",2,0,93,173],
+AC:[function(a,b){if(b==null)return!1
+return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b.gzS())},"$1","geS",2,0,93,173],
+static:{ew:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Pfz.ZL(a)
+a.n9=x
+a.wy=w
+C.Pfz.LX(a)
 C.Pfz.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
-$isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
 Ap:{
 "^":"a;",
 sP:function(a,b){},
 fR:function(){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isAp:true}}],["","",,O,{
 "^":"",
 Pi:{
 "^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
+gqh:function(a){var z=a.Vg
+if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
-a.AP=z}z.toString
+a.Vg=z}z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-Tr:[function(a){},"$0","gqw",0,0,18],
-dt:[function(a){a.AP=null},"$0","gym",0,0,18],
+w37:[function(a){},"$0","gcm",0,0,17],
+dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
-if(this.gnz(a)&&z!=null){y=a.AP
+if(this.gnz(a)&&z!=null){y=a.Vg
 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,123],
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(x)
+return!0}return!1},"$0","gDx",0,0,125],
 gnz:function(a){var z,y
-z=a.AP
+z=a.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
@@ -13801,15 +14115,15 @@
 nq:function(a,b){if(!this.gnz(a))return
 if(a.fn==null){a.fn=[]
 P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
+$isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
 $isyj:true},
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
+bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
+$isqI:true}}],["","",,O,{
 "^":"",
 J8:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
@@ -13829,7 +14143,7 @@
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
 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))+".")}}$.Nc=$.Oo.length
 $.Td=!1},
@@ -13838,37 +14152,37 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"Xs:171;a",
+"^":"Xs:174;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.N0(z))},
 $isEH:true},
 N0:{
-"^":"Xs:74;a",
+"^":"Xs:76;a",
 $0:[function(){this.a.a=!1
 O.J8()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Xs:30;b",
+"^":"Xs:29;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 HF:{
-"^":"Xs:74;c,d,e,f",
+"^":"Xs:76;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"Xs:172;UI",
+"^":"Xs:175;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 iu:{
-"^":"Xs:13;bK,Gq,Rm,w3",
+"^":"Xs:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,173,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+return this.w3.$1(a)},"$1",null,2,0,null,176,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
@@ -13886,26 +14200,26 @@
 if(t>=u.length)return H.e(u,t)
 u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
 p=J.xC(d[q],s.t(a,J.Hn(u.g(b,t),1)))
-o=x[v]
-n=x[r]
+o=x[r]
+n=x[v]
 m=t-1
 if(p){if(v>=w)return H.e(x,v)
 if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
+if(m>=o.length)return H.e(o,m)
+p=o[m]
 if(t>=n.length)return H.e(n,t)
-p=n[t]
+n[t]=p}else{if(r>=w)return H.e(x,r)
+if(t>=o.length)return H.e(o,t)
+p=o[t]
 if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
+o=n.length
+if(m>=o)return H.e(n,m)
+m=n[m]
 if(typeof m!=="number")return m.g()
 m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
+if(t>=o)return H.e(n,t)
+n[t]=m}}return x},
 kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -13940,7 +14254,7 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
 rN:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
@@ -13970,39 +14284,39 @@
 if(J.xC(b,c)){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
+t=new G.Zq(a,z,u,b,0)
+for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
 J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
 x=new P.Yp(u)
 x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
 q=[]
-q.$builtinTypeInfo=[G.DA]
+q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.WB(t.Ld,1)
+t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
-z=t.em
+z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
 J.bi(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.WB(t.Ld,1)
+t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
 z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
+t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
 J.bi(z,d[p]);++p
 break}if(t!=null)q.push(t)
@@ -14011,52 +14325,52 @@
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.Nd(b.gem())
+x=J.Nd(b.gkJ())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
 v.$builtinTypeInfo=[null]
-u=new G.DA(y,v,x,z,w)
+u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
 q.Ft=J.WB(q.Ft,s)
 if(t)continue
 z=u.Ft
-y=J.WB(z,u.VD.G4.length)
+y=J.WB(z,u.HD.G4.length)
 x=q.Ft
-p=P.J(y,J.WB(x,q.Ld))-P.y(z,x)
+p=P.J(y,J.WB(x,q.wF))-P.y(z,x)
 if(p>=0){C.Nm.W4(a,r);--r
-z=J.Hn(q.Ld,q.VD.G4.length)
+z=J.Hn(q.wF,q.HD.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
-z=J.WB(u.Ld,J.Hn(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
+z=J.WB(u.wF,J.Hn(q.wF,p))
+u.wF=z
+y=u.HD.G4.length
+x=q.HD.G4.length
 if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.Hn(q.Ft,u.Ft))
+else{o=q.kJ
+if(J.u6(u.Ft,q.Ft)){z=u.HD
+z=z.Yc(z,0,J.Hn(q.Ft,u.Ft))
 o.toString
 if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.WB(u.Ft,u.VD.G4.length),J.WB(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.Hn(J.WB(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
+H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
+J.bj(o,z.Yc(z,J.Hn(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
 t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.Hn(u.Ld,u.VD.G4.length)
+n=J.Hn(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
 hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
+z=H.VM([],[G.Zq])
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.ao;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XH;y.G();){w=y.Ff
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -14064,45 +14378,45 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.xC(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.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"yj;WA>,VD,em<,Ft,Ld",
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().G4.length))}return z},
+Zq:{
+"^":"yj;WA>,HD,kJ<,Ft,wF",
 gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-ck:function(a){var z
+gRt:function(){return this.HD},
+gNg:function(){return this.wF},
+vP:function(a){var z
 if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
 if(typeof z!=="number")return H.s(z)
 z=a<z}else z=!0
 if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.WB(this.Ft,this.Ld))},
+if(!J.xC(this.wF,this.HD.G4.length))return!0
+return J.u6(a,J.WB(this.Ft,this.wF))},
 bu:[function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,71],
-$isDA:true,
+y=this.HD
+return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+$isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
 z=new P.Yp(d)
 z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
+return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
-nd:{
+iv:{
 "^":"a;"},
 vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
+"^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.J8()},"$0","Jy",0,0,18],
+kM:[function(){return O.J8()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,V2:dUC%,me:U3%",
+"^":"a;R9:ro%,rJ:XY%,xt:cU%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
+this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
@@ -14116,57 +14430,57 @@
 $.Oo=z}z.push(a)
 $.Nc=$.Nc+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().fK(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().H6.II.t(0,x)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
+w=$.cp().JE.II.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
+y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
+dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
+if(this.grJ(a)==null||!this.gnz(a))return!1
+z.a=this.gxt(a)
+this.sxt(a,null)
+this.grJ(a).aN(0,new F.X6(z,a))
 if(z.a==null)return!1
 y=this.gR9(a)
 z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
+if(this.gxt(a)==null)this.sxt(a,[])
+this.gxt(a).push(b)},
 $isd3:true},
 X6:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().Tv(z,a)
+y=$.cp().Gp(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
+J.Zh(z).u(0,a,y)}},
+$isEH:true}}],["","",,A,{
 "^":"",
 xhq:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.zdr,this.DA,b)},
-bu:[function(a){return"#<"+new H.cu(H.wO(this),null).bu(0)+" value: "+H.d(this.DA)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:function(a){return this.Xq},
+sP:function(a,b){this.Xq=F.Wi(this,C.zdr,this.Xq,b)},
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
+"^":"uFU;lr@,Mu,XH,Vg,fn",
+gXF:function(){var z=this.Mu
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
-this.iT=z}z.toString
+this.Mu=z}z.toString
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gB:function(a){return this.ao.length},
+gB:function(a){return this.XH.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.ao
+z=this.XH
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -14174,79 +14488,82 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.iT
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
+if(x)if(b<y){x=new H.wb()
+x.$builtinTypeInfo=[H.u3(z,0)]
+if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
+w=new H.bX(z,b,y)
+w.$builtinTypeInfo=[H.u3(x,0)]
 if(b<0)H.vh(P.N(b))
 if(y<0)H.vh(P.N(y))
 if(b>y)H.vh(P.TE(b,0,y))
-x=x.br(0)
+x=w.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
+this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
 x=new P.Yp(v)
 x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
+this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.ao
+z=this.XH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.iT
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
 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)
+this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
-Yj:function(a,b,c){var z,y,x
+Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.iT
+z=this.Mu
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
+if(z&&y>0){z=this.XH
+x=H.VM(new H.wb(),[H.u3(z,0)])
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.na(this.ao,b,c)},
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XH,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
-this.On(y,y+1)
-x=this.iT
+this.Xy(y,y+1)
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
+if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.ao
+z=this.XH
 y=z.length
 C.Nm.FV(z,b)
-this.On(y,z.length)
+this.Xy(y,z.length)
 x=z.length-y
-z=this.iT
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
+if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.UZ(0,y,y+1)
+for(z=this.XH,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
-UZ:function(a,b,c){var z,y,x,w,v,u,t
+oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XH.length)H.vh(P.TE(b,0,this.gB(this)))
 y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XH.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.XH
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -14254,77 +14571,79 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.iT
+u=this.Mu
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
+if(u&&x>0){u=new H.wb()
+u.$builtinTypeInfo=[H.u3(w,0)]
+if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
 z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[null]
+z.$builtinTypeInfo=[H.u3(u,0)]
 if(b<0)H.vh(P.N(b))
 if(c<0)H.vh(P.N(c))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-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)))
+this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
+UG:function(a,b,c){var z,y,x,w
+if(b<0||b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.XH
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.na(z,b,c)
-this.On(x,z.length)
-z=this.iT
+H.h8(z,b,c)
+this.Xy(x,z.length)
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
+if(z&&y>0)this.E2(G.K6(this,b,y,null))},
 xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
+if(b>this.XH.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XH
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
 y=z.length
 H.qG(z,b+1,y,this,b)
 y=z.length
-this.On(y-1,y)
-y=this.iT
+this.Xy(y-1,y)
+y=this.Mu
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
+if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
-iH:function(a){var z,y
-z=this.iT
+E2:function(a){var z,y
+z=this.Mu
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
+if(this.lr==null){this.lr=[]
+P.rb(this.gL6())}this.lr.push(a)},
+Xy:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=b===0
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
-Ju:[function(){var z,y,x
-z=this.b3
+oCy:[function(){var z,y,x
+z=this.lr
 if(z==null)return!1
 y=G.Qi(this,z)
-this.b3=null
-z=this.iT
+this.lr=null
+z=this.Mu
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,123],
+if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.Zq])
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(x)
+return!0}return!1},"$0","gL6",0,0,125],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -14333,7 +14652,7 @@
 w=J.RE(x)
 v=J.WB(w.gvH(x),x.gNg())
 u=J.WB(w.gvH(x),x.gRt().G4.length)
-t=y.Mu(b,w.gvH(x),v)
+t=y.Yc(b,w.gvH(x),v)
 w=w.gvH(x)
 s=J.Wx(w)
 if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
@@ -14361,67 +14680,67 @@
 "^":"ark+Pi;",
 $isd3:true},
 xb:{
-"^":"Xs:74;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
+"^":"Xs:76;a",
+$0:function(){this.a.Mu=null},
+$isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;G3>,jL,zZ,aC,w5",
+"^":"yj;nl>,jL,zZ,aC,w5",
 bu:[function(a){var z
 if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
+return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(a){var z=this.Zp
+"^":"Pi;LL,Vg,fn",
+gvc:function(a){var z=this.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.Zp
+gUQ:function(a){var z=this.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.Zp
+gB:function(a){var z=this.LL
 return z.gB(z)},
-gl0:function(a){var z=this.Zp
+gl0:function(a){var z=this.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.Zp
+gor:function(a){var z=this.LL
 return z.gB(z)!==0},
-x4:function(a,b){return this.Zp.x4(0,b)},
-t:function(a,b){return this.Zp.t(0,b)},
+NZ:function(a,b){return this.LL.NZ(0,b)},
+t:function(a,b){return this.LL.t(0,b)},
 u:function(a,b,c){var z,y,x,w
-z=this.AP
+z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
+if(!z){this.LL.u(0,b,c)
+return}z=this.LL
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
 if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
 this.nq(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
-this.G8()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
+this.ld()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.Zp
+z=this.LL
 y=z.gB(z)
 x=z.Rz(0,b)
-w=this.AP
+w=this.Vg
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.ya(b,x,null,!1,!0),[null,null]))
 F.Wi(this,C.Wn,y,z.gB(z))
-this.G8()}return x},
+this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.Zp
+z=this.LL
 y=z.gB(z)
-x=this.AP
+x=this.Vg
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
-this.G8()}z.V1(0)},
-aN:function(a,b){return this.Zp.aN(0,b)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
-G8:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
+this.ld()}z.V1(0)},
+aN:function(a,b){return this.LL.aN(0,b)},
+bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
 $isqC:true,
 $isT8:true,
@@ -14433,42 +14752,42 @@
 return y}}},
 zT:{
 "^":"Xs;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
+$isEH:true}}],["","",,Y,{
 "^":"",
-Qw:{
-"^":"Ap;R7,OW,Oy,Ew,A2",
-HW:function(a){return this.OW.$1(a)},
-WM:function(a){return this.Ew.$1(a)},
+Wa:{
+"^":"Ap;Os,he,mD,Wv,XS",
+bl:function(a){return this.he.$1(a)},
+xq:function(a){return this.Wv.$1(a)},
 TR:function(a,b){var z
-this.Ew=b
-z=this.HW(J.mu(this.R7,this.gWz()))
-this.A2=z
+this.Wv=b
+z=this.bl(J.mu(this.Os,this.gYZ()))
+this.XS=z
 return z},
-fOr:[function(a){var z=this.HW(a)
-if(J.xC(z,this.A2))return
-this.A2=z
-return this.WM(z)},"$1","gWz",2,0,13,58],
-xO:function(a){var z=this.R7
+pN:[function(a){var z=this.bl(a)
+if(J.xC(z,this.XS))return
+this.XS=z
+return this.xq(z)},"$1","gYZ",2,0,12,60],
+xO:function(a){var z=this.Os
 if(z!=null)J.yd(z)
-this.R7=null
-this.OW=null
-this.Oy=null
-this.Ew=null
-this.A2=null},
-gP:function(a){var z=this.HW(J.Vm(this.R7))
-this.A2=z
+this.Os=null
+this.he=null
+this.mD=null
+this.Wv=null
+this.XS=null},
+gP:function(a){var z=this.bl(J.Vm(this.Os))
+this.XS=z
 return z},
-sP:function(a,b){J.ta(this.R7,b)},
-fR:function(){return this.R7.fR()}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.Os,b)},
+fR:function(){return this.Os.fR()}}}],["","",,L,{
 "^":"",
-Hj:function(a,b){var z,y,x,w,v
+yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
 z=b
 if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{z=b
@@ -14477,16 +14796,16 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
-z=y&&!C.Nm.Gs(C.Zw,b)}else z=!0
-if(z)return J.UQ(a,$.Mg().H6.af.t(0,b))
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z)return J.UQ(a,$.Mg().JE.af.t(0,b))
 try{z=a
 y=b
-x=$.cp().H6.II.t(0,y)
+x=$.cp().JE.II.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.XK(a)
-v=$.mX().aR(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.VND()
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
+v=$.mX().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
 EX:function(a,b,c){var z,y,x
@@ -14497,65 +14816,65 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
-z=y&&!C.Nm.Gs(C.Zw,b)}else z=!0
-if(z){J.kW(a,$.Mg().H6.af.t(0,b),c)
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z){J.kW(a,$.Mg().JE.af.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.XK(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.VND()
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"lg;HS,XF,xE,GX,D2,Wf,KZ",
+"^":"lg;HS,Lq,IE,zo,dR,vS,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
+if(z!=null)z.rL(this.Lq,b)},
+gDJ:function(){return 2},
 TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
-qc:function(a){this.xE=L.BH(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
+Ej:function(a){this.IE=L.SE(this,this.Lq)
+this.CG(!0)},
+U9:function(){this.vS=null
 this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
+this.Lq=null},
+VC:function(a){this.HS.I5(this.Lq,a)},
+CG:function(a){var z,y
+z=this.vS
+y=this.HS.WK(this.Lq)
+this.vS=y
 if(a||J.xC(y,z))return!1
-this.Aw(this.Wf,z,this)
+this.vk(this.vS,z,this)
 return!0},
-tF:function(){return this.hQ(!1)},
+mX:function(){return this.CG(!1)},
 $isAp:true},
 Zl:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
+"^":"a;T7",
+gB:function(a){return this.T7.length},
+gl0:function(a){return this.T7.length===0},
 gPu:function(){return!0},
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.OK,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
 v=J.x(w)
-if(!!v.$isIN){if(!x)z.vM+="."
-u=$.Mg().H6.af.t(0,w)
-z.vM+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.vM+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
-z.vM+=v}}return z.vM},"$0","gAY",0,0,71],
+if(!!v.$isIN){if(!x)z.IN+="."
+u=$.Mg().JE.af.t(0,w)
+z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
+z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
+z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.OK
+z=this.T7
 y=z.length
-x=b.OK
+x=b.T7
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.OK,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.T7,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -14563,29 +14882,29 @@
 x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
 x^=x>>>11
 return 536870911&x+((16383&x)<<15>>>0)},
-Tl:function(a){var z,y
+WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(a==null)return
-a=L.Hj(a,y)}return a},
+a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.OK
+z=this.T7
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
+a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
 return L.EX(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
+I5:function(a,b){var z,y,x,w
+if(!this.gPu()||this.T7.length===0)return
+z=this.T7
 y=z.length-1
 for(x=0;a!=null;x=w){if(0>=z.length)return H.e(z,0)
 b.$2(a,z[0])
 if(x>=y)break
 w=x+1
 if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
+a=L.yfW(a,z[x])}},
 $isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
@@ -14596,12 +14915,12 @@
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.lo
+for(;z.G();){x=z.Ff
 if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.hW()
 w=z.t(0,a)
 if(w!=null)return w
 v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.Js()
+if(v==null)return $.lf()
 w=new L.Zl(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
@@ -14609,19 +14928,19 @@
 if(!t.G())H.vh(H.DU())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
-TV:{
-"^":"Zl;OK",
+vH:{
+"^":"Zl;T7",
 gPu:function(){return!1},
-static:{"^":"qa"}},
-lPa:{
-"^":"Xs:74;",
+static:{"^":"l7"}},
+DOe:{
+"^":"Xs:76;",
 $0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
 iF:{
-"^":"a;vc>,vH>,G3>,tq",
-T2:function(a){var z
+"^":"a;vc>,vH>,nl>,ep",
+Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -14629,202 +14948,203 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-PS:function(){var z,y,x,w
-z=this.G3
+ZW:function(){var z,y,x,w
+z=this.nl
 if(z==null)return
-z=$.Gx().zD(z)
+z=$.cx().B0(z)
 y=this.vc
-x=this.G3
-if(z)y.push($.Mg().H6.NU.t(0,x))
+x=this.nl
+if(z)y.push($.Mg().JE.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
-y.push(w!=null?w:this.G3)}this.G3=null},
-mx:function(a,b){var z=this.G3
-this.G3=z==null?b:H.d(z)+H.d(b)},
-YD:function(a,b){var z,y,x
+y.push(w!=null?w:this.nl)}this.nl=null},
+mx:function(a,b){var z=this.nl
+this.nl=z==null?b:H.d(z)+H.d(b)},
+lA:function(a,b){var z,y,x
 z=this.vH
 y=b.length
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.LY([z])
+x=H.eT([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
-z=this.G3
-this.G3=z==null?x:H.d(z)+x
+z=this.nl
+this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q
-z=U.Fa(J.Ii(a),0,null,65533)
-for(y=z.length,x="beforePath";!0;){w=++this.vH
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=U.dZr(J.OX(a),0,null,65533)
+for(y=z.length,x="beforePath";x!=null;){w=++this.vH
 if(w>=y)v=null
 else{if(w<0)return H.e(z,w)
-v=z[w]}if(v!=null)w=H.LY([v])==="\\"&&this.YD(x,z)
+v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.lA(x,z)
 else w=!1
 if(w)continue
-u=this.T2(v)
-if(x==="error")return
-t=this.tq.t(0,x)
+u=this.Xn(v)
+if(J.xC(x,"error"))return
+t=this.ep.t(0,x)
 s=t.t(0,u)
 if(s==null)s=t.t(0,"else")
 if(s==null)return
-w=s.length
-if(0>=w)return H.e(s,0)
-x=s[0]
-r=w>1?s[1]:null
-if(r==="push"&&this.G3!=null)this.PS()
-if(r==="append"){w=s.length
-if(w>2&&!0){if(2>=w)return H.e(s,2)
-q=s[2]}else q=H.LY([v])
-w=this.G3
-this.G3=w==null?q:H.d(w)+q}if(x==="afterPath")return this.vc}return}},
+w=J.U6(s)
+x=w.t(s,0)
+r=w.gB(s)>1?w.t(s,1):null
+q=J.x(r)
+if(q.n(r,"push")&&this.nl!=null)this.ZW()
+if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
+q=!0}else q=!1
+if(q)p=w.t(s,2)
+else p=H.eT([v])
+w=this.nl
+this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
 PD:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return},
 $isEH:true},
-ww:{
-"^":"lg;xE,DT,VZ,GX,D2,Wf,KZ",
-gIn:function(){return 3},
+bg:{
+"^":"lg;IE,pu,vl,zo,dR,vS,KZ",
+gDJ:function(){return 3},
 TR:function(a,b){return L.lg.prototype.TR.call(this,this,b)},
-qc:function(a){var z,y,x,w
-for(z=this.VZ,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.aZ){z=$.xG
-if(z!=null){y=z.kTd
+Ej:function(a){var z,y,x,w
+for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.rf
+if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=w==null?null:P.Ls(null,null,null,null)
-z=new L.zG(w,z,[],null)
-$.xG=z}if(z.kTd==null){z.kTd=w
-z.Fw=P.Ls(null,null,null,null)}z.JD.push(this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}this.hQ(!this.DT)},
-kH:function(){var z,y,x,w
-for(z=0;y=this.VZ,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
+z=new L.Og(w,z,[],null)
+$.rf=z}if(z.Ou==null){z.Ou=w
+z.cE=P.Ls(null,null,null,null)}z.JD.push(this)
+this.VC(z.gUu(z))
+this.IE=null
+break}}this.CG(!this.pu)},
+U9:function(){var z,y,x,w
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
 if(w>=x)return H.e(y,w)
-J.yd(y[w])}this.VZ=null
-this.Wf=null},
-yN:function(a,b){var z=this.KZ
+J.yd(y[w])}this.vl=null
+this.vS=null},
+WX:function(a,b){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
-z=this.VZ
+z=this.vl
 z.push(a)
 z.push(b)
-if(!this.DT)return
-J.bi(this.Wf,b.Tl(a))},
-ti:function(a){return this.yN(a,null)},
-Qs:function(a){var z=this.KZ
+if(!this.pu)return
+J.bi(this.vS,b.WK(a))},
+ti:function(a){return this.WX(a,null)},
+YU:function(a){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Cannot add observers once started."))
-z=this.VZ
+z=this.vl
 z.push(C.aZ)
 z.push(a)
-if(!this.DT)return
-J.bi(this.Wf,J.mu(a,new L.Zu(this)))},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.VZ,x=y.length,z<x;z+=2){w=y[z]
+if(!this.pu)return
+J.bi(this.vS,J.mu(a,new L.bjd(this)))},
+VC:function(a){var z,y,x,w,v
+for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.VZ.length,2))
-for(z=!1,y=null,x=0;w=this.VZ,v=w.length,x<v;x+=2){u=w[x]
+H.Go(y[v],"$isZl").I5(w,a)}}},
+CG:function(a){var z,y,x,w,v,u,t,s,r
+J.wg(this.vS,C.jn.BU(this.vl.length,2))
+for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
 if(u===C.aZ){H.Go(s,"$isAp")
-r=this.KZ===$.jq?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isZl").Tl(u)
-if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
-continue}w=this.Wf
-v=C.jn.cU(x,2)
+r=this.KZ===$.FU?s.TR(0,new L.Xu(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
+if(a){J.kW(this.vS,C.jn.BU(x,2),r)
+continue}w=this.vS
+v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.D2
+w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
+y.u(0,v,J.UQ(this.vS,v))}J.kW(this.vS,v,r)
 z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
+this.vk(this.vS,y,w)
 return!0},
-tF:function(){return this.hQ(!1)},
+mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
-"^":"Xs:13;a",
+bjd:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.SG()
-return},"$1",null,2,0,null,14,"call"],
+if(z.KZ===$.ljh)z.fl()
+return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-cmp:{
-"^":"Xs:13;a",
+Xu:{
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.SG()
-return},"$1",null,2,0,null,14,"call"],
+if(z.KZ===$.ljh)z.fl()
+return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 lg:{
 "^":"Ap;",
-c8:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-rF:function(a,b){return this.GX.$2(a,b)},
-uC:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8:function(){return this.KZ===$.ljh},
+Yd:function(){return this.zo.$0()},
+d1:function(a){return this.zo.$1(a)},
+qk:function(a,b){return this.zo.$2(a,b)},
+Tu:function(a,b,c){return this.zo.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ljh},
 TR:function(a,b){var z=this.KZ
 if(z===$.ljh||z===$.zk)throw H.b(P.w("Observer has already been opened."))
-if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.D2=P.J(this.gIn(),X.RI(b))
-this.qc(0)
+if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.zo=b
+this.dR=P.J(this.gDJ(),X.aW(b))
+this.Ej(0)
 this.KZ=$.ljh
-return this.Wf},
-gP:function(a){this.hQ(!0)
-return this.Wf},
+return this.vS},
+gP:function(a){this.CG(!0)
+return this.vS},
 xO:function(a){if(this.KZ!==$.ljh)return
-this.kH()
-this.Wf=null
-this.GX=null
+this.U9()
+this.vS=null
+this.zo=null
 this.KZ=$.zk},
-fR:function(){if(this.KZ===$.ljh)this.SG()},
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.D2){case 0:this.c8()
+fR:function(){if(this.KZ===$.ljh)this.fl()},
+fl:function(){var z=0
+while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
+vk:function(a,b,c){var z,y,x,w
+try{switch(this.dR){case 0:this.Yd()
 break
-case 1:this.K0(a)
+case 1:this.d1(a)
 break
-case 2:this.rF(a,b)
+case 2:this.qk(a,b)
 break
-case 3:this.uC(a,b,c)
+case 3:this.Tu(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}}},
-zG:{
-"^":"a;kTd,Fw,JD,rS",
-HF:[function(a,b,c){var z=this.kTd
-if(b==null?z==null:b===z)this.Fw.h(0,c)
+Og:{
+"^":"a;Ou,cE,JD,YR",
+zJ:[function(a,b,c){var z=this.Ou
+if(b==null?z==null:b===z)this.cE.h(0,c)
 z=J.x(b)
-if(!!z.$iswn)this.kl(b.gQV())
-if(!!z.$isd3)this.kl(z.gqh(b))},"$2","gTT",4,0,174,95,175],
-kl:function(a){var z=this.rS
+if(!!z.$iswn)this.hr(b.gXF())
+if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,177,96,178],
+hr:function(a){var z=this.YR
 if(z==null){z=P.YM(null,null,null,null,null)
-this.rS=z}if(!z.x4(0,a))this.rS.u(0,a,a.yI(this.gCP()))},
+this.YR=z}if(!z.NZ(0,a))this.YR.u(0,a,a.yI(this.gCP()))},
 b2:function(a){var z,y,x,w
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.x(y)
-if(!!x.$isqI){if(y.WA!==this.kTd||this.Fw.Gs(0,y.oc))return!1}else if(!!x.$isDA){x=y.WA
-w=this.kTd
-if((x==null?w!=null:x!==w)||this.Fw.Gs(0,y.Ft))return!1}else return!1}return!0},
-t9:[function(a){var z,y,x
+if(!!x.$isqI){if(y.WA!==this.Ou||this.cE.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
+w=this.Ou
+if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
+F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-if(x.ga8())x.nf(this.gTT(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
-if(x.ga8())x.tF()}},"$1","gCP",2,0,20,176],
-static:{"^":"xG",BH:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.kTd
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
+if(x.gB9())x.mX()}},"$1","gCP",2,0,19,179],
+static:{"^":"rf",SE:function(a,b){var z,y
+z=$.rf
+if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=b==null?null:P.Ls(null,null,null,null)
-z=new L.zG(b,z,[],null)
-$.xG=z}if(z.kTd==null){z.kTd=b
-z.Fw=P.Ls(null,null,null,null)}z.JD.push(a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+z=new L.Og(b,z,[],null)
+$.rf=z}if(z.Ou==null){z.Ou=b
+z.cE=P.Ls(null,null,null,null)}z.JD.push(a)
+a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
@@ -14834,11 +15154,11 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
+return x}return a},"$1","Ft",2,0,12,20],
 Qe:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
+"^":"Xs:81;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,135,66,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 Eo:function(a,b,c){if(a==null||$.lx()==null)return
 $.lx().V7("shimStyling",[a,b,c])},
@@ -14847,24 +15167,24 @@
 if($.UG)return""
 w=J.RE(a)
 z=w.gmH(a)
-if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
+if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.Ar.eo(w,"GET",z,!1)
+C.W3.eo(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
-x=new H.XO(v,null)
-$.mw().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+x=new H.oP(v,null)
+$.bm().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
-M8:[function(a){var z,y
-z=$.Mg().H6.af.t(0,a)
+fS:[function(a){var z,y
+z=$.Mg().JE.af.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","tq",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-x9:function(a,b){var z,y,x,w
+H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
+ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
 if($.Ep()===!0)b=document.head
@@ -14874,14 +15194,14 @@
 if(y!=null)z.setAttribute("element",y)
 x=b.firstChild
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
+if(w.gor(w))x=J.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
 YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
+return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!0
+if($.oQ)throw H.b("Initialization was already done.")
+$.oQ=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
@@ -14889,28 +15209,28 @@
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,82,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+J.UQ($.bI(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,84,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
 JP:function(){var z,y,x,w
-z=$.Si()
+z=$.Xw()
 if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
 y=J.UQ(z,"Polymer")
 if(y==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
 x=$.X3
 y.V7("whenPolymerReady",[x.ce(new A.XR())])
-w=J.UQ($.XX(),"register")
+w=J.UQ($.bI(),"register")
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,YT<,kK<,Bj<,Qk,lD,Uj>,eJ<,kX,t4",
+J.kW($.bI(),"register",P.mt(new A.k2(x,w)))},
+So:{
+"^":"a;FL>,t5>,Jh<,oc>,Q7<,jA<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,Sg,vT",
 gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
+z=J.yR(this.FL,"template")
+if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gXj()}x=document
+for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
+y=y.gJh()}x=document
 W.Ct(window,x,a,this.t5,z)},
 Cw:function(a){var z=$.Kc()
 if(z==null)return
@@ -14919,78 +15239,81 @@
 if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-this.Q7=y}if(a.gBj()!=null){z=a.gBj()
+this.Q7=y}if(a.gix()!=null){z=a.gix()
 y=P.Ls(null,null,null,null)
 y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.nT(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.V9()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+this.ix=y}}z=this.t5
+this.en(z)
+x=J.Vs(this.FL).dA.getAttribute("attributes")
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
 if(v==="")continue
-u=$.Mg().H6.NU.t(0,v)
+u=$.Mg().JE.T4.t(0,v)
 t=L.hk([u])
 s=this.Q7
-if(s!=null&&s.x4(0,t))continue
+if(s!=null&&s.NZ(0,t))continue
 r=$.mX().CV(z,u)
-if(r==null||r.gUA()||J.Z6(r)===!0){window
+if(r==null||r.gUA()||J.EMK(r)===!0){window
 s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(s)
 continue}s=this.Q7
 if(s==null){s=P.Fl(null,null)
 this.Q7=s}s.u(0,t,r)}},
-nT:function(a){var z,y,x,w
-for(z=$.mX().fK(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+en:function(a){var z,y,x,w,v
+for(z=$.mX().Me(0,a,C.LM),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
+w=y.gDv()
+v=new H.wb()
+v.$builtinTypeInfo=[H.u3(w,0)]
+w=new H.U5(w,new A.Zd())
+w.$builtinTypeInfo=[H.u3(v,0)]
+if(w.Vr(0,new A.Da())){w=this.ix
 if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.Mg().H6.af.t(0,x))}}},
+this.ix=w}x=x.goc(y)
+w.h(0,$.Mg().JE.af.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.Xj
-if(y!=null)z.FV(0,y.gkK())
+this.CY=z
+y=this.Jh
+if(y!=null)z.FV(0,y.gCY())
 J.Vs(this.FL).aN(0,new A.EB(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
+ka:function(){var z=this.Bg("link[rel=stylesheet]")
+this.y0=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.lo)},
-OL:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
+this.G9=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
+yq:function(){var z,y,x,w,v,u,t,s
+z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[null])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
+for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
+t=w.IN+=typeof u==="string"?u:H.d(u)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.glb(x))}}},
-oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
+z.FO(x,s,z.gNL(x))}}},
+Wz:function(a,b){var z,y,x
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
-Bg:function(a){return this.oP(a,null)},
-kO:function(a){var z,y,x,w,v,u
+Bg:function(a){return this.Wz(a,null)},
+ds:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.u3(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
-u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.u3(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
-w=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=w+"\n\n"}return z.vM},
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
+u=z.IN+=typeof v==="string"?v:H.d(v)
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+w=z.IN+=typeof v==="string"?v:H.d(v)
+z.IN=w+"\n\n"}return z.IN},
 J3:function(a,b){var z
 if(a==="")return
 z=document.createElement("style",null)
@@ -14998,90 +15321,90 @@
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.HN(),z=$.mX().fK(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
+for(z=$.rt(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.Mg().H6.af.t(0,w)
+v=$.Mg().JE.af.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.Hn(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9:function(){var z,y,x
-for(z=$.mX().fK(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo.gDv()
+this.eJ.u(0,L.hk(v),[x.goc(y)])}},
+I7:function(){var z,y,x
+for(z=$.mX().Me(0,this.t5,C.nk),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
 x=new H.a7(y,y.length,0,null)
 x.$builtinTypeInfo=[H.u3(y,0)]
 for(;x.G();)continue}},
-Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
+jq:function(a){var z=P.L5(null,null,null,P.qU,null)
 a.aN(0,new A.Tj(z))
 return z},
-hW:function(){var z,y,x,w,v,u,t,s,r
+ut:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.mX().fK(0,this.t5,C.rL),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.YT;y.G();){w=y.lo
+for(y=$.mX().Me(0,this.t5,C.ci),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
 v=H.Sz(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
-r=J.zHh(s)
-r=$.mX().dM(u,r)
+r=J.zH(s)
+r=$.mX().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gEV())
+if(u){x.u(0,t,v.gfL())
 z.u(0,t,w)}}},
-$isXP:true,
+$isSo:true,
 static:{"^":"Kb"}},
 Zd:{
-"^":"Xs:13;",
-$1:function(a){return!!J.x(a).$ishG},
+"^":"Xs:12;",
+$1:function(a){return!!J.x(a).$isxn},
 $isEH:true},
 Da:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return a.gvn()},
 $isEH:true},
 EB:{
-"^":"Xs:80;a",
-$2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
+"^":"Xs:81;a",
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).Mw(b,"{{")
+if(z.nC(a,"on-")){y=J.U6(b).OY(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)))}},
 $isEH:true},
 IJ:{
-"^":"Xs:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
+"^":"Xs:12;",
+$1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ua:{
-"^":"Xs:13;a",
+Vi:{
+"^":"Xs:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
-XUG:{
-"^":"Xs:74;",
+eM:{
+"^":"Xs:76;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Xs:177;a",
+"^":"Xs:180;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return!1},
 $isEH:true},
 Li:{
-"^":"BG9;Mn,DP",
+"^":"BG9;Mn,oe",
 op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
 return this.Mn.op(a,b,c)},
-static:{"^":"rf,QPA"}},
+static:{"^":"rd0,QPA"}},
 BG9:{
 "^":"VE+d23;"},
 d23:{
 "^":"a;",
 XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
+for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
+a=z.gAd(a)}return!!z.$isI0?a.host:null},
+Z8:function(a,b,c){var z={}
 z.a=a
 return new A.l5(z,this,b,c)},
 CZ:function(a,b,c){var z,y,x,w
@@ -15090,65 +15413,65 @@
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.fE.t(0,x)
+w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
 l5:{
-"^":"Xs:13;a,b,c,d",
+"^":"Xs:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
 if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=y.gey(a)
+if(!!y.$isDG4){w=y.gey(a)
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
-y=y.gSd(a)
+y=y.gCa(a)
 z=z.a
-J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
+J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 liz:{
-"^":"Xs:181;a,b,c",
+"^":"Xs:184;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.bi,x.Ph,W.aF(y),x.Sg),[H.u3(x,0)])
-w.Zz()
+y=this.b.Z8(null,b,z)
+x=J.PB(b).t(0,this.a.a)
+w=H.VM(new W.Ov(0,x.bi,x.fA,W.aF(y),x.el),[H.u3(x,0)])
+w.DN()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,178,179,180,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
 d6:{
-"^":"Ap;Jq,ED",
+"^":"Ap;Sx,ED",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
+xO:function(a){var z=this.Sx
+if(z!=null){z.Gv()
+this.Sx=null}}},
+xn:{
+"^":"iv;vn<",
+$isxn:true},
 xc:{
-"^":"TR0;AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-XI:function(a){this.bp(a)},
+"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+XI:function(a){this.kR(a)},
 static:{G7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.GBL.ZL(a)
+a.n9=x
+a.wy=w
+C.GBL.LX(a)
 C.GBL.XI(a)
 return a}}},
 jpR:{
-"^":"Bo+zs;XG:SD=",
+"^":"M8+zs;Cp:n7=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -15159,93 +15482,94 @@
 "^":"jpR+Pi;",
 $isd3:true},
 zs:{
-"^":"a;XG:SD=",
+"^":"a;Cp:n7=",
 gFL:function(a){return a.IX},
-gUj:function(a){return},
+gwX:function(a){return},
 gRT:function(a){var z,y
 z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
+if(z!=null)return J.DA(z)
+y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
-bp:function(a){var z,y
-z=this.gmSA(a)
+kR:function(a){var z,y
+z=this.gmb(a)
 if(z!=null&&z.k8!=null){window
 y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
 if(typeof console!="undefined")console.warn(y)}this.Ec(a)
-y=this.gM0(a)
+y=this.gJ8(a)
 if(!J.xC($.Ks().t(0,y),!0)||$.Ep()===!0)this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.XY(a)
+return}a.n7=P.XY(a)
 z=this.gRT(a)
 a.IX=$.vE().t(0,z)
-this.nt(a)
-z=a.Ij
-if(z!=null){y=this.gUc(a)
+this.jM(a)
+z=a.MJ
+if(z!=null){y=this.gnu(a)
 z.toString
-L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gPf(a))
-this.Z2(a)
-this.fk(a)
-this.qb(a)},
-rf:function(a){if(a.Ap)return
-a.Ap=!0
-this.Hv(a)
-this.Oh(a,a.IX)
+L.lg.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
+this.oR(a)
+this.TK(a)
+this.Uc(a)},
+rf:function(a){if(a.OD)return
+a.OD=!0
+this.bT(a)
+this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-this.e1(a)},
-e1:function(a){},
+$.zG().To(new A.X9(a))
+this.I9(a)},
+I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
-if(!a.oG){a.oG=!0
-this.Gy(a,new A.hp(a))}},
-dQ:function(a){this.d9(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gXj())
-this.aI(a,J.nq(b))}},
+if(!a.kK){a.kK=!0
+this.rW(a,new A.hp(a))}},
+Lx:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Wk(b,"template")
+y=z.XT(b,"template")
 if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
+w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
 if(b==null)return
-z=this.Gj(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.SB(b)
-w=J.MO(x,a,y==null&&J.qy(x)==null?J.du(a.IX):y)
-v=a.Rr
-u=$.FC().t(0,w)
-C.Nm.FV(v,u!=null?u.gmD():u)
+z=this.er(a)
+y=this.gwX(a)
+x=!!J.x(b).$isvy?b:M.Xi(b)
+w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
+v=a.f4
+u=$.Tn().t(0,w)
+C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
-v=$.CE()
+v=$.Po()
 if(v!=null)v.V7("register",[z])
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
 y.u(0,J.eS(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-Z2:function(a){a.IX.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.gfl(a))},
+oR:function(a){a.IX.gCY().aN(0,new A.Sv(a))},
+TK:function(a){if(a.IX.gjA()==null)return
+this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.wo(c,$.iB())===!0)return
+if(c==null||J.kE(c,$.VCp())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().Tv(a,x)
+w=$.cp().Gp(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.XK(w):v)
+u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gfl",4,0,182],
-B2:function(a,b){var z=a.IX.gNF()
+$.cp().Cq(a,y,u)}},"$2","gCg",4,0,185],
+B2:function(a,b){var z=a.IX.gjA()
 if(z==null)return
 return z.t(0,b)},
 TW:function(a,b){if(b==null)return
@@ -15253,198 +15577,201 @@
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
-z=L.hk(b).Tl(a)
+z=L.hk(b).WK(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
+if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.FS(M.SB(a),b,c,d)
+if(z==null)return J.tf(M.Xi(a),b,c,d)
 else{y=J.RE(z)
-x=this.YV(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Si(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.C5(M.SB(a))==null){w=P.Fl(null,null)
-J.nC(M.SB(a),w)}J.kW(J.C5(M.SB(a)),b,x)}v=a.IX.gBj()
+x=this.Fy(a,y.goc(z),c,d)
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
+J.Rb(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.Mg().H6.af.t(0,y)
-if(v!=null&&v.Gs(0,u))this.QH(a,u)
+u=$.Mg().JE.af.t(0,y)
+if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.SB(a))},
-sCd:function(a,b){J.nC(M.SB(a),b)},
-gmSA:function(a){return J.qb(M.SB(a))},
-d9:function(a){var z,y
-if(a.Uk===!0)return
-$.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gLh(a)
+lL:function(a){return this.rf(a)},
+gCd:function(a){return J.QE(M.Xi(a))},
+sCd:function(a,b){J.Rb(M.Xi(a),b)},
+gmb:function(a){return J.re(M.Xi(a))},
+x3:function(a){var z,y
+if(a.bb===!0)return
+$.iX().J4(new A.N3(a))
+z=a.TT
+y=this.gyz(a)
 if(z==null)z=new A.FT(null,null,null)
 z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
+a.TT=z},
+Iv:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.Uk=!0},"$0","gLh",0,0,18],
+a.bb=!0},"$0","gyz",0,0,17],
 oW:function(a){var z
-if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
+if(a.bb===!0){$.iX().j2(new A.TV(a))
+return}$.iX().J4(new A.ti(a))
+z=a.TT
 if(z!=null){z.nY(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=new L.ww(null,!1,[],null,null,null,$.jq)
-y.Wf=[]
-a.Ij=y
-a.Rr.push(y)
-for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.Fb,x=H.VM(new P.EQ(w,w.Ig(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
-y.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,183],
-Dq:[function(a,b){var z,y,x,w
-for(z=J.mY(b),y=a.iQ;z.G();){x=z.gl()
+a.TT=null}},
+jM:function(a){var z,y,x,w,v
+z=J.WM(a.IX)
+if(z!=null){y=new L.bg(null,!1,[],null,null,null,$.FU)
+y.vS=[]
+a.MJ=y
+a.f4.push(y)
+for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
+y.WX(a,v)
+this.j6(a,v,v.WK(a),null)}}},
+im:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.WM(a.IX),P.Rd(null,null,null,null)))},"$3","gnu",6,0,186],
+p7:[function(a,b){var z,y,x,w
+for(z=J.mY(b),y=a.n9;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
 w=x.oc
 if(y.t(0,w)!=null)continue
-this.xD(a,w)}},"$1","gPf",2,0,184,176],
-xD:function(a,b){var z,y
-z=$.Mg().H6.af.t(0,b)
-y=a.IX.gBj()
-if(y!=null&&y.Gs(0,z))this.QH(a,z)},
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
+this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,187,179],
+Dt:function(a,b,c,d){var z,y
+$.Is().To(new A.qW(a,b,c,d))
+z=$.Mg().JE.af.t(0,b)
+y=a.IX.gix()
+if(y!=null&&y.tg(0,z))this.QH(a,z)},
+j6:function(a,b,c,d){var z,y,x,w,v
+z=J.WM(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.dnO()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dnO()
-if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.ps(new A.Y0(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
+if(!!J.x(d).$iswn){$.dnO().J4(new A.Y0(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dnO().J4(new A.kMK(a,b))
+x=c.gXF().k0(new A.xfo(a,d,y),null,null,!1)
+w=H.d(b)+"__array"
+v=a.Bd
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.q9=v}v.u(0,x,w)}},
+a.Bd=v}v.u(0,w,x)}},
 hq:function(a,b,c,d){if(d==null?c==null:d===c)return
-this.xD(a,b)},
-hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=$.cp().H6.II.t(0,b)
+this.Dt(a,b,c,d)},
+hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().JE.II.t(0,b)
 if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
-x=a.iQ.t(0,b)
+x=a.n9.t(0,b)
 if(x==null){w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,y)
 v=new A.lK(a,b,c,null,null)
-w=this.gqh(a)
-u=v.gXQ()
-t=w.w4(!1)
-t.ps(u)
-t.fm(0,null)
-t.y5(null)
-v.Jq=t
-u=J.mu(c,v.gap())
-v.dY=u
-s=$.cp().H6.F8.t(0,b)
-if(s==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
-s.$2(a,u)
-a.Rr.push(v)
-return v}x.pR=c
+v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
+w=J.mu(c,v.gls())
+v.SS=w
+u=$.cp().JE.F8.t(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u.$2(a,w)
+a.f4.push(v)
+return v}x.mn=c
 w=J.RE(c)
-r=w.TR(c,x.gaX())
-if(d){q=r==null?y:r
-if(r==null?y!=null:r!==y){w.sP(c,q)
-r=q}}y=x.VB
+t=w.TR(c,x.gUe())
+if(d){s=t==null?y:t
+if(t==null?y!=null:t!==y){w.sP(c,s)
+t=s}}y=x.VB
 w=x.I6
-u=x.RT
-p=J.RE(w)
-x.VB=p.ct(w,u,y,r)
-p.hq(w,u,r,y)
+r=x.RT
+q=J.RE(w)
+x.VB=q.ct(w,r,y,t)
+q.hq(w,r,t,y)
 v=new A.p0(x)
-a.Rr.push(v)
+a.f4.push(v)
 return v},
-wc:function(a,b,c){return this.hO(a,b,c,!1)},
-vz:function(a,b){var z=a.IX.gYT().t(0,b)
+hH:function(a,b,c){return this.hO(a,b,c,!1)},
+yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.Adk().$3$globals(T.u5().$1(z),a,J.du(a.IX).Mn.nF)},
-Hv:function(a){var z,y,x,w,v,u,t,s
-z=a.IX.gYT()
-for(v=J.iY(z),u=v.Fb,v=H.VM(new P.N6(u,u.zN,null,null),[H.u3(v,0)]),v.zq=v.Fb.H9,u=a.iQ;v.G();){y=v.fD
-try{x=this.vz(a,y)
-if(u.t(0,y)==null){t=new A.Kk(y,J.Vm(x),a,null)
+return T.V4().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+bT:function(a){var z,y,x,w,v,u,t,s
+z=a.IX.gGl()
+for(v=J.mY(J.iY(z)),u=a.n9;v.G();){y=v.gl()
+try{x=this.yO(a,y)
+if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.Rr,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(y!=null)J.yd(y)}a.Rr=[]},
-Mx:function(a,b){var z=a.q9.Rz(0,b)
+for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(y!=null)J.yd(y)}a.f4=[]},
+Mx:function(a,b){var z=a.Bd.Rz(0,b)
 if(z==null)return!1
-z.ed()
+z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.q9
+z=a.Bd
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-YV:function(a,b,c,d){var z=$.aQ()
-if(z.mL(C.t4))z.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(b)+"]")
-if(d){if(!!J.x(c).$isAp)z.j2("bindProperty: expected non-bindable value on a one-time binding to ["+H.d(this.gRT(a))+"].["+H.d(b)+"], but found "+H.d(c)+".")
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
+if(y!=null)y.Gv()}a.Bd.V1(0)
+a.Bd=null},
+Fy:function(a,b,c,d){var z=$.Lu()
+z.J4(new A.aM(a,b,c))
+if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
 $.cp().Cq(a,b,c)
 return}return this.hO(a,b,c,!0)},
-qb:function(a){var z,y
-z=a.IX.geJ()
+Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-y=$.vo()
-if(y.mL(C.t4))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.vo()
-y=z.mL(C.t4)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(c)
-if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
-C.Nm.sB(d,x)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){w=$.Mg().H6.NU.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-Gy:function(a,b){var z
+$.q1().J4(new A.SX(a,z))
+z.aN(0,new A.Jys(a))},
+ea:function(a,b,c,d){var z,y,x
+z=$.q1()
+z.To(new A.od(a,c))
+if(!!J.x(c).$isEH){y=X.aW(c)
+if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
+C.Nm.sB(d,y)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.Mg().JE.T4.t(0,c)
+$.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
+z.J4(new A.cB(a,c))},
+rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.ol.pl(z)
-return C.ol.oB(z,W.aF(b))},
+C.Ui.Wq(z)
+return C.Ui.ne(z,W.aF(b))},
 SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.H2(a,z)
+this.Ph(a,z)
 return z},
-te:function(a,b){return this.SE(a,b,null,null,null,null)},
+ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
 $iszs:true,
 $isvy:true,
 $isd3:true,
 $ish4:true,
 $isPZ:true,
 $isKV:true},
+X9:{
+"^":"Xs:76;a",
+$0:[function(){return"["+J.AG(this.a)+"]: ready"},"$0",null,0,0,null,"call"],
+$isEH:true},
 hp:{
-"^":"Xs:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Sv:{
-"^":"Xs:80;a",
+"^":"Xs:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
-if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
+if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"Xs:74;b",
+"^":"Xs:76;b",
 $0:function(){return this.b},
 $isEH:true},
+N3:{
+"^":"Xs:76;a",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
+TV:{
+"^":"Xs:76;a",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
+ti:{
+"^":"Xs:76;b",
+$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$isEH:true},
 N4:{
-"^":"Xs:80;a,b,c,d,e,f",
+"^":"Xs:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -15457,97 +15784,129 @@
 if(u==null)return
 for(v=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;v.G();){p=v.gl()
 if(!q.h(0,p))continue
-s.rJ(t,w,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,96,57,"call"],
+s.j6(t,w,y,b)
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,59,"call"],
+$isEH:true},
+qW:{
+"^":"Xs:76;a,b,c,d",
+$0:[function(){return"["+J.AG(this.a)+"]: "+H.d(this.b)+" changed from: "+H.d(this.d)+" to: "+H.d(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
-"^":"Xs:13;a,b,c",
+"^":"Xs:76;a,b",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kMK:{
+"^":"Xs:76;c,d",
+$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+xfo:{
+"^":"Xs:12;e,f,UI",
 $1:[function(a){var z,y,x,w
-for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,185,"call"],
+for(z=J.mY(this.UI),y=this.e,x=this.f;z.G();){w=z.gl()
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,188,"call"],
+$isEH:true},
+aM:{
+"^":"Xs:76;a,b,c",
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$isEH:true},
+aMY:{
+"^":"Xs:76;d,e,f",
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
-"^":"Xs:80;a",
+"^":"Xs:76;a,b",
+$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
+$isEH:true},
+Jys:{
+"^":"Xs:81;c",
 $2:function(a,b){var z,y
-z=this.a
-y=J.Ei(z).t(0,a)
-H.VM(new W.Ov(0,y.bi,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.u3(y,0)]).Zz()},
+z=this.c
+y=J.PB(z).t(0,a)
+H.VM(new W.Ov(0,y.bi,y.fA,W.aF(J.v7(z.IX).Z8(z,z,b)),y.el),[H.u3(y,0)]).DN()},
+$isEH:true},
+od:{
+"^":"Xs:76;a,b",
+$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+cB:{
+"^":"Xs:76;c,d",
+$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
-"^":"Ap;I6,NV,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.NV,a)},"$1","gap",2,0,20,58],
-HX:[function(a){var z,y,x,w,v
-for(z=J.mY(a),y=this.NV;z.G();){x=z.gl()
+"^":"Ap;I6,ko,q0,Sx,SS",
+z9N:[function(a){this.SS=a
+$.cp().Cq(this.I6,this.ko,a)},"$1","gls",2,0,19,60],
+TZ:[function(a){var z,y,x,w,v
+for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().H6.II.t(0,y)
+w=$.cp().JE.II.t(0,y)
 if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
-z=this.dY
+z=this.SS
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,184,176],
+return}}},"$1","gou",2,0,187,179],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
 return b},
-xO:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.yd(this.q0)}},
+xO:function(a){var z=this.Sx
+if(z!=null){z.Gv()
+this.Sx=null}J.yd(this.q0)}},
 p0:{
-"^":"Ap;iL",
+"^":"Ap;pO",
 TR:function(a,b){},
 gP:function(a){return},
 sP:function(a,b){},
 fR:function(){},
 xO:function(a){var z,y
-z=this.iL
-y=z.pR
+z=this.pO
+y=z.mn
 if(y==null)return
 J.yd(y)
-z.pR=null}},
+z.mn=null}},
 FT:{
-"^":"a;jd,oK,lS",
-Ws:function(){return this.jd.$0()},
+"^":"a;Hi,Ar,lS",
+Dj:function(){return this.Hi.$0()},
 t6:function(a,b,c){var z
 this.nY(0)
-this.jd=b
+this.Hi=b
 z=window
-C.ol.pl(z)
-this.lS=C.ol.oB(z,W.aF(new A.K3(this)))},
+C.Ui.Wq(z)
+this.lS=C.Ui.ne(z,W.aF(new A.K3(this)))},
 nY:function(a){var z,y
 z=this.lS
 if(z!=null){y=window
-C.ol.pl(y)
+C.Ui.Wq(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.oK
-if(z!=null){z.ed()
-this.oK=null}}},
+this.lS=null}z=this.Ar
+if(z!=null){z.Gv()
+this.Ar=null}}},
 K3:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(z.oK!=null||z.lS!=null){z.nY(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
+if(z.Ar!=null||z.lS!=null){z.nY(0)
+z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 XR:{
-"^":"Xs:74;",
-$0:[function(){var z=$.yeH().MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(null)
+"^":"Xs:76;",
+$0:[function(){var z=$.j6().MM
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Xs:188;a,b",
+"^":"Xs:191;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,186,56,187,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,189,58,190,"call"],
 $isEH:true},
 zR:{
-"^":"Xs:74;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+"^":"Xs:76;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
 y=this.d
 x=this.e
@@ -15555,92 +15914,97 @@
 v=P.Fl(null,null)
 u=$.Ak()
 t=P.Fl(null,null)
-v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
 $.vE().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.NF=v.Yl(s)
+if(s!=null)v.jA=v.jq(s)
 v.rH()
-v.I9()
-v.hW()
+v.I7()
+v.ut()
 s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.SB(r),u)
-v.Mi()
+r=s.XT(z,"template")
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
+v.ka()
 v.f6()
-v.OL()
-A.x9(v.J3(v.kO("global"),"global"),document.head)
+v.yq()
+A.ZI(v.J3(v.ds("global"),"global"),document.head)
 v.Cw(z)
 v.Vk()
 v.W3(t)
-q=s.gQg(z).MW.getAttribute("assetpath")
+q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
+p=P.hK(s.gJ8(z).baseURI)
 z=P.hK(q)
 o=z.Fi
-if(o!==""){n=z.ku
+if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
+l=z.QB!=null?z.gtp(z):null}else{n=""
+m=null
+l=null}k=p.jn(z.Ee)
+j=z.xu
+if(j!=null);else j=null}else{o=p.Fi
+if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{u=z.pO
-if(u===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{u=J.co(u,"/")
-t=z.pO
-k=u?p.KO(t):p.KO(p.yM(p.pO,t))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}v.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
+l=P.JF(z.QB!=null?z.gtp(z):null,o)
+k=p.jn(z.Ee)
+j=z.xu
+if(j!=null);else j=null}else{u=z.Ee
+if(u===""){k=p.Ee
+j=z.xu
+if(j!=null);else j=p.xu}else{k=C.xB.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
+j=z.xu
+if(j!=null);else j=null}n=p.ku
+m=p.Kk
+l=p.QB}}i=z.ys
+if(i!=null);else i=null
+v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.Eo(z,y,w!=null?J.O6(w):null)
+A.Eo(z,y,w!=null?J.DA(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true},
-Kk:{
-"^":"a;RT,VB,I6,pR",
-u3:[function(a){var z,y,x,w
+Zw:{
+"^":"a;RT,VB,I6,mn",
+xz:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gaX",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"Kk")},58],
-gP:function(a){var z=this.pR
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
-sP:function(a,b){var z=this.pR
+sP:function(a,b){var z=this.mn
 if(z!=null)J.ta(z,b)
-else this.u3(b)},
+else this.xz(b)},
 bu:[function(a){var z,y
-z=$.Mg().H6.af.t(0,this.RT)
-y=this.pR==null?"(no-binding)":"(with-binding)"
-return"["+new H.cu(H.wO(this),null).bu(0)+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gAY",0,0,74]}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
+z=$.Mg().JE.af.t(0,this.RT)
+y=this.mn==null?"(no-binding)":"(with-binding)"
+return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
 q6:{
-"^":"k5d;Hf,ro,dUC,U3,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gk8:function(a){return J.ZH(a.Hf)},
 gA0:function(a){return J.qy(a.Hf)},
 sA0:function(a,b){J.D4(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
-gUj:function(a){return J.qy(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
+gwX:function(a){return J.qy(a.Hf)},
+v3:function(a,b,c){return J.dv(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
-this.bp(a)
-a.Hf=M.SB(a)
-z=T.GF(null,C.qY)
+this.kR(a)
+a.Hf=M.Xi(a)
+z=T.Mo(null,C.qY)
 J.D4(a.Hf,new Y.zp(a,z,null))
-$.yeH().MM.ml(new Y.lkK(a))},
+$.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
 static:{zE:function(a){var z,y,x,w
@@ -15649,18 +16013,18 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Gkp.ZL(a)
+a.n9=x
+a.wy=w
+C.Gkp.LX(a)
 C.Gkp.dX(a)
 return a}}},
-RS:{
-"^":"fX+zs;XG:SD=",
+GLL:{
+"^":"fX+zs;Cp:n7=",
 $iszs:true,
 $isvy:true,
 $isd3:true,
@@ -15668,234 +16032,234 @@
 $isPZ:true,
 $isKV:true},
 k5d:{
-"^":"RS+d3;R9:ro%,V2:dUC%,me:U3%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
 $isd3:true},
 lkK:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.Sk(z,new Y.Mrx(z))},"$1",null,2,0,null,14,"call"],
+J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.te(z,"template-bound")},"$1",null,2,0,null,14,"call"],
+y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
-"^":"Li;dq,Mn,DP",
-XB:function(a){return this.dq}}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+"^":"Li;dq,Mn,oe",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-Zh:function(a,b,c){var z,y,x
-z=$.Rf().t(0,c)
+fd:function(a,b,c){var z,y,x
+z=$.Al().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.xr.iQ(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"Xs:80;",
+"^":"Xs:81;",
+$2:function(a,b){return a},
+$isEH:true},
+Uf:{
+"^":"Xs:81;",
 $2:function(a,b){return a},
 $isEH:true},
 wJY:{
-"^":"Xs:80;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-W6o:{
-"^":"Xs:80;",
+zOQ:{
+"^":"Xs:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-MdQ:{
-"^":"Xs:80;",
+W6o:{
+"^":"Xs:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
 pp:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-YJG:{
-"^":"Xs:80;",
+MdQ:{
+"^":"Xs:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
 Rj:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","PG",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
+return z},"$1","PG6",2,0,52,66],
+SC:[function(a){var z=J.x(a)
+if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.xA(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
+return z},"$1","Oq",2,0,52,66],
 IK:{
-"^":"Xs:13;a",
-$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,189,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,135,"call"],
 $isEH:true},
-k9:{
-"^":"Xs:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,189,"call"],
+xA:{
+"^":"Xs:12;a",
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,135,"call"],
 $isEH:true},
-cP:{
-"^":"VE;BlM,nF,QA,YH,DP",
+QB:{
+"^":"VE;OH,nF,R3,SY,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.OD(a,null).Ti()
+y=T.OD(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
-if(!!z.$isDI)return new T.Xyb(this,y.gF5(),z.gkZ(y))
-else return new T.Ddj(this,y)}z.a=null
+if(!!z.$isDI)return new T.qb(this,y.gxG(),z.gkZ(y))
+else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
-if(x&&J.xC(b,"class"))z.a=T.PG()
-else if(x&&J.xC(b,"style"))z.a=T.Gu()
-return new T.H1B(z,this,y)},
-A5:function(a){var z=this.YH.t(0,a)
-if(z==null)return new T.uKo(this,a)
-return new T.r6k(this,a,z)},
-ZN:function(a){var z,y,x,w,v
+if(x&&J.xC(b,"class"))z.a=T.PG6()
+else if(x&&J.xC(b,"style"))z.a=T.Oq()
+return new T.Ddj(z,this,y)},
+CE:function(a){var z=this.SY.t(0,a)
+if(z==null)return new T.r6(this,a)
+return new T.uKo(this,a,z)},
+jX:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=z.gBy(a)
+y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.SB(a)
+if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
 z=J.RE(x)
-w=z.gmSA(x)
+w=z.gmb(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isGK)return v
-else return this.QA.t(0,a)}return this.ZN(y)},
-JY:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.jX(y)},
+fi:function(a,b){var z,y
 if(a==null)return K.kL(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.QA
+y=this.R3
 if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.r3(z.gBy(a),b)
+return y.t(0,a)}else if(z.gAd(a)!=null)return this.W5(z.gAd(a),b)
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.r3(a,b)}},
-r3:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.SB(a)
+return this.W5(a,b)}},
+W5:function(a,b){var z,y,x
+if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
 y=J.RE(z)
-if(y.gmSA(z)==null)y.gk8(z)
-return this.QA.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.QA.t(0,a)
-return x!=null?x:K.kL(b,this.nF)}else return this.r3(y.gBy(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+if(y.gmb(z)==null)y.gk8(z)
+return this.R3.t(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.R3.t(0,a)
+return x!=null?x:K.kL(b,this.nF)}else return this.W5(y.gAd(a),b)}},
+static:{"^":"rp3",Mo:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.cP(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).Ti()},"$1","u5",2,0,65],CM:[function(a,b,c,d){var z
+x.FV(0,C.mB)
+return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],QP:[function(a,b,c,d){var z
 if(c==null){c=P.L5(null,null,null,null,null)
-c.FV(0,C.va)}z=K.kL(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.CM(a,b,null,!1)},null,function(a,b,c){return T.CM(a,b,null,c)},null,function(a,b,c){return T.CM(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","Adk",4,5,66,23,67]}},
-Xyb:{
-"^":"Xs:190;b,c,d",
+c.FV(0,C.mB)}z=K.kL(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","V4",4,5,68,22,69]}},
+qb:{
+"^":"Xs:192;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.YH.u(0,b,this.c)
+z.SY.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.kL(a,z.nF)
-z.QA.u(0,b,y)
-return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+z.R3.u(0,b,y)
+return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-Ddj:{
-"^":"Xs:190;e,f",
+Xyb:{
+"^":"Xs:192;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.kL(a,z.nF)
-z.QA.u(0,b,y)
+z.R3.u(0,b,y)
 if(c===!0)return T.rD(this.f,y,null)
-return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-H1B:{
-"^":"Xs:190;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.JY(b,a)
+Ddj:{
+"^":"Xs:192;a,UI,bK",
+$3:[function(a,b,c){var z=this.UI.fi(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
-return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,178,179,180,"call"],
+return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,181,182,183,"call"],
 $isEH:true},
-uKo:{
-"^":"Xs:13;a,b",
+r6:{
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
-x=z.QA.t(0,y)
+x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.kL(a,z.nF)}else return z.JY(y,a)},"$1",null,2,0,null,178,"call"],
+return K.kL(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
-r6k:{
-"^":"Xs:13;c,d,e",
+uKo:{
+"^":"Xs:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
-x=z.QA.t(0,y)
+x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.ZN(y).t1(w,a)},"$1",null,2,0,null,178,"call"],
+else return z.jX(y).t1(w,a)},"$1",null,2,0,null,181,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;yr,wx,n4,Fg,JX,zr,HR",
-Gb:function(a){return this.wx.$1(a)},
-WV:function(a){return this.Fg.$1(a)},
-na:[function(a,b){var z,y
+"^":"Ap;Hk,mo,n4,Fg,JX,dD,HR",
+Ko:function(a){return this.mo.$1(a)},
+Gn:function(a){return this.Fg.$1(a)},
+ia:[function(a,b){var z,y
 z=this.HR
-y=this.wx==null?a:this.Gb(a)
+y=this.mo==null?a:this.Ko(a)
 this.HR=y
-if(b!==!0&&this.Fg!=null&&!J.xC(z,y)){this.WV(this.HR)
-return!0}return!1},function(a){return this.na(a,!1)},"ijz","$2$skipChanges","$1","gTx",2,3,191,67,58,192],
-gP:function(a){if(this.Fg!=null){this.QM(!0)
-return this.HR}return T.rD(this.n4,this.yr,this.wx)},
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y)){this.Gn(this.HR)
+return!0}return!1},function(a){return this.ia(a,!1)},"Eu0","$2$skipChanges","$1","gGX",2,3,193,69,60,194],
+gP:function(a){if(this.Fg!=null){this.Ix(!0)
+return this.HR}return T.rD(this.n4,this.Hk,this.mo)},
 sP:function(a,b){var z,y,x,w
-try{K.jXm(this.n4,b,this.yr,!1)}catch(x){w=H.Ru(x)
+try{K.jXm(this.n4,b,this.Hk,!1)}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(z),y)}},
 TR:function(a,b){var z,y
 if(this.Fg!=null)throw H.b(P.w("already open"))
 this.Fg=b
 z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 y=J.okV(this.n4,new K.Oy(z))
-this.zr=y
-z=y.gqM().yI(this.gTx())
-z.fm(0,new T.pI(this))
+this.dD=y
+z=y.gju().yI(this.gGX())
+z.fm(0,new T.yF(this))
 this.JX=z
-this.QM(!0)
+this.Ix(!0)
 return this.HR},
-QM:function(a){var z,y,x,w,v
-try{x=this.zr
-J.okV(x,new K.Edh(this.yr,a))
-x.gK3()
-x=this.na(this.zr.gK3(),a)
+Ix:function(a){var z,y,x,w,v
+try{x=this.dD
+J.okV(x,new K.Edh(this.Hk,a))
+x.gJb()
+x=this.ia(this.dD.gJb(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.zr)+"': "+H.d(z)
-if(x.Gv!==0)H.vh(P.w("Future already completed"))
-x.CG(v,y)
+v="Error evaluating expression '"+H.d(this.dD)+"': "+H.d(z)
+if(x.YM!==0)H.vh(P.w("Future already completed"))
+x.Nk(v,y)
 return!1}},
-bE:function(){return this.QM(!1)},
+bE:function(){return this.Ix(!1)},
 xO:function(a){var z,y
 if(this.Fg==null)return
-this.JX.ed()
+this.JX.Gv()
 this.JX=null
 this.Fg=null
-z=$.Cs()
-y=this.zr
+z=$.Pk()
+y=this.dD
 z.toString
 J.okV(y,z)
-this.zr=null},
+this.dD=null},
 fR:function(){if(this.Fg!=null)this.TC()},
 TC:function(){var z=0
 while(!0){if(!(z<1000&&this.bE()===!0))break;++z}return z>0},
@@ -15904,46 +16268,46 @@
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-pI:{
-"^":"Xs:80;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zr)+"': "+H.d(a),b)},"$2",null,4,0,null,1,156,"call"],
+yF:{
+"^":"Xs:81;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.dD)+"': "+H.d(a),b)},"$2",null,4,0,null,2,160,"call"],
 $isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
+hC:{
+"^":"a;"}}],["","",,B,{
 "^":"",
-De:{
-"^":"xhq;vq>,DA,AP,fn",
+LL:{
+"^":"xhq;vq>,Xq,Vg,fn",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{z4Z:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
+static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
 "^":"Xs;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.zdr,z.DA,a)},"$1",null,2,0,null,96,"call"],
+z.Xq=F.Wi(z,C.zdr,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
 "^":"",
 jXm:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(a),"|"))break
+for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$iselO){x=y.gP(a)
-w=C.OL
-v=!1}else if(!!y.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isrX){w=a.gTf()
+a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
+w=C.x4
+v=!1}else if(!!y.$isvn){w=a.gTf()
+x=a.gmU()
+v=!0}else{if(!!y.$isx9){w=a.gTf()
 x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
 J.okV(u,new K.GQ(c))
 if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
 if(t==null)return
 if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.Mg().H6.NU.t(0,x)
+else{y=$.Mg().JE.T4.t(0,x)
 $.cp().Cq(t,y,b)}return b},
 kL:function(a,b){var z,y,x
 z=new K.ug(a)
@@ -15951,85 +16315,85 @@
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
 x=new K.Ph(z,y)
-if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 y=x}return y},
 w11:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
 w12:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 w13:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w14:{
-"^":"Xs:80;",
-$2:function(a,b){return J.X9(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w15:{
-"^":"Xs:80;",
-$2:function(a,b){return J.hh(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
 w16:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w17:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w18:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w19:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w20:{
-"^":"Xs:80;",
-$2:function(a,b){return J.z8(a,b)},
+"^":"Xs:81;",
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w21:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w22:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w23:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w24:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w25:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w26:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){var z=H.GO(P.a)
-z=H.KT(z,[z]).BD(b)
+z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
 throw H.b(K.zq("Filters must be a one-argument function."))},
 $isEH:true},
-w0:{
-"^":"Xs:13;",
+Raa:{
+"^":"Xs:12;",
 $1:function(a){return a},
 $isEH:true},
 w5:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return J.jzo(a)},
 $isEH:true},
 w10:{
-"^":"Xs:13;",
+"^":"Xs:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 GK:{
@@ -16044,414 +16408,414 @@
 "^":"GK;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.Mg().H6.NU.t(0,b)
+z=$.Mg().JE.T4.t(0,b)
 y=this.k8
 if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().Tv(y,z)
-return!!J.x(y).$iswS?B.z4Z(y,null):y},
-AC:function(a){return!J.xC(a,"this")},
-bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,71]},
+y=$.cp().Gp(y,z)
+return!!J.x(y).$iswS?B.Ha(y,null):y},
+tc:function(a){return!J.xC(a,"this")},
+bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Y1:{
-"^":"GK;eT>,Z0,P>",
+"^":"GK;eT>,hI,P>",
 gk8:function(a){var z=this.eT
 z=z.gk8(z)
 return z},
 t:function(a,b){var z
-if(J.xC(this.Z0,b)){z=this.P
-return!!J.x(z).$iswS?B.z4Z(z,null):z}return this.eT.t(0,b)},
-AC:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.AC(a)},
-bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,71]},
+if(J.xC(this.hI,b)){z=this.P
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+tc:function(a){if(J.xC(this.hI,a))return!1
+return this.eT.tc(a)},
+bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
 Ph:{
 "^":"GK;eT>,Z3<",
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
-if(z.x4(0,b)){z=z.t(0,b)
-return!!J.x(z).$iswS?B.z4Z(z,null):z}return this.eT.t(0,b)},
-AC:function(a){if(this.Z3.x4(0,a))return!1
+if(z.NZ(0,b)){z=z.t(0,b)
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
+tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;fT?,Gl<",
-gqM:function(){var z=this.k6
+"^":"a;VO?,Xl<",
+gju:function(){var z=this.vO
 return H.VM(new P.Ik(z),[H.u3(z,0)])},
-gEV:function(){return this.KL},
-gK3:function(){return this.Gl},
-Qh:function(a){},
-ub:function(a){var z
-this.qf(0,a,!1)
-z=this.fT
-if(z!=null)z.ub(a)},
+gfL:function(){return this.KL},
+gJb:function(){return this.Xl},
+MN:function(a){},
+BZ:function(a){var z
+this.jK(0,a,!1)
+z=this.VO
+if(z!=null)z.BZ(a)},
 fs:function(){var z=this.tj
-if(z!=null){z.ed()
+if(z!=null){z.Gv()
 this.tj=null}},
-qf:function(a,b,c){var z,y,x
+jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.Gl
-this.Qh(b)
-if(!c){y=this.Gl
+z=this.Xl
+this.MN(b)
+if(!c){y=this.Xl
 y=y==null?z!=null:y!==z}else y=!1
-if(y){y=this.k6
-x=this.Gl
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(x)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,71],
+if(y){y=this.vO
+x=this.Xl
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(x)}},
+bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
 $isIp:true},
 Edh:{
-"^":"cfS;qu,n7",
-xn:function(a){a.qf(0,this.qu,this.n7)}},
+"^":"cfS;ms,xZ",
+xn:function(a){a.jK(0,this.ms,this.xZ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
-static:{"^":"ln"}},
+static:{"^":"jC"}},
 GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y,x
+"^":"P55;ms",
+W9:function(a){return J.ZH(this.ms)},
+Hs:function(a){return a.wz.RR(0,this)},
+Ci:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.Mg().H6.NU.t(0,y)
-return $.cp().Tv(z,x)},
+x=$.Mg().JE.T4.t(0,y)
+return $.cp().Gp(z,x)},
 CU:function(a){var z=J.okV(a.gTf(),this)
 if(z==null)return
-return J.UQ(z,J.okV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
+return J.UQ(z,J.okV(a.gmU(),this))},
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.eC(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.Mg().H6.NU.t(0,x)
+y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
+x=a.gnK(a)
+v=$.Mg().JE.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
 oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
+Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-z.u(0,J.okV(J.A6(x),this),J.okV(x.gv4(),this))}return z},
-EZ:function(a){return H.vh(P.f("should never be called"))},
-qs:function(a){return J.UQ(this.qu,a.gP(a))},
+for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
+YV:function(a){return H.vh(P.f("should never be called"))},
+qv:function(a){return J.UQ(this.ms,a.gP(a))},
 ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
+z=a.gxS(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.Rab().t(0,z)
+w=$.YP().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-xN:function(a){var z,y
+kb:function(a){var z,y
 z=J.okV(a.gwz(),this)
-y=$.fs().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
+y=$.fs().t(0,a.gxS(a))
+if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
 ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
 Vw:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
 W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
-LT:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
+Hs:function(a){return a.wz.RR(0,this)},
+Ci:function(a){var z,y
 z=J.okV(a.gTf(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(y)
+z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gTf(),this)
-y=J.okV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+y=J.okV(a.gmU(),this)
+x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sVO(x)
+y.sVO(x)
 return x},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(v)
+z.sVO(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
 oD:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.le(z,a,null,null,null,P.bK(null,null,!1,null))
+z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
+y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
-EZ:function(a){var z,y,x
-z=J.okV(a.gG3(a),this)
+YV:function(a){var z,y,x
+z=J.okV(a.gnl(a),this)
 y=J.okV(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+z.sVO(x)
+y.sVO(x)
 return x},
-qs:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(x)
-y.sfT(x)
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sVO(x)
+y.sVO(x)
 return x},
-xN:function(a){var z,y
+kb:function(a){var z,y
 z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(y)
+z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
-y=J.okV(a.gSl(),this)
-x=J.okV(a.gru(),this)
+y=J.okV(a.gav(),this)
+x=J.okV(a.geE(),this)
 w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sfT(w)
-y.sfT(w)
-x.sfT(w)
+z.sVO(w)
+y.sVO(w)
+x.sVO(w)
 return w},
 ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
 Vw:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 XV:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){var z=this.a
-a.sfT(z)
+a.sVO(z)
 return z},
 $isEH:true},
 Il:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=J.ZH(a)},
+"^":"Ay0;KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
 $asAy0:function(){return[U.EO]},
 $isEO:true,
 $isIp:true},
 x5:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-Qh:function(a){var z=this.KL
-this.Gl=z.gP(z)},
+MN:function(a){var z=this.KL
+this.Xl=z.gP(z)},
 RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.Dv]},
-$asDv:function(){return[null]},
-$isDv:true,
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
 $isIp:true},
 UF:{
-"^":"Ay0;hL<,KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;lm<,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
 $asAy0:function(){return[U.c0]},
 $isc0:true,
 $isIp:true},
 Hv:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGl()},"$1",null,2,0,null,96,"call"],
+"^":"Xs:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-le:{
-"^":"Ay0;Rl>,KL,fT,tj,Gl,k6",
-Qh:function(a){this.Gl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+ED:{
+"^":"Ay0;Rl>,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
-Ku:{
-"^":"Xs:80;",
-$2:function(a,b){J.kW(a,J.A6(b).gGl(),b.gv4().gGl())
+Kv:{
+"^":"Xs:81;",
+$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;G3>,v4<,KL,fT,tj,Gl,k6",
-RR:function(a,b){return b.EZ(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
+"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+RR:function(a,b){return b.YV(this)},
+$asAy0:function(){return[U.nu]},
+$isnu:true,
 $isIp:true},
 ek:{
-"^":"Ay0;KL,fT,tj,Gl,k6",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-Qh:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.Gl=y.t(a,z.gP(z))
-if(!a.AC(z.gP(z)))return
+this.Xl=y.t(a,z.gP(z))
+if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.Mg().H6.NU.t(0,z)
-this.tj=y.gqh(x).yI(new K.V8(this,a,w))},
-RR:function(a,b){return b.qs(this)},
-$asAy0:function(){return[U.elO]},
-$iselO:true,
+w=$.Mg().JE.T4.t(0,z)
+this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+RR:function(a,b){return b.qv(this)},
+$asAy0:function(){return[U.fp]},
+$isfp:true,
 $isIp:true},
-V8:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+OC:{
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 GC:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;wz<,KL,fT,tj,Gl,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y
+"^":"Ay0;wz<,KL,VO,tj,Xl,vO",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
+MN:function(a){var z,y
 z=this.KL
-y=$.fs().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gGl()
-this.Gl=y.$1(z==null?!1:z)}else{z=this.wz
-this.Gl=z.gGl()==null?null:y.$1(z.gGl())}},
-RR:function(a,b){return b.xN(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
+y=$.fs().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.wz.gXl()
+this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
+this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.kb(this)},
+$asAy0:function(){return[U.FH]},
+$isFH:true,
 $isIp:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,fT,tj,Gl,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y,x
+ky:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
+MN:function(a){var z,y,x
 z=this.KL
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gGl()
+y=$.YP().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
-x=this.T8.gGl()
-this.Gl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Gl=y.$2(this.Bb.gGl(),this.T8.gGl())
+x=this.T8.gXl()
+this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
 else{x=this.Bb
-if(x.gGl()==null||this.T8.gGl()==null)this.Gl=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gGl()).$iswn)this.tj=H.Go(x.gGl(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Gl=y.$2(x.gGl(),this.T8.gGl())}}},
+if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
+this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
 $isIp:true},
 P8:{
-"^":"Xs:13;a,b",
-$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
-"^":"Ay0;dc<,Sl<,ru<,KL,fT,tj,Gl,k6",
-Qh:function(a){var z=this.dc.gGl()
-this.Gl=(z==null?!1:z)===!0?this.Sl.gGl():this.ru.gGl()},
+"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
+MN:function(a){var z=this.dc.gXl()
+this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
 $isIp:true},
 vl:{
-"^":"Ay0;Tf<,KL,fT,tj,Gl,k6",
+"^":"Ay0;Tf<,KL,VO,tj,Xl,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-Qh:function(a){var z,y,x
-z=this.Tf.gGl()
-if(z==null){this.Gl=null
+MN:function(a){var z,y,x
+z=this.Tf.gXl()
+if(z==null){this.Xl=null
 return}y=this.KL
 y=y.goc(y)
-x=$.Mg().H6.NU.t(0,y)
-this.Gl=$.cp().Tv(z,x)
+x=$.Mg().JE.T4.t(0,y)
+this.Xl=$.cp().Gp(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
-RR:function(a,b){return b.T7(this)},
-$asAy0:function(){return[U.rX]},
-$isrX:true,
+RR:function(a,b){return b.Ci(this)},
+$asAy0:function(){return[U.x9]},
+$isx9:true,
 $isIp:true},
 Vw:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 WKb:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,KL,fT,tj,Gl,k6",
-Qh:function(a){var z,y,x
-z=this.Tf.gGl()
-if(z==null){this.Gl=null
-return}y=this.Jn.gGl()
+iTN:{
+"^":"Ay0;Tf<,mU<,KL,VO,tj,Xl,vO",
+MN:function(a){var z,y,x
+z=this.Tf.gXl()
+if(z==null){this.Xl=null
+return}y=this.mU.gXl()
 x=J.U6(z)
-this.Gl=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
+this.Xl=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
+$asAy0:function(){return[U.vn]},
+$isvn:true,
 $isIp:true},
 tE:{
-"^":"Xs:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
+"^":"Xs:12;a,b,c",
+$1:[function(a){if(J.VA(a,new K.Ku(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
-zw:{
-"^":"Xs:13;d",
-$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,85,"call"],
+Ku:{
+"^":"Xs:12;d",
+$1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-jai:{
-"^":"Xs:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,185,"call"],
+z5:{
+"^":"Xs:12;e,f,UI",
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
 ey:{
-"^":"Xs:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,85,"call"],
+"^":"Xs:12;bK",
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 c3:{
-"^":"Ay0;Tf<,re<,KL,fT,tj,Gl,k6",
-gSf:function(a){var z=this.KL
-return z.gSf(z)},
-Qh:function(a){var z,y,x,w
+"^":"Ay0;Tf<,re<,KL,VO,tj,Xl,vO",
+gnK:function(a){var z=this.KL
+return z.gnK(z)},
+MN:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gGl()
-if(x==null){this.Gl=null
+y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
+x=this.Tf.gXl()
+if(x==null){this.Xl=null
 return}z=this.KL
-if(z.gSf(z)==null){z=H.eC(x,y,P.Te(null))
-this.Gl=!!J.x(z).$iswS?B.z4Z(z,null):z}else{z=z.gSf(z)
-w=$.Mg().H6.NU.t(0,z)
-this.Gl=$.cp().Ck(x,w,y,!1,null)
+if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
+this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
+w=$.Mg().JE.T4.t(0,z)
+this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Xh(this,a,w))}},
+RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
 $isIp:true},
+vQ:{
+"^":"Xs:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
+$isEH:true},
 Xh:{
-"^":"Xs:13;",
-$1:[function(a){return a.gGl()},"$1",null,2,0,null,46,"call"],
+"^":"Xs:195;a,b,c",
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,188,"call"],
 $isEH:true},
-BGc:{
-"^":"Xs:193;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,185,"call"],
-$isEH:true},
-vk:{
-"^":"Xs:13;d",
+ho:{
+"^":"Xs:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-B03:{
+XX:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
-static:{zq:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
+static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -16471,9 +16835,9 @@
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
 return 536870911&a+((16383&a)<<15>>>0)},
-Fs:{
+tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,194,1,46]},
+Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,196,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
@@ -16481,112 +16845,112 @@
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
 $isEO:true},
-Dv:{
+noG:{
 "^":"Ip;P>",
 RR:function(a,b){return b.oD(this)},
 bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isDv:true},
+$isnoG:true},
 c0:{
-"^":"Ip;hL<",
+"^":"Ip;lm<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,71],
+bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.pz(this.hL)},
+return!!J.x(b).$isc0&&U.Pu(b.glm(),this.lm)},
+giO:function(a){return U.pz(this.lm)},
 $isc0:true},
 Mm:{
 "^":"Ip;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,71],
+bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
 giO:function(a){return U.pz(this.Rl)},
 $isMm:true},
-ae:{
-"^":"Ip;G3>,v4<",
-RR:function(a,b){return b.EZ(this)},
-bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
+nu:{
+"^":"Ip;nl>,v4<",
+RR:function(a,b){return b.YV(this)},
+bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
+return!!z.$isnu&&J.xC(z.gnl(b),this.nl)&&J.xC(b.gv4(),this.v4)},
 giO:function(a){var z,y
-z=J.v1(this.G3.P)
+z=J.v1(this.nl.P)
 y=J.v1(this.v4)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
+$isnu:true},
 XC:{
 "^":"Ip;wz",
-RR:function(a,b){return b.LT(this)},
-bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,71],
+RR:function(a,b){return b.Hs(this)},
+bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
-elO:{
+fp:{
 "^":"Ip;P>",
-RR:function(a,b){return b.qs(this)},
-bu:[function(a){return this.P},"$0","gAY",0,0,71],
+RR:function(a,b){return b.qv(this)},
+bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iselO&&J.xC(z.gP(b),this.P)},
+return!!z.$isfp&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$iselO:true},
-cJ:{
-"^":"Ip;kp>,wz<",
-RR:function(a,b){return b.xN(this)},
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,71],
+$isfp:true},
+FH:{
+"^":"Ip;xS>,wz<",
+RR:function(a,b){return b.kb(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.wz)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gwz(),this.wz)},
 giO:function(a){var z,y
-z=J.v1(this.kp)
+z=J.v1(this.xS)
 y=J.v1(this.wz)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
+$isFH:true},
 uku:{
-"^":"Ip;kp>,Bb>,T8>",
+"^":"Ip;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isuku&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y,x
-z=J.v1(this.kp)
+z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-mc:{
-"^":"Ip;dc<,Sl<,ru<",
+Dc:{
+"^":"Ip;dc<,av<,eE<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
-y=J.v1(this.Sl)
-x=J.v1(this.ru)
+y=J.v1(this.av)
+x=J.v1(this.eE)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
+$isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
-gF5:function(){var z=this.Bb
+gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
 giO:function(a){var z,y
@@ -16599,10 +16963,10 @@
 px:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.Vw(this)},
-gF5:function(){var z=this.T8
+gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
-bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
@@ -16612,258 +16976,258 @@
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
 $isDI:true},
-zX:{
-"^":"Ip;Tf<,Jn<",
+vn:{
+"^":"Ip;Tf<,mU<",
 RR:function(a,b){return b.CU(this)},
-bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,71],
+bu:[function(a){return H.d(this.Tf)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
+return!!J.x(b).$isvn&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gmU(),this.mU)},
 giO:function(a){var z,y
 z=J.v1(this.Tf)
-y=J.v1(this.Jn)
+y=J.v1(this.mU)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-rX:{
+$isvn:true},
+x9:{
 "^":"Ip;Tf<,oc>",
-RR:function(a,b){return b.T7(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
+RR:function(a,b){return b.Ci(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isrX&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.Tf)
 y=J.v1(this.oc)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isrX:true},
+$isx9:true},
 RWc:{
-"^":"Ip;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,71],
+"^":"Ip;Tf<,nK>,re<",
+RR:function(a,b){return b.Y7(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isRWc&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isRWc&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gnK(b),this.nK)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.Tf)
-y=J.v1(this.Sf)
+y=J.v1(this.nK)
 x=U.pz(this.re)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
-"^":"Xs:80;",
+"^":"Xs:81;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
+$isEH:true}}],["","",,T,{
 "^":"",
-KR:{
-"^":"a;rR,Yf,jQ,R3",
-gQi:function(){return this.R3.lo},
-Ti:function(){var z=this.Yf.zl()
-this.jQ=z
-this.R3=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
-this.Bp()
-return this.Te()},
-lx:function(a,b){var z
-if(a!=null){z=this.R3.lo
+FX:{
+"^":"a;Wi,f7,JR,V6",
+gVd:function(){return this.V6.Ff},
+oK:function(){var z=this.f7.zl()
+this.JR=z
+this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
+this.jz()
+return this.VK()},
+Jn:function(a,b){var z
+if(a!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.R3.lo
+if(!z)if(b!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
-if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.R3.G()},
-Bp:function(){return this.lx(null,null)},
-Ha:function(a){return this.lx(a,null)},
-Te:function(){if(this.R3.lo==null){this.rR.toString
-return C.OL}var z=this.ia()
-return z==null?null:this.mi(z,0)},
-mi:function(a,b){var z,y,x,w,v,u
-for(;z=this.R3.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.R3.lo),"(")){y=this.rD()
-this.rR.toString
-a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.R3.lo),"[")){x=this.IM()
-this.rR.toString
-a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.R3.lo),3)){this.Bp()
-a=this.F0(a,this.ia())}else if(J.xC(J.Iz(this.R3.lo),10))if(J.xC(J.Vm(this.R3.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rR.toString
-a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.R3.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$iselO)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rR.toString
+if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gVd())))
+this.V6.G()},
+jz:function(){return this.Jn(null,null)},
+IH:function(a){return this.Jn(a,null)},
+VK:function(){if(this.V6.Ff==null){this.Wi.toString
+return C.x4}var z=this.ZR()
+return z==null?null:this.Ay(z,0)},
+Ay:function(a,b){var z,y,x,w,v,u
+for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
+this.Wi.toString
+a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.FD()
+this.Wi.toString
+a=new U.vn(a,x)}else break
+else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+this.jz()
+w=this.VK()
+this.Wi.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
+w=this.VK()
+if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.Wi.toString
 a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.R3.lo),8)){z=this.R3.lo.gnS()
+else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.R3.lo),"?")){this.lx(8,"?")
-v=this.Te()
-this.Ha(5)
-u=this.Te()
-this.rR.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
+if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
+v=this.VK()
+this.IH(5)
+u=this.VK()
+this.Wi.toString
+a=new U.Dc(a,v,u)}else a=this.Ax(a)
 else break}return a},
-F0:function(a,b){var z,y
+JuP:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$iselO){z=z.gP(b)
-this.rR.toString
-return new U.rX(a,z)}else if(!!z.$isRWc&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
+if(!!z.$isfp){z=z.gP(b)
+this.Wi.toString
+return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
 y=b.gre()
-this.rR.toString
+this.Wi.toString
 return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.R3.lo
+Ax:function(a){var z,y,x,w,v
+z=this.V6.Ff
 y=J.RE(z)
-if(!C.Nm.Gs(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.ia()
-while(!0){w=this.R3.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.R3.lo),3)||J.xC(J.Iz(this.R3.lo),9)){w=this.R3.lo.gnS()
-v=z.gnS()
+if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
+this.jz()
+x=this.ZR()
+while(!0){w=this.V6.Ff
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
+v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
 v=w>v
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.mi(x,this.R3.lo.gnS())}y=y.gP(z)
-this.rR.toString
+x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
+this.Wi.toString
 return new U.uku(y,a,x)},
-ia:function(){var z,y,x,w
-if(J.xC(J.Iz(this.R3.lo),8)){z=J.Vm(this.R3.lo)
+ZR:function(){var z,y,x,w
+if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
 y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.R3.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.R3.lo)),null,null)
-this.rR.toString
-z=new U.Dv(y)
+if(y.n(z,"+")||y.n(z,"-")){this.jz()
+if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rR
-if(J.xC(J.Iz(this.R3.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.R3.lo)),null)
+this.jz()
+return z}else{y=this.Wi
+if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
 y.toString
-z=new U.Dv(x)
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.mi(this.fq(),11)
+this.jz()
+return z}else{w=this.Ay(this.LE(),11)
 y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.mi(this.fq(),11)
-this.rR.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.fq()},
-fq:function(){var z,y
-switch(J.Iz(this.R3.lo)){case 10:z=J.Vm(this.R3.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rR.toString
-return new U.elO("this")}else if(C.Nm.Gs(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
+w=this.Ay(this.LE(),11)
+this.Wi.toString
+return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+LE:function(){var z,y
+switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
+if(J.xC(z,"this")){this.jz()
+this.Wi.toString
+return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
-case 1:return this.ef()
-case 6:return this.PP()
-case 7:return this.xJ()
-case 9:if(J.xC(J.Vm(this.R3.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rR.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.R3.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.R3.lo),"["))return this.S9()
+case 2:return this.xh()
+case 1:return this.Dy()
+case 6:return this.Dp()
+case 7:return this.eD()
+case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
+y=this.VK()
+this.Jn(9,")")
+this.Wi.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
+else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
-S9:function(){var z,y
+U3:function(){var z,y
 z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"]"))break
-z.push(this.Te())
-y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
+z.push(this.VK())
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+this.Jn(9,"]")
 return new U.c0(z)},
-pH:function(){var z,y,x
+hR:function(){var z,y,x
 z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),"}"))break
-y=J.Vm(this.R3.lo)
-this.rR.toString
-x=new U.Dv(y)
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
+y=J.Vm(this.V6.Ff)
+this.Wi.toString
+x=new U.noG(y)
 x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.R3.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
+this.jz()
+this.Jn(5,":")
+z.push(new U.nu(x,this.VK()))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
+this.Jn(9,"}")
 return new U.Mm(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.R3.lo),"true")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.R3.lo),"false")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.R3.lo),"null")){this.Bp()
-this.rR.toString
-return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.R3.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.R3.lo)
-this.Bp()
-this.rR.toString
-y=new U.elO(z)
-x=this.rD()
+xh:function(){var z,y,x
+if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.Ff)
+this.jz()
+this.Wi.toString
+y=new U.fp(z)
+x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
-rD:function(){var z,y
-z=this.R3.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"(")){y=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.R3.lo),9)&&J.xC(J.Vm(this.R3.lo),")"))break
-y.push(this.Te())
-z=this.R3.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
+Hr:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+do{this.jz()
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
+y.push(this.VK())
+z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
+this.Jn(9,")")
 return y}return},
-IM:function(){var z,y
-z=this.R3.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.R3.lo),"[")){this.Bp()
-y=this.Te()
-this.lx(9,"]")
+FD:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
+y=this.VK()
+this.Jn(9,"]")
 return y}return},
-ef:function(){var z,y
-z=J.Vm(this.R3.lo)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Dy:function(){var z,y
+z=J.Vm(this.V6.Ff)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-Nt:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.R3.lo)),null,null)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Rb:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-PP:function(){return this.Nt("")},
-cp:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.R3.lo)),null)
-this.rR.toString
-y=H.VM(new U.Dv(z),[null])
-this.Bp()
+Dp:function(){return this.Rb("")},
+FM:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
+this.jz()
 return y},
-xJ:function(){return this.cp("")},
+eD:function(){return this.FM("")},
 static:{OD:function(a,b){var z,y,x
 z=H.VM([],[Y.qS])
 y=P.p9("")
-x=new U.Fs()
-return new T.KR(x,new Y.xv(z,y,new P.WU(a,0,0,null),null),null,null)}}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+x=new U.tu()
+return new T.FX(x,new Y.xv(z,y,new P.Xa(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,68,69],
+eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","FLA",2,0,70,71],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,71],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
 $isAep:true},
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
+"^":"mW;K9",
+gA:function(a){var z=new K.vR(J.mY(this.K9),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
+gB:function(a){return J.q8(this.K9)},
+gl0:function(a){return J.FN(this.K9)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.K9
 y=J.U6(z)
 z=new K.Aep(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -16871,13 +17235,13 @@
 $asmW:function(a){return[[K.Aep,a]]},
 $asQV:function(a){return[[K.Aep,a]]}},
 vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
+"^":"Anv;GZ,ir,WV",
+gl:function(){return this.WV},
+G:function(){var z=this.GZ
+if(z.G()){this.WV=H.VM(new K.Aep(this.ir++,z.gl()),[null])
+return!0}this.WV=null
 return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16886,59 +17250,59 @@
 case 118:return 11
 default:return a}},
 qS:{
-"^":"a;fY>,P>,nS<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
+"^":"a;fY>,P>,G8<",
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
 $isqS:true},
 xv:{
-"^":"a;dE,zy,jI,x0",
+"^":"a;dE,Lz,Te,x0",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
+z=this.Te
+this.x0=z.G()?z.ft:null
+for(y=this.dE;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.ft:null
+else if(x===34||x===39)this.DS()
 else{if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
 else w=!0
-if(w)this.zI()
+if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.Wn:null
+else if(x===46){x=z.G()?z.ft:null
 this.x0=x
 if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.qv()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.Gs(C.bg,x)){v=this.x0
-x=z.G()?z.Wn:null
+if(48<=x&&x<=57)this.e1()
+else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.ft:null
+y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.ft:null
+y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.mk,x)){v=this.x0
+x=z.G()?z.ft:null
 this.x0=x
-if(C.Nm.Gs(C.bg,x)){x=this.x0
-u=H.LY([v,x])
-if(C.Nm.Gs(C.Fn,u)){x=z.G()?z.Wn:null
+if(C.Nm.tg(C.mk,x)){x=this.x0
+u=H.eT([v,x])
+if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
 this.x0=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.LyD.t(0,t)))}else if(C.Nm.Gs(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.LyD.t(0,s)))
-this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
-WG:function(){var z,y,x,w
+this.x0=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.qS(8,t,C.iM.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
+y.push(new Y.qS(9,s,C.iM.t(0,s)))
+this.x0=z.G()?z.ft:null}else this.x0=z.G()?z.ft:null}return y},
+DS:function(){var z,y,x,w
 z=this.x0
-y=this.jI
-x=y.G()?y.Wn:null
+y=this.Te
+x=y.G()?y.ft:null
 this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
+for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+if(x===92){x=y.G()?y.ft:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
 x=H.mx(Y.wX(x))
-w.vM+=x}else{x=H.mx(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.dE.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
+w.IN+=x}else{x=H.mx(x)
+w.IN+=x}x=y.G()?y.ft:null
+this.x0=x}this.dE.push(new Y.qS(1,w.IN,0))
+w.IN=""
+this.x0=y.G()?y.ft:null},
+y3:function(){var z,y,x,w,v
+z=this.Te
+y=this.Lz
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16946,93 +17310,93 @@
 else w=!0}else w=!1
 if(!w)break
 x=H.mx(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
+y.IN+=x
+this.x0=z.G()?z.ft:null}v=y.IN
 z=this.dE
-if(C.Nm.Gs(C.oP,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
 else z.push(new Y.qS(2,v,0))
-y.vM=""},
+y.IN=""},
 jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
+z=this.Te
+y=this.Lz
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
+y.IN+=x
+this.x0=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
 this.x0=z
 if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.qv()
-else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-qv:function(){var z,y,x,w
-z=this.zy
+if(48<=z&&z<=57)this.e1()
+else this.dE.push(new Y.qS(3,".",11))}else{this.dE.push(new Y.qS(6,y.IN,0))
+y.IN=""}},
+e1:function(){var z,y,x,w
+z=this.Lz
 z.KF(H.mx(46))
-y=this.jI
+y=this.Te
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.dE.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
+z.IN+=x
+this.x0=y.G()?y.ft:null}this.dE.push(new Y.qS(7,z.IN,0))
+z.IN=""}},
 hAN:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gay",2,0,195,156]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,197,160]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
+Hs:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.okV(a.gTf(),this)
+Ci:function(a){J.okV(a.gTf(),this)
 this.xn(a)},
 CU:function(a){J.okV(a.gTf(),this)
-J.okV(a.gJn(),this)
+J.okV(a.gmU(),this)
 this.xn(a)},
-ZR:function(a){var z
+Y7:function(a){var z
 J.okV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 oD:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
-EZ:function(a){J.okV(a.gG3(a),this)
+YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
 this.xn(a)},
-qs:function(a){this.xn(a)},
+qv:function(a){this.xn(a)},
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-xN:function(a){J.okV(a.gwz(),this)
+kb:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
-J.okV(a.gSl(),this)
-J.okV(a.gru(),this)
+J.okV(a.gav(),this)
+J.okV(a.geE(),this)
 this.xn(a)},
 ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
 Vw:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V45;oX,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,nu,Oq,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V47;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gtu:function(a){return a.Ny},
+stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
 gGV:function(a){return a.fI},
@@ -17051,47 +17415,47 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,15,196],
-SQ:function(a){var z,y
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+W7:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-ib:[function(a,b,c){this.SQ(a)},"$2","gFG",4,0,197,198,199],
+qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,198,199,200],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.gFG(a))
-a.nu=y
+if(z!=null){y=W.Ws(this.giH(a))
+a.Nf=y
 C.S2.OT(y,z,!0)}},
-dQ:function(a){var z=a.nu
+Lx:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)
-this.SQ(a)},"$1","goL",2,0,20,57],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,20,57],
-nb:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
-ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,20,57],
-mC:function(a){var z,y,x
+a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+Ecy:[function(a,b){this.Um(a)
+this.W7(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
+ib:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
+Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
+Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
-if(a.Oq!=null)return
-z=a.oX
+if(a.D6!=null)return
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.Oq=J.SK(a.oX).ml(new T.Es(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
 z=a.cI
-y=a.oX
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
 J.Z8(a.Kf)
-for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.oX),x))
+for(x=J.Hn(a.xo,1);z=J.Wx(x),z.E(x,J.Hn(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
-static:{T5i:function(a){var z,y,x,w,v
+static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -17101,92 +17465,92 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.za.ZL(a)
+a.n9=w
+a.wy=v
+C.za.LX(a)
 C.za.XI(a)
 return a}}},
-V45:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
+if(J.iS(z.Ny)===!0){z.D6=null
+J.XP(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V46;X9,xt,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V48;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
-gv8:function(a){return a.xt},
-sv8:function(a,b){a.xt=this.ct(a,C.S4,a.xt,b)},
-vW:[function(a,b,c,d){var z,y
-z=a.xt
+gO9:function(a){return a.pL},
+sO9:function(a,b){a.pL=this.ct(a,C.S4,a.pL,b)},
+SC:[function(a,b,c,d){var z,y
+z=a.pL
 if(z===!0)return
-a.xt=this.ct(a,C.S4,z,!0)
+a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.aT(J.zH(y)).G5(J.zH(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.aT(J.zH(y)).h4(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,46,47,85],
-static:{xA:function(a){var z,y,x,w
+if(z==null)J.aT(J.KL(y)).G5(J.KL(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.KL(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.xt=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.pL=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.QLX.ZL(a)
-C.QLX.XI(a)
+a.n9=x
+a.wy=w
+C.FC.LX(a)
+C.FC.XI(a)
 return a}}},
-V46:{
+V48:{
 "^":"uL+Pi;",
 $isd3:true},
 eE:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,14,"call"],
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:[function(a){var z=this.b
-z.xt=J.Q5(z,C.S4,z.xt,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+$isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"qeq;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
-gJp:function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gTX()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-r6:[function(a,b){var z=a.tY
+gXt:function(a){var z=a.tY
+if(z==null)return Q.xI.prototype.gXt.call(this,a)
+return z.gTE()},
+fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
+at:[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,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
 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)},
+else J.SK(y).ml(this.gRy(a))}return Q.xI.prototype.goc.call(this,a)},
 gO3:function(a){if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0))if(J.iS(a.tY)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.jJ)
-else J.SK(a.tY).ml(this.gvo(a))
+else J.SK(a.tY).ml(this.gRy(a))
 return Q.xI.prototype.gO3.call(this,a)},
-static:{Thl:function(a){var z,y,x,w
+static:{TQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -17194,52 +17558,52 @@
 w=P.Fl(null,null)
 a.jJ=-1
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Wa.ZL(a)
-C.Wa.XI(a)
+a.n9=x
+a.wy=w
+C.c07.LX(a)
+C.c07.XI(a)
 return a}}},
-oEY:{
+qeq:{
 "^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V47;Uz,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
+"^":"V49;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gtu:function(a){return a.Uz},
+stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,101],
-Ur:[function(a,b){J.y9(a.Uz).YM(b)},"$1","gWp",2,0,20,101],
-static:{dI:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{TXt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.cJ0.ZL(a)
+a.n9=x
+a.wy=w
+C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V47:{
+V49:{
 "^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -17247,32 +17611,27 @@
 if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
 y=J.UQ(b,"type")
 z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
+switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.vO
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=D.dy
+z=D.Kp
 w=[]
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.vO
+z=D.dy
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[z]
-z=D.Kp
+z=D.dy
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+t=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,w,null,v,u,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.Fc]
@@ -17285,13 +17644,13 @@
 v.$builtinTypeInfo=[w]
 w=P.KN
 u=D.Db
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
+s=new V.qC(P.YM(null,null,null,w,u),null,null)
+s.$builtinTypeInfo=[w,u]
+t=new D.kx(null,0,0,0,0,0,z,x,v,s,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Error":t=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Function":s=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Function":t=new D.Kp(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Isolate":z=J.I2(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
@@ -17301,19 +17660,19 @@
 v.$builtinTypeInfo=[P.qU]
 u=[]
 u.$builtinTypeInfo=[D.ER]
-t=D.dy
+s=D.dy
 r=[]
-r.$builtinTypeInfo=[t]
+r.$builtinTypeInfo=[s]
 r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[t]
-t=D.U4
+r.$builtinTypeInfo=[s]
+s=D.U4
 q=[]
-q.$builtinTypeInfo=[t]
+q.$builtinTypeInfo=[s]
 q=new Q.wn(null,null,q,null,null)
-q.$builtinTypeInfo=[t]
-t=P.L5(null,null,null,P.qU,P.Vf)
-t=R.tB(t)
-s=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,t,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
+q.$builtinTypeInfo=[s]
+s=P.L5(null,null,null,P.qU,P.Vf)
+s=R.tB(s)
+t=new D.bv(x,null,!1,!1,!0,!1,w,new D.tL(v,u,null,null,20,0),null,r,null,q,null,null,null,null,null,s,new D.eK(0,0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,0,null,null),null,null,null,null,null,null,null,null,null,z,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -17336,32 +17695,32 @@
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
 z=D.Kp
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
+s=[]
+s.$builtinTypeInfo=[z]
+s=new Q.wn(null,null,s,null,null)
+s.$builtinTypeInfo=[z]
+t=new D.U4(null,x,w,v,u,s,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceError":t=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceEvent":s=new D.Mk(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceEvent":t=new D.Mk(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceException":t=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Script":z=D.c2
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
+t=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Socket":t=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
-return s},
-UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.mQ,"Null"))return
+t=new D.vO(z,a,null,null,!1,null,null,null,null,null)}t.eC(b)
+return t},
+UW:function(a){if(!!J.x(a).$isvO&&J.xC(a.Fz,"Null"))return
 return a},
 bF:function(a){var z
 if(a!=null){z=J.U6(a)
@@ -17373,7 +17732,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+for(z=a.XH,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -17383,67 +17742,67 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.P3},
-gwv:function(a){return J.I2(this.P3)},
-god:function(a){return J.aT(this.P3)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.P3.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
+gXP:function(){return this.x8},
+gwv:function(a){return J.I2(this.x8)},
+god:function(a){return J.aT(this.x8)},
+gjO:function(a){return this.TU},
+gzS:function(){return this.Fz},
+gPj:function(a){return this.x8.YC(this.TU)},
+gox:function(a){return this.qu},
+gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gTX:function(){return this.gGR()},
-sTX:function(a){this.sGR(this.ct(this,C.Tc,this.gGR(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gM8())return P.Ab(this,null)
-z=this.v7
-if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.Bf(this)).YM(new D.n1(this))
-this.v7=z}return z},
+gTE:function(){return this.gGR()},
+sTE:function(a){this.sGR(this.ct(this,C.Tc,this.gGR(),a))},
+xW:function(a){if(this.qu)return P.Ab(this,null)
+return this.VD(0)},
+VD:function(a){var z
+if(J.xC(this.TU,""))return P.Ab(this,null)
+if(this.qu&&this.gM8())return P.Ab(this,null)
+z=this.mQ
+if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.Bf(this)).wM(new D.n1(this))
+this.mQ=z}return z},
 eC:function(a){var z,y,x,w
 z=J.U6(a)
 y=J.co(z.t(a,"type"),"@")
 x=z.t(a,"type")
 w=J.rY(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,165,200],
+w=this.TU
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
+this.Fz=x
+this.R5(0,a,y)},
+YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,169,201],
 $isaf:true},
 Bf:{
-"^":"Xs:202;a",
+"^":"Xs:203;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
+if(!J.xC(z,y.Fz))return D.Nl(y.x8,a)
 y.eC(a)
-return y},"$1",null,2,0,null,201,"call"],
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 n1:{
-"^":"Xs:74;b",
-$0:[function(){this.b.v7=null},"$0",null,0,0,null,"call"],
+"^":"Xs:76;b",
+$0:[function(){this.b.mQ=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5())},
-lh:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gWp",0,0,203]},
+O5:function(a){J.Me(a,new D.P5(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,204]},
 P5:{
-"^":"Xs:13;",
+"^":"Xs:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,204,"call"],
+z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,205,"call"],
 $isEH:true},
 Rv:{
-"^":"Xs:202;a",
+"^":"Xs:203;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,201,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -17451,73 +17810,74 @@
 "^":"O1w;Li<,G2<,Rk>",
 gwv:function(a){return this},
 god:function(a){return},
-giR:function(){var z=this.z7
+gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gua",2,0,165,200],
+gPj:function(a){return H.d(this.TU)},
+YC:[function(a){return H.d(a)},"$1","gua",2,0,169,201],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gcD:function(){return this.kU},
+gdW:function(){return this.Va},
+gU6:function(){return this.kU},
 gPE:function(){return this.l7},
-EM:function(a){var z,y,x,w,v
+hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
-try{y=this.ng(a)
+try{y=this.hb(a)
 z.a=y
-x=y}catch(w){H.Ru(w)
+if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
 N.QM("").YX("Ignoring malformed event message: "+H.d(a))
-return}if(!J.xC(J.UQ(x,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
-return}v=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.B7(v).ml(new D.jy(z,this,v))},
-jq:function(a){var z,y,x,w
+return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
+return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
+this.wD(w).ml(new D.jy(z,this,w))},
+EM:function(a){return this.hQ(a,null)},
+BC:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
-y=z.QK
+y=z.pX
 x=y.input
 w=y.index
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
-jz:function(a){var z,y,x
+ZS:function(a){var z,y,x
 z=$.fA().R4(0,a)
 if(z==null)return""
-y=z.QK
+y=z.pX
 x=y.index
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.nO(null))},
-B7:function(a){var z
+wD:function(a){var z
 if(J.xC(a,""))return P.Ab(null,null)
-z=this.z7.t(0,a)
+z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
+return this.VD(0).ml(new D.MZ(this,a))},
 cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.jz(a)
-y=this.jq(a)
-return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
-if(x!=null)return J.cI(x)
-return this.jU(a).ml(new D.aEE(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,80],
-ng:function(a){var z,y,x
+if(J.co(a,"isolates/")){z=this.ZS(a)
+y=this.BC(a)
+return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
+if(x!=null)return J.LE(x)
+return this.jU(a).ml(new D.oew(this,a))},
+B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gcO())
+try{y=new P.c5(this.gJ2())
 z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
 return}return R.tB(z)},
-N7:function(a){var z
+OJ:function(a){var z
 if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
 return P.Vu(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
 if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.Nl(this,a),null,null)
 else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
-bF:function(a,b,c){var z,y
+jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.bp(this),new D.hc())},
+R5:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -17533,9 +17893,9 @@
 this.kU=F.Wi(this,C.uI,this.kU,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
+this.y8(z.t(b,"isolates"))},
+y8:function(a){var z,y,x,w,v,u
+z=this.Qi
 y=P.L5(null,null,null,P.qU,D.bv)
 for(x=J.mY(a);x.G();){w=x.gl()
 v=J.UQ(w,"id")
@@ -17543,11 +17903,11 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
-this.z7=y},
+N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
+this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.Tc,this.GR,"vm")
-this.Qy.u(0,"vm",this)
+this.uj.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
 this.eC(R.tB(z))},
 $iswv:true},
@@ -17555,91 +17915,91 @@
 "^":"xm+Pi;",
 $isd3:true},
 jy:{
-"^":"Xs:13;a,b,c",
+"^":"Xs:12;a,b,c",
 $1:[function(a){var z,y
 if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
 else{z=D.Nl(a,this.a.a)
 y=this.b.Rk
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)}},"$1",null,2,0,null,205,"call"],
+if(y.YM>=4)H.vh(y.Pq())
+y.MW(z)}},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 MZ:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,143,"call"],
+return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-it:{
-"^":"Xs:13;a,b",
+aEE:{
+"^":"Xs:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
 z=this.b
-if(z==null)return J.cI(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+if(z==null)return J.LE(a)
+else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-aEE:{
-"^":"Xs:202;c,d",
+oew:{
+"^":"Xs:203;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
-if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,201,"call"],
+if(y.gjm())z.uj.to(0,this.d,new D.QZ(y))
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 QZ:{
-"^":"Xs:74;e",
+"^":"Xs:76;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
-y=z.ng(a)
+y=z.hb(a)
 x=$.ax
-if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
-return z.N7(y)},"$1",null,2,0,null,146,"call"],
+if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
+return z.OJ(y)},"$1",null,2,0,null,150,"call"],
 $isEH:true},
 tm:{
-"^":"Xs:13;c",
+"^":"Xs:12;c",
 $1:[function(a){var z=this.c.G2
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Vu(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
-"^":"Xs:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 bp:{
-"^":"Xs:13;d",
+"^":"Xs:12;d",
 $1:[function(a){var z=this.d.Li
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,89,"call"],
+if(z.YM>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Vu(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 hc:{
-"^":"Xs:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
+"^":"Xs:12;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Yu:{
-"^":"Xs:80;",
-$2:function(a,b){J.cI(b)},
+"^":"Xs:81;",
+$2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
-"^":"a;SP,XE>,OQ",
+"^":"a;SP,XE>,jf",
 eK:function(a){var z,y,x,w,v
 z=this.XE
-H.na(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.OQ
+H.h8(z,0,a)
+for(y=z.length,x=0;x<y;++x){w=this.jf
 v=z[x]
 if(typeof v!=="number")return H.s(v)
-this.OQ=w+v}},
-y8:function(a,b){var z,y,x,w,v,u,t
+this.jf=w+v}},
+pg:function(a,b){var z,y,x,w,v,u,t
 for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.Hn(u,b[v])
 z[v]=u
-t=this.OQ
+t=this.jf
 if(typeof u!=="number")return H.s(u)
-this.OQ=t+u}},
+this.jf=t+u}},
 k5:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
@@ -17650,58 +18010,60 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+y[w]=J.xZ(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,Hx,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=a
+"^":"a;af<,Fw<,u1,Ob,Eq,kL",
+gvh:function(){return this.u1},
+Qv:function(a,b){var z,y,x,w,v,u
+this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
-this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
+this.kL=J.q8(z.t(b,"counters"))
+for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
+if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
+x.push(u)}z=this.kL
+if(typeof z!=="number")return H.s(z)
+z=Array(z)
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.Hx=z
+this.Ob=z
 z.eK(y)
-return}z=this.QS
+return}z=this.kL
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.Hx.XE)
-this.Hx.k5(0,y)
-z=this.lI
+u.pg(y,this.Ob.XE)
+this.Ob.k5(0,y)
+z=this.Fw
 z.push(u)
-if(z.length>this.hD)C.Nm.W4(z,0)}},
+if(z.length>this.Eq)C.Nm.W4(z,0)}},
 eK:{
-"^":"Pi;mV,ob,pX,yp,Og,hu,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
+"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
+gSU:function(){return this.zd},
+gkV:function(){return this.ob},
+gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
 gqZ:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
+this.zd=F.Wi(this,C.LP,this.zd,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
+this.j8=F.Wi(this,C.h7,this.j8,y)
 y=z.t(a,"collections")
 this.yp=F.Wi(this,C.J6,this.yp,y)
 y=z.t(a,"time")
@@ -17709,71 +18071,71 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,Qy,GH,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,ip,yv,BC<,FF,bj,iD<,QR,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gwv:function(a){return this.P3},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gwv:function(a){return this.x8},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
+gPj:function(a){return"/"+H.d(this.TU)},
 gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
+gGL:function(){return this.EY},
 gaj:function(){return this.eU},
-gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,165,200],
+gn0:function(){return this.yP},
+YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,169,201],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.hr(a,z)
+this.I1()
+this.nN(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.aU(w,z)},
-c2:function(){var z=this.Qy
+if(w!=null)this.qo=this.Jm(w,z)},
+I1:function(){var z=this.uj
 z.gUQ(z).aN(0,new D.iz())},
-hr:function(a,b){var z,y,x,w
+nN:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").Il(w,b,x)}},
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gMh())},
-ND:[function(a){var z,y,x,w
+WR:function(){return this.cv("classes").ml(this.gLG()).ml(this.gHB())},
+d8:[function(a){var z,y,x,w
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,206,207],
-Nz:[function(a){var z,y,x,w
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,207,208],
+lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
 this.Wm=F.Wi(this,C.jo,this.Wm,null)
 for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
+if(x.gAY()==null)z.h(0,x)
+if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,208,209],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,209,210],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
-y=this.Qy
+y=this.uj
 x=y.t(0,z)
 if(x!=null)return x
 x=D.Nl(this,a)
-if(x!=null&&x.gUm())y.u(0,z,x)
+if(x!=null&&x.gjm())y.u(0,z,x)
 return x},
-cv:function(a){var z=this.Qy.t(0,a)
-if(z!=null)return J.cI(z)
-return this.P3.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gmq:function(){return this.Wm},
+cv:function(a){var z=this.uj.t(0,a)
+if(z!=null)return J.LE(z)
+return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.Wm},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
 gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gTX:function(){return this.f5},
-sTX:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
+gTE:function(){return this.f5},
+sTE:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
+gIT:function(){return this.i9},
 gw2:function(){return this.cL},
 sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gkc:function(a){return this.yv},
@@ -17781,7 +18143,7 @@
 Bs:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o
+R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.i9=F.Wi(this,C.wT,this.i9,y)
@@ -17790,7 +18152,7 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.Tc,this.f5,y)
 if(c)return
-this.kT=!0
+this.qu=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 x=z.t(b,"pauseEvent")
@@ -17827,7 +18189,7 @@
 while(!0){q=r.gB(v)
 if(typeof q!=="number")return H.s(q)
 if(!(s<q))break
-J.kW(this.V3,r.t(v,s),C.CD.Sy(J.X9(y.t(u,s),t)*100,2)+"%");++s}}}p=P.Fl(null,null)
+J.kW(this.V3,r.t(v,s),C.CD.Sy(J.L9(y.t(u,s),t)*100,2)+"%");++s}}}p=P.Fl(null,null)
 J.Me(z.t(b,"timers"),new D.Qq(p))
 y=this.Y8
 r=J.w1(y)
@@ -17854,42 +18216,42 @@
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
-m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-aU:function(a,b){this.FF=0
-this.bj=a
+xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.n5=0
+this.l9=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.tw(b)},
-tw:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
+return this.ci(b)},
+ci:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.l9
+y=this.n5
 if(typeof y!=="number")return y.g()
-this.FF=y+1
+this.n5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.bj
-z=this.FF
+y=this.l9
+z=this.n5
 if(typeof z!=="number")return z.g()
-this.FF=z+1
+this.n5=z+1
 v=J.UQ(y,z)
 z=[]
 z.$builtinTypeInfo=[D.D5]
 u=new D.D5(w,v,z,0)
-y=this.bj
-t=this.FF
+y=this.l9
+t=this.n5
 if(typeof t!=="number")return t.g()
-this.FF=t+1
+this.n5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.tw(a)
+for(;r<s;++r){q=this.ci(a)
 z.push(q)
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
 u.Jv=y+t}return u},
-pU:function(a){var z,y,x,w,v,u
+Eb:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=J.UQ(z.t(a,"location"),"script")
 x=J.UQ(z.t(a,"location"),"tokenPos")
@@ -17898,10 +18260,10 @@
 J.UQ(z.gGd(y),J.Hn(w,1)).sqr(a)}else{z=z.xW(y)
 z.toString
 v=$.X3
-u=new P.Gc(0,v,null,null,v.wY(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
+u=new P.Gc(0,v,null,null,v.cR(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
 u.$builtinTypeInfo=[null]
-z.au(u)}},
-CE:function(a){var z,y,x,w,v,u
+z.xf(u)}},
+eF:function(a){var z,y,x,w,v,u
 z=this.iD
 if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -17909,19 +18271,20 @@
 v=J.UQ(x.t(y,"location"),"tokenPos")
 x=J.RE(w)
 if(x.gox(w)===!0){u=w.q6(v)
-J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.pU(z.gl())
+J.UQ(x.gGd(w),J.Hn(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.Eb(z.gl())
 this.iD=a},
-Xb:function(){var z=this.QR
-if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).YM(new D.Cm(this))
-this.QR=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.fx(this,a,b))},
-h4:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-yy:[function(a){return this.cv("debug/pause").ml(new D.ry(this))},"$0","gX0",0,0,203],
-QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,203],
-fV:[function(a){P.FL("isolate.stepInto")
-return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,203],
-PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.bP(this))},"$0","gqF",0,0,203],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gVX",0,0,203],
+Xb:function(){var z=this.hz
+if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
+this.hz=z}return z},
+G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
+WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,204],
+QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,204],
+Lg:[function(a){P.FL("isolate.stepInto")
+return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,204],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,204],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,204],
+bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -17930,142 +18293,142 @@
 "^":"PKX+Pi;",
 $isd3:true},
 iz:{
-"^":"Xs:13;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
+"^":"Xs:12;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,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,"")
 C.Nm.sB(a.VS,0)
 C.Nm.sB(a.hw,0)
-a.Oo.V1(0)}},
+a.n3.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"Xs:202;a,b",
+"^":"Xs:203;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
-if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,201,"call"],
+if(y.gjm())z.uj.to(0,this.b,new D.Ea(y))
+return y},"$1",null,2,0,null,202,"call"],
 $isEH:true},
 Ea:{
-"^":"Xs:74;c",
+"^":"Xs:76;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Xs:13;a",
+"^":"Xs:12;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,210,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,211,"call"],
 $isEH:true},
-AP:{
-"^":"Xs:202;a",
+O5:{
+"^":"Xs:203;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
-y=this.a.GH
-y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,159,"call"],
+y=this.a.KJ
+y.Qv(z/1000,a)
+return y},"$1",null,2,0,null,163,"call"],
 $isEH:true},
 Ye:{
-"^":"Xs:13;a,b",
-$1:[function(a){this.a.pU(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Xs:12;a,b",
+$1:[function(a){this.a.Eb(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 y4:{
-"^":"Xs:13;a",
-$1:[function(a){this.a.CE(a)},"$1",null,2,0,null,211,"call"],
+"^":"Xs:12;a",
+$1:[function(a){this.a.eF(a)},"$1",null,2,0,null,212,"call"],
 $isEH:true},
 Cm:{
-"^":"Xs:74;b",
-$0:[function(){this.b.QR=null},"$0",null,0,0,null,"call"],
+"^":"Xs:76;b",
+$0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-fx:{
-"^":"Xs:13;a,b,c",
+ad:{
+"^":"Xs:12;a,b,c",
 $1:[function(a){if(!!J.x(a).$ispD)J.UQ(J.de(this.b),J.Hn(this.c,1)).sj9(!1)
-return this.a.Xb()},"$1",null,2,0,null,143,"call"],
+return this.a.Xb()},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 fw:{
-"^":"Xs:13;a,b",
+"^":"Xs:12;a,b",
 $1:[function(a){var z,y
 if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.RE(0)
-else return z.Xb()},"$1",null,2,0,null,143,"call"],
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+else return z.Xb()},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-ry:{
-"^":"Xs:13;a",
+G4:{
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 LO:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 qD:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
-bP:{
-"^":"Xs:13;a",
+A6:{
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 xK:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){if(!!J.x(a).$ispD)N.QM("").YX(a.LD)
-return this.a.RE(0)},"$1",null,2,0,null,143,"call"],
+return this.a.VD(0)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;RF,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return(J.xC(this.Fz,"Class")||J.xC(this.Fz,"Function")||J.xC(this.Fz,"Field"))&&!J.co(this.TU,$.RQ)},
 gM8:function(){return!1},
-bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,71],
-bF:function(a,b,c){var z,y,x
-this.kT=!c
+R5:function(a,b,c){var z,y,x
+this.qu=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
+y=z.LL
+x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
-y=y.t(0,"name")
+y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.Tc,this.GR,y)
-D.kT(z,this.P3)},
+D.kT(z,this.x8)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-x4:function(a,b){return this.RF.Zp.x4(0,b)},
-aN:function(a,b){return this.RF.Zp.aN(0,b)},
+NZ:function(a,b){return this.RF.LL.NZ(0,b)},
+aN:function(a,b){return this.RF.LL.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.Zp.t(0,b)},
+t:function(a,b){return this.RF.LL.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.Zp
+gl0:function(a){var z=this.RF.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.Zp
+gor:function(a){var z=this.RF.LL
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.Zp
+gvc:function(a){var z=this.RF.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.Zp
+gUQ:function(a){var z=this.RF.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.Zp
+gB:function(a){var z=this.RF.LL
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,123],
+return z.HC(z)},"$0","gDx",0,0,125],
 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)},
-Tr:[function(a){return},"$0","gqw",0,0,18],
-dt:[function(a){this.RF.AP=null
-return},"$0","gym",0,0,18],
+w37:[function(a){return},"$0","gcm",0,0,17],
+dt:[function(a){this.RF.Vg=null
+return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.AP
+z=this.RF.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
+bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -18074,18 +18437,18 @@
 $isd3:true,
 static:{"^":"RQ"}},
 pD:{
-"^":"wVq;I0,LD,jo,Ne,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
-y=this.P3
+y=this.x8
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -18094,16 +18457,17 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.Tc,this.GR,z)},
+bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $ispD:true},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"dZL;I0,LD,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.kT=!0
+R5:function(a,b,c){var z,y
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -18113,16 +18477,17 @@
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
 this.GR=this.ct(this,C.Tc,this.GR,z)},
+bu:[function(a){return"ServiceError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
 $isN7:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"w8F;I0,LD,IV,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -18139,14 +18504,15 @@
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfG:function(a){return this.eq},
 gQ1:function(){return this.HQ},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y
-this.kT=!0
-D.kT(b,this.P3)
+gRn:function(a){return this.ZK},
+R5:function(a,b,c){var z,y
+this.qu=!0
+D.kT(b,this.x8)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -18156,18 +18522,23 @@
 this.bN=y
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){z=z.t(b,"exception")
-this.jo=F.Wi(this,C.ne,this.jo,z)}},
+this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
+this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
+bu:[function(a){var z,y
+z="ServiceEvent of type "+H.d(this.eq)+" with "
+y=this.ZK
+return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,73],
 $isMk:true},
 V4b:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gO3:function(a){return this.dj},
-gUm:function(){return!0},
+gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
+R5:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
@@ -18176,24 +18547,24 @@
 w=J.U6(y)
 v=w.cn(y,"/")
 if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"user_name")
+x=w.yn(y,v+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
-y=z.t(b,"name")
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=this.Bm
 y.V1(y)
 w=J.dF(z.t(b,"imports")).br(0)
-H.rd(w,D.E0())
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
 w=J.dF(z.t(b,"scripts")).br(0)
-H.rd(w,D.E0())
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
@@ -18207,6 +18578,7 @@
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())},
+bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
@@ -18214,83 +18586,82 @@
 "^":"T5W+Pi;",
 $isd3:true},
 mT:{
-"^":"Pi;wf,rT,AP,fn",
+"^":"Pi;wf,wY,Vg,fn",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gfj:function(){return this.rT}},
+gfj:function(){return this.wY}},
 Iy:{
-"^":"a;hb<,l<",
+"^":"a;EJ<,l<",
 eC:function(a){var z,y,x
-z=this.hb
+z=this.EJ
 y=J.U6(a)
 x=y.t(a,6)
 z.wf=F.Wi(z,C.yB,z.wf,x)
 x=y.t(a,7)
-z.rT=F.Wi(z,C.hN,z.rT,x)
+z.wY=F.Wi(z,C.hN,z.wY,x)
 x=this.l
 z=J.WB(y.t(a,2),y.t(a,4))
 x.wf=F.Wi(x,C.yB,x.wf,z)
 y=J.WB(y.t(a,3),y.t(a,5))
-x.rT=F.Wi(x,C.hN,x.rT,y)},
-static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
+x.wY=F.Wi(x,C.hN,x.wY,y)},
+static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,kJ,f2,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.kJ},
-suj:function(a){this.kJ=F.Wi(this,C.Cw,this.kJ,a)},
-gVM:function(){return this.f2},
-gRs:function(){return this.vY},
-gi2:function(){return this.J1},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVM:function(){return this.Lh},
+gRs:function(){return this.GQ},
+geh:function(){return this.J1},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 gMp:function(){var z,y
 z=this.UY
-y=z.hb
-if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1
+y=z.EJ
+if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
+z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1
 if(z){z=this.xQ
-y=z.hb
-if(J.xC(y.wf,0)&&J.xC(y.rT,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.rT,0)}else z=!1}else z=!1
+y=z.EJ
+if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
+z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1}else z=!1
 return z},
-gUm:function(){return!0},
+gAY:function(){return this.k9},
+sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
+gjm:function(){return!0},
 gM8:function(){return!1},
-bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,71],
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x,w
 z=J.U6(b)
-y=z.t(b,"user_name")
-this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"abstract")
-this.f2=F.Wi(this,C.XH,this.f2,y)
+this.Lh=F.Wi(this,C.XH,this.Lh,y)
 y=z.t(b,"const")
-this.vY=F.Wi(this,C.Nr,this.vY,y)
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
 y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,y)
+this.GU=F.Wi(this,C.WV,this.GU,y)
 y=z.t(b,"patch")
 this.J1=F.Wi(this,C.XL,this.J1,y)
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.S5
+y=this.LT
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
 y.GT(y,D.E0())
@@ -18303,19 +18674,26 @@
 y.FV(0,z.t(b,"functions"))
 y.GT(y,D.E0())
 y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.kJ,y)
-this.kJ=y
-if(y!=null)y.Ib(this)
+y=F.Wi(this,C.FZ,this.k9,y)
+this.k9=y
+if(y!=null&&J.xC(J.DA(y),"Object"))this.k9.u2(this)
 y=z.t(b,"error")
 this.yv=F.Wi(this,C.yh,this.yv,y)
 x=z.t(b,"allocationStats")
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.Gs(z,a))return
-z.h(0,a)},
-cv:function(a){return J.aT(this.P3).cv(J.WB(this.r0,"/"+H.d(a)))},
+this.xQ.eC(z.t(x,"old"))
+y=this.dQ
+w=z.t(x,"promotedInstances")
+y.wf=F.Wi(y,C.yB,y.wf,w)
+z=z.t(x,"promotedBytes")
+y.wY=F.Wi(y,C.hN,y.wY,z)}},
+u2:function(a){var z=this.LT
+if(z.tg(z,a))return
+z.h(0,a)
+z.GT(z,D.E0())},
+cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
+bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
 "^":"af+boh;"},
@@ -18323,16 +18701,16 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 ma:{
-"^":"a;zt",
-bu:[function(a){return this.zt},"$0","gAY",0,0,74],
-Q2:function(){return C.Nm.Gs([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.YF()
+"^":"a;Sf",
+bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
+Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
 case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.GG()
+case"kGetterFunction":return $.xW()
 case"kSetterFunction":return $.Kw()
 case"kConstructor":return $.kj()
-case"kImplicitGetterFunction":return $.d9()
-case"kImplicitSetterFunction":return $.AH()
+case"kImplicitGetter":return $.d9()
+case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
@@ -18342,23 +18720,23 @@
 case"Tag":return $.zx()
 case"Reused":return $.MQ()}return $.lC()}}},
 Kp:{
-"^":"S6L;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"S6L;MD,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gEl:function(){return this.MD},
 sEl:function(a){this.MD=F.Wi(this,C.YV,this.MD,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRs:function(){return this.vY},
+gRs:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
-gtT:function(a){return this.TD},
-stT:function(a,b){this.TD=F.Wi(this,C.i4,this.TD,b)},
+gtT:function(a){return this.v5},
+stT:function(a,b){this.v5=F.Wi(this,C.i4,this.v5,b)},
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
@@ -18368,16 +18746,16 @@
 gUx:function(){return this.Ni},
 gSu:function(){return this.kE},
 gni:function(){return this.Z4},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
-y=z.t(b,"user_name")
-this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.t(b,"name")
+this.bN=this.ct(this,C.YS,this.bN,y)
+y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.Tc,this.GR,y)
-D.kT(b,J.aT(this.P3))
-y=z.x4(b,"owningClass")===!0?z.t(b,"owningClass"):null
+D.kT(b,J.aT(this.x8))
+y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.MD=F.Wi(this,C.YV,this.MD,y)
-y=z.x4(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
+y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
 this.EG=F.Wi(this,C.If,this.EG,y)
 y=D.Ez(z.t(b,"kind"))
 y=F.Wi(this,C.Lc,this.I0,y)
@@ -18385,33 +18763,33 @@
 y=y.Q2()
 this.Z4=F.Wi(this,C.a0,this.Z4,!y)
 if(c)return
-y=z.t(b,"isStatic")
+y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"isConst")
-this.vY=F.Wi(this,C.Nr,this.vY,y)
+y=z.t(b,"const")
+this.GQ=F.Wi(this,C.Nr,this.GQ,y)
 y=z.t(b,"parent")
 this.fd=F.Wi(this,C.nX,this.fd,y)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
 y=D.UW(z.t(b,"code"))
-this.TD=F.Wi(this,C.i4,this.TD,y)
-y=D.UW(z.t(b,"unoptimized_code"))
+this.v5=F.Wi(this,C.i4,this.v5,y)
+y=D.UW(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
-y=z.t(b,"is_optimizable")
+y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
-y=z.t(b,"is_inlinable")
+y=z.t(b,"inlinable")
 this.H7=F.Wi(this,C.MY,this.H7,y)
 y=z.t(b,"deoptimizations")
 this.XN=F.Wi(this,C.eR,this.XN,y)
-z=z.t(b,"usage_counter")
+z=z.t(b,"usageCounter")
 this.kE=F.Wi(this,C.yv,this.kE,z)
 z=this.fd
 if(z==null){z=this.MD
-z=z!=null?H.d(J.O6(z))+"."+H.d(this.bN):this.bN
+z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
@@ -18421,9 +18799,9 @@
 "^":"wvY+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;Is>,Rd>,a4>,x9,Yp,am,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
+gc1:function(){return this.x9},
+sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
 sqr:function(a){var z=this.Yp
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
@@ -18434,7 +18812,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.Is,y=J.mY(J.UQ(J.aT(z.P3).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -18449,55 +18827,55 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
 z=J.It(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.lo,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.It(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
-gUm:function(){return!0},
+gjm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){var z,y
 z=J.Hn(a,1)
-y=this.Gd.ao
+y=this.Gd.XH
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
-q6:function(a){return this.y6.t(0,a)},
-bF:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.P3))
+q6:function(a){return this.MO.t(0,a)},
+R5:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
-this.wA=y
+this.zD=y
 x=J.U6(y)
 w=x.cn(y,"/")
 if(typeof w!=="number")return w.g()
 w=x.yn(y,w+1)
-this.Ge=w
+this.yc=w
 this.bN=this.ct(this,C.YS,this.bN,w)
-w=this.wA
+w=this.zD
 this.GR=this.ct(this,C.Tc,this.GR,w)
 if(c)return
-this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))
-z=z.t(b,"owning_library")
+this.Aj(z.t(b,"source"))
+this.YG(z.t(b,"tokenPosTable"))
+z=z.t(b,"owningLibrary")
 this.EG=F.Wi(this,C.If,this.EG,z)},
-PT:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+YG:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
-z=this.y6
+z=this.MO
 z.V1(0)
-y=this.FB
+y=this.aQ
 y.V1(0)
-this.U9=F.Wi(this,C.Gd,this.U9,null)
+this.E4=F.Wi(this,C.Gd,this.E4,null)
 this.nE=F.Wi(this,C.kA,this.nE,null)
 x=P.Ls(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
@@ -18510,29 +18888,29 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.U9
+r=this.E4
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=q
+this.nq(this,r)}this.E4=q
 r=this.nE
 if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.U9:q
-o=this.U9
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
+o=this.E4
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.U9=r
+this.nq(this,o)}this.E4=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
-if(!x.Gs(0,J.f2(v)))v.sj9(!1)}},
-SC:function(a){var z,y,x,w,v,u,t
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
+if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
+lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
-y=this.d6
+y=this.p3
 x=0
 while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
@@ -18541,21 +18919,21 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
+x+=2}this.f2()},
+Aj:function(a){var z,y,x,w
+this.qu=!1
 if(a==null)return
 z=J.It(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.qu=!0
 y=this.Gd
 y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.zL()},
-zL:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,J.f2(x)))}},
+y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+f2:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
+x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
@@ -18566,15 +18944,15 @@
 "^":"a;Yu<,Du<,fF<",
 $isDb:true},
 Z9:{
-"^":"Pi;Yu<,LR,VF<,Yn,fY>,ar,up,AP,fn",
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gJz:function(){return this.up},
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gmE:function(){return this.up},
 JM:[function(){var z,y
-z=this.LR
+z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,71],
+return y.bu(z)},"$0","gkA",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -18586,28 +18964,28 @@
 this.up=F.Wi(this,C.oI,this.up,z)},
 $isZ9:true},
 Q4:{
-"^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
 gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
+gX1:function(){return this.uH.XH.length>0},
 dV:[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,71],
-io:[function(a){var z
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,73],
+tU:[function(a){var z
 if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,212,76],
-HU:[function(a){var z
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,213,78],
+P7:[function(a){var z
 if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,212,76],
-eQ:function(){var z,y,x,w
-y=J.It(this.L4," ")
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,213,78],
+lF:function(){var z,y,x,w
+y=J.It(this.u0," ")
 x=y.length
 if(x!==2)return 0
 if(1>=x)return H.e(y,1)
@@ -18616,23 +18994,23 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-ju:function(a){var z,y,x,w,v
-z=this.L4
+pj:function(a){var z,y,x,w,v
+z=this.u0
 if(!J.co(z,"j"))return
-y=this.eQ()
+y=this.lF()
 x=J.x(y)
 if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
+return}for(z=a.XH,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
 return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{dJ:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{dJ:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,71],
+bu:[function(a){return this.uX},"$0","gCR",0,0,73],
 static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
@@ -18648,32 +19026,32 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $isD5:true},
 kx:{
-"^":"Zqa;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,qH,JK,uG,ar,MH,oc*,TE@,Mk,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
 gan:function(){return this.qH},
 gL1:function(){return this.JK},
 sL1:function(a){this.JK=F.Wi(this,C.zO,this.JK,a)},
-gig:function(a){return this.MO},
-sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gYG:function(){return this.MH},
-gUm:function(){return!0},
+gig:function(a){return this.uG},
+sig:function(a,b){this.uG=F.Wi(this,C.nf,this.uG,b)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+goF:function(){return this.MH},
+gjm:function(){return!0},
 gM8:function(){return!0},
-tx:[function(a){var z,y
+P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,213,214],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,214,215],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
-var z=this.MO
+var z=this.uG
 if(z==null)return
-if(J.zH(z)==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.zH(this.MO)).ml(this.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
+if(J.KL(z)==null){J.SK(this.uG).ml(new D.Em(this))
+return}J.SK(J.KL(this.uG)).ml(this.gH8())},
+VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-bd:function(a,b,c){var z,y,x,w,v
+ui:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -18683,46 +19061,46 @@
 v=H.BU(z.t(b,y+1),null,null)
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.Fc(c[w],v))
-y+=2}H.rd(a,new D.Cq())},
+y+=2}H.ig(a,new D.fx())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,c)
+this.xM=F.Wi(this,C.kr,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.hw,z.t(a,"callees"),b)
+this.ui(this.VS,z.t(a,"callers"),b)
+this.ui(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
-if(y!=null)this.qL(y)
+if(y!=null)this.Zk(y)
 z=D.RA(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.RA(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v,u
+R5:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.TX=z.t(b,"name")
-y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
+this.oc=z.t(b,"name")
+this.TE=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.oc
+y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
 this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.P3
+this.uE=H.BU(z.t(b,"end"),16,null)
+y=this.x8
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,w)
-y=x.god(y).Qn(z.t(b,"object_pool"))
+this.uG=F.Wi(this,C.nf,this.uG,w)
+y=x.god(y).Qn(z.t(b,"objectPool"))
 this.JK=F.Wi(this,C.zO,this.JK,y)
 v=z.t(b,"disassembly")
-if(v!=null)this.xs(v)
+if(v!=null)this.u5(v)
 u=z.t(b,"descriptors")
-if(u!=null)this.WY(J.UQ(u,"members"))
-z=this.va.ao
-this.kT=z.length!==0||!J.xC(this.I0,C.l8)
+if(u!=null)this.Xd(J.UQ(u,"members"))
+z=this.va.XH
+this.qu=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
-gvS:function(){return this.Mk},
-xs:function(a){var z,y,x,w,v,u,t,s
+gUa:function(){return this.Mk},
+u5:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 z.V1(z)
 y=J.U6(a)
@@ -18739,22 +19117,22 @@
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.ju(z)},
-QX:function(a){var z,y,x,w,v,u,t
+x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
+MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
 if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
+Xd:function(a){var z
+for(z=J.mY(a);z.G();)this.MY(z.gl())},
+Zk:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=this.Oo
+y=this.n3
 x=0
 while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
@@ -18762,30 +19140,30 @@
 v=H.BU(z.t(a,x),16,null)
 y.u(0,v,new D.Db(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
-Gs:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.Mb)},
+tg:function(a,b){var z=J.Wx(b)
+return z.F(b,this.vg)&&z.C(b,this.uE)},
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{RA:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{RA:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.zH(z.MO)
+y=J.KL(z.uG)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,215,"call"],
+J.SK(y).ml(z.gH8())},"$1",null,2,0,null,216,"call"],
 $isEH:true},
-Cq:{
-"^":"Xs:80;",
+fx:{
+"^":"Xs:81;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,71],
-static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
+bu:[function(a){return this.uX},"$0","gCR",0,0,73],
+static:{"^":"Cnk,qp,FJy,wr",B4:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -18793,21 +19171,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"D3i;V8@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
-gUm:function(){return!0},
+"^":"D3i;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
 gaB:function(a){return this.vu},
 gm8:function(){return this.DB},
-gV0:function(){return this.XK},
+gaU:function(){return this.XK},
 gaP:function(){return this.FH},
 gzM:function(){return this.L7},
-gx5:function(){return this.zw},
+gki:function(){return this.zw},
 giP:function(){return this.tO},
-gmd:function(){return this.HO},
+gfJ:function(){return this.HO},
 gNS:function(){return this.u8},
 gzK:function(){return this.EC},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -18816,8 +19194,8 @@
 y=D.B4(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.kT=!0
-D.kT(b,J.aT(this.P3))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=z.t(b,"readClosed")
 this.DB=F.Wi(this,C.I7,this.DB,y)
 y=z.t(b,"writeClosed")
@@ -18838,19 +19216,19 @@
 this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.V8=z.t(b,"owner")}},
+this.ip=z.t(b,"owner")}},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Xs:80;a,b",
+"^":"Xs:81;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
-$isEH:true}}],["service_common","package:observatory/service_common.dart",,L,{
+$isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
 "^":"a;eX@,A9<,oc*,w8<",
@@ -18868,44 +19246,45 @@
 z.UT(a)
 return z}}},
 U2:{
-"^":"a;jO>,mh<",
+"^":"a;jO>,qT<",
 $isU2:true},
 Uon:{
 "^":"wv;N>",
-gEH:function(){return this.bO.MM},
-Ue:function(){var z=this.DS.MM
-if(z.Gv===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}},
-giG:function(a){return this.DS.MM},
-je:function(a){if(this.xu)this.TU.bs.close()
-this.vt()
-this.Ue()},
+gEH:function(){return this.Tn.MM},
+FZ:function(){var z=this.Fq.MM
+if(z.YM===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(this)}},
+giG:function(a){return this.Fq.MM},
+je:function(a){if(this.Sl)this.Ra.bs.close()
+this.M0()
+this.FZ()},
 z6:function(a,b){var z,y,x
-if(!this.xu){this.xu=!0
-this.TU.Tc(this.N.gw8(),this.gBU(),this.gCC(),this.gyE(),this.gM5())}z=C.jn.bu(this.fW++)
+if(!this.Sl){this.Sl=!0
+this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
 x=new L.U2(b,y)
-if(this.TU.bs.readyState===1)this.L8(z,x)
-else this.hZ.u(0,z,x)
+if(this.Ra.bs.readyState===1)this.Mf(z,x)
+else this.WE.u(0,z,x)
 return y.MM},
-yg:[function(){this.vt()
-this.Ue()},"$0","gM5",0,0,18],
-os:[function(){this.vt()
-this.Ue()},"$0","gyE",0,0,18],
-yl5:[function(){var z,y
+abp:[function(){this.M0()
+this.FZ()},"$0","gNu",0,0,17],
+Xs:[function(){this.M0()
+this.FZ()},"$0","gCW",0,0,17],
+LNZ:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
 z.seX(y)
-this.uP()
-y=this.bO.MM
-if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$0","gBU",0,0,18],
-wDh:[function(a){var z,y,x,w,v
-z=C.xr.kV(a)
+this.e2()
+y=this.Tn.MM
+if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(this)}},"$0","gkQ",0,0,17],
+PW:[function(a){var z,y,x,w,v
+if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
+return}z=C.xr.iQ(a)
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
@@ -18913,65 +19292,84 @@
 w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
-return}v=this.AW.Rz(0,x)
+return}v=this.Td.Rz(0,x)
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gmh().MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","gCC",2,0,20],
-BF:function(a){a.aN(0,new L.dV(this))
+return}y=v.gqT().MM
+if(y.YM!==0)H.vh(P.w("Future already completed"))
+y.Xf(w)},"$1","gM3",2,0,19],
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-vt:function(){var z=this.AW
+M0:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
-this.BF(z)}z=this.hZ
+this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
-this.BF(z)}},
-uP:function(){var z=this.hZ
+this.ck(z)}},
+e2:function(){var z=this.WE
 if(z.X5===0)return
 N.QM("").To("Sending all delayed requests.")
-z.aN(0,this.grW())
+z.aN(0,this.ge8())
 z.V1(0)},
-L8:[function(a,b){var z,y
+Mf:[function(a,b){var z,y
 z=J.RE(b)
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.AW.u(0,a,b)
+this.Td.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.TU.bs.send(y)},"$2","grW",4,0,216]},
+this.Ra.bs.send(y)},"$2","ge8",4,0,217]},
+jF:{
+"^":"Xs:218;a",
+$1:[function(a){var z,y,x,w,v,u,t
+z=J.RE(a)
+y=z.mt(a,0,C.it)
+x=this.a
+w=z.gbg(a)
+v=z.gVl(a)
+if(typeof v!=="number")return v.g()
+w.toString
+u=x.Ur.Sw(H.GG(w,v+8,y))
+t=C.jn.g(8,y)
+v=z.gbg(a)
+w=z.gVl(a)
+if(typeof w!=="number")return w.g()
+z=z.gH3(a)
+if(typeof z!=="number")return z.W()
+x.hQ(u,J.nq(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
+$isEH:true},
 dV:{
-"^":"Xs:217;a",
+"^":"Xs:219;a",
 $2:function(a,b){var z,y
-z=b.gmh()
+z=b.gqT()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(y)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(y)},
+$isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V48;S4,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V50;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y,x,w
+static:{qa:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.U0.ZL(a)
+a.n9=x
+a.wy=w
+C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V48:{
+V50:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
+$isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V49;Xc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V51;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{bZp:function(a){var z,y,x,w
@@ -18980,65 +19378,74 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Vd.ZL(a)
+a.n9=x
+a.wy=w
+C.Vd.LX(a)
 C.Vd.XI(a)
 return a}}},
-V49:{
+V51:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
+$isd3:true}}],["","",,U,{
 "^":"",
 hA:{
 "^":"a;bs",
 Tc:function(a,b,c,d,e){var z=W.pS(a,null)
 this.bs=z
-z=H.VM(new W.RO(z,C.i6.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.lo(e)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.i6.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.j3(d)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.JL.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.Fz(b)),z.Sg),[H.u3(z,0)]).Zz()
+z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(new U.tv(c)),z.Sg),[H.u3(z,0)]).Zz()},
+z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
-xO:function(a){this.bs.close()}},
+xO:function(a){this.bs.close()},
+OI:function(a){var z,y
+z=new FileReader()
+z.readAsArrayBuffer(a)
+y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
+return y.gqG(y).ml(new U.OW(z))}},
 lo:{
-"^":"Xs:13;a",
-$1:[function(a){return this.a.$0()},"$1",null,2,0,null,218,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return this.a.$0()},"$1",null,2,0,null,220,"call"],
 $isEH:true},
 j3:{
-"^":"Xs:13;b",
-$1:[function(a){return this.b.$0()},"$1",null,2,0,null,219,"call"],
+"^":"Xs:12;b",
+$1:[function(a){return this.b.$0()},"$1",null,2,0,null,221,"call"],
 $isEH:true},
 Fz:{
-"^":"Xs:13;c",
-$1:[function(a){return this.c.$0()},"$1",null,2,0,null,219,"call"],
+"^":"Xs:12;c",
+$1:[function(a){return this.c.$0()},"$1",null,2,0,null,221,"call"],
 $isEH:true},
-tv:{
-"^":"Xs:220;d",
-$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,2,"call"],
+oy:{
+"^":"Xs:222;d",
+$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,87,"call"],
+$isEH:true},
+OW:{
+"^":"Xs:12;a",
+$1:[function(a){return J.nq(C.vm.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;bO,DS,N,hZ,AW,fW,xu,TU,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,Qy,z7,AP,fn,P3,r0,mQ,kT,bN,GR,v7,AP,fn",
+"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,Fz,qu,bN,GR,mQ,Vg,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
 giG:function(a){return this.rp.MM},
-q3:[function(a){var z,y,x,w,v
+j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
 x=J.UQ(z.gRn(a),"name")
@@ -19047,7 +19454,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,77],
+J.KD(v,w)},"$1","gDi",2,0,19,223],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -19058,19 +19465,19 @@
 this.S3.u(0,z,x)
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.u3(z,0)]).Zz()
+ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
+H.VM(new W.Ov(0,z.bi,z.fA,W.aF(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(this)}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+if(z.YM!==0)H.vh(P.w("Future already completed"))
+z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V50;Ll,Sa,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V52;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
-gKw:function(a){return a.Sa},
-sKw:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
-Xq:function(a){var z
+gl6:function(a){return a.Sa},
+sl6:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
+bc:function(a){var z
 switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.Ll)
 return z
@@ -19098,7 +19505,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.Ll)
 return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
+case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Null":case"Bigint":case"String":z=W.r3("instance-view",null)
 J.Qy(z,a.Ll)
 return z
 case"IO":z=W.r3("io-view",null)
@@ -19135,7 +19542,7 @@
 J.A4(z,a.Ll)
 return z
 case"Process":z=W.r3("io-process-view",null)
-J.aw(z,a.Ll)
+J.rL(z,a.Ll)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
 J.CJ(z,a.Ll)
@@ -19153,7 +19560,7 @@
 J.BC(z,a.Ll)
 return z
 case"Script":z=W.r3("script-view",null)
-J.ZI(z,a.Ll)
+J.ry(z,a.Ll)
 return z
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.Ll)
@@ -19164,15 +19571,15 @@
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
 return z}},
-vy:[function(a,b){var z,y,x
-this.pj(a)
+xJ:[function(a,b){var z,y,x
+this.D4(a)
 z=a.Ll
 if(z==null){N.QM("").To("Viewing null object.")
 return}y=z.gzS()
-x=this.Xq(a)
+x=this.bc(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,13,57],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
 $isTi:true,
 static:{Gvt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -19180,127 +19587,127 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Ns.ZL(a)
+a.n9=x
+a.wy=w
+C.Ns.LX(a)
 C.Ns.XI(a)
 return a}}},
-V50:{
+V52:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V51;dL,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gLC:function(a){return a.dL},
-sLC:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
+"^":"V53;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gBN:function(a){return a.dL},
+sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Rr.ZL(a)
-C.Rr.XI(a)
+a.n9=x
+a.wy=w
+C.Uav.LX(a)
+C.Uav.XI(a)
 return a}}},
-V51:{
+V53:{
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V52;GW,C7,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V54;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-zn:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,92,159],
-Cp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,92,159],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,157,221,101],
-static:{n2:function(a){var z,y,x,w
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,163],
+qc:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,163],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
+c.$0()},"$2","gus",4,0,161,224,102],
+static:{Wzx:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.fv.ZL(a)
-C.fv.XI(a)
+a.n9=x
+a.wy=w
+C.um.LX(a)
+C.um.XI(a)
 return a}}},
-V52:{
+V54:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V53;Jg,C7,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V55;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-zn:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,92,159],
-Cp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,92,159],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,157,221,101],
-static:{mA:function(a){var z,y,x,w
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,163],
+qc:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,163],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
+c.$0()},"$2","gus",4,0,161,224,102],
+static:{z0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.dl.ZL(a)
+a.n9=x
+a.wy=w
+C.dl.LX(a)
 C.dl.XI(a)
 return a}}},
-V53:{
+V55:{
 "^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
+$isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Vfx;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 gjT:function(a){return a.Pe},
 sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
-DZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,20,57],
+this.ct(a,C.k6,"",this.gXt(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
 this.gi6(a).Z6
 return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
+gXt:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gTX()},
+return z.gTE()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},
+return J.DA(z)},
 gWw:function(a){return J.FN(this.goc(a))},
 static:{lKH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -19309,22 +19716,76 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.HRc.ZL(a)
+a.n9=x
+a.wy=w
+C.HRc.LX(a)
 C.HRc.XI(a)
 return a}}},
-Vfx:{
+Dsd:{
 "^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+$isd3:true},
+f7:{
+"^":"V56;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gnv:function(a){return a.tY},
+snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
+pY:function(a){var z
+switch(a.tY.gzS()){case"Class":z=W.r3("class-ref",null)
+J.PP(z,a.tY)
+return z
+case"Code":z=W.r3("code-ref",null)
+J.PP(z,a.tY)
+return z
+case"Field":z=W.r3("field-ref",null)
+J.PP(z,a.tY)
+return z
+case"Function":z=W.r3("function-ref",null)
+J.PP(z,a.tY)
+return z
+case"Library":z=W.r3("library-ref",null)
+J.PP(z,a.tY)
+return z
+case"Array":case"Bigint":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Mint":case"Null":case"Smi":case"String":case"Type":z=W.r3("instance-ref",null)
+J.PP(z,a.tY)
+return z
+default:z=W.r3("span",null)
+J.t3(z,"<<Unknown service ref: "+H.d(a.tY)+">>")
+return z}},
+Qj:[function(a,b){var z,y,x
+this.D4(a)
+z=a.tY
+if(z==null){N.QM("").To("Viewing null object.")
+return}y=z.gzS()
+x=this.pY(a)
+if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
+return}a.appendChild(x)
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+static:{wzV:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.qU,W.I0)
+y=P.qU
+y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.Fl(null,null)
+w=P.Fl(null,null)
+a.f4=[]
+a.OD=!1
+a.kK=!1
+a.ZM=z
+a.ZQ=y
+a.n9=x
+a.wy=w
+C.J9.LX(a)
+C.J9.XI(a)
+return a}}},
+V56:{
+"^":"uL+Pi;",
+$isd3:true}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
@@ -19332,46 +19793,46 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 oew:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,114,1,222,106],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,115,2,225,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.zb.ZL(a)
+a.n9=x
+a.wy=w
+C.zb.LX(a)
 C.zb.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
+$isd3:true}}],["","",,A,{
 "^":"",
-Wq:{
-"^":"a;wq,IW,Mg,nN,ER,Ja,WI,tu",
-WO:function(a,b){return this.tu.$1(b)},
+rv:{
+"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
+WO:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.wq?"fields ":"")
+z.KF(this.kl?"fields ":"")
 z.KF(this.IW?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
 z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
+z.KF("annotations: "+H.d(this.BY))
+z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-return z.vM},"$0","gAY",0,0,71]},
+return z.IN},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.hU},
+gUA:function(){return this.fY===C.cn},
 giO:function(a){var z=this.oc
 return z.giO(z)},
 n:function(a,b){if(b==null)return!1
@@ -19384,10 +19845,10 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.vM},"$0","gAY",0,0,71],
+return z.IN},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"a;fY>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
@@ -19401,36 +19862,36 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.lo
+for(;z.G();){y=z.Ff
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.lo
+for(;x.G();){v=x.Ff
 if(w.n(y,v))return!0
 if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
+u=$.mX().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-Cz:function(a){var z,y
+na:function(a){var z,y
 z=H.G3()
-y=H.KT(z).BD(a)
+y=H.KT(z).Zg(a)
 if(y)return 0
-y=H.KT(z,[z]).BD(a)
+y=H.KT(z,[z]).Zg(a)
 if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).Zg(a)
 if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
+z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+aW:function(a){var z,y
 z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
+y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).Zg(a)
 if(y)return 2
-y=H.KT(z,[z]).BD(a)
+y=H.KT(z,[z]).Zg(a)
 if(y)return 1
-z=H.KT(z).BD(a)
+z=H.KT(z).Zg(a)
 if(z)return 0
 return-1},
 W4:function(a,b,c){var z,y,x,w,v,u,t
@@ -19438,128 +19899,128 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
 else x.u(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
 if(u>=y)return H.e(b,u)
-if(t!==b[u])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+if(t!==b[u])return!1}return!0}}],["","",,D,{
 "^":"",
-kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
+kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
-R0:{
-"^":"a;II,F8,ZG,of,Pq,af<,NU,nX",
+Oj:{
+"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
 FV:function(a,b){this.II.FV(0,b.gII())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
 O.PV(this.of,b.gof())
-O.PV(this.Pq,b.gPq())
+O.PV(this.F3,b.gF3())
 this.af.FV(0,b.gaf())
 b.gaf().aN(0,new O.T6(this))},
 IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
-z=new O.R0(c,f,e,b,y,d,z,a)
+z=new O.Oj(c,f,e,b,y,d,z,a)
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.D8())
+a.to(0,y,new O.jb())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.NU.u(0,b,a)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
 T6:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.NU.u(0,b,a)},
+"^":"Xs:81;a",
+$2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-D8:{
-"^":"Xs:74;",
+jb:{
+"^":"Xs:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;H6",
-Tv:function(a,b){var z=this.H6.II.t(0,b)
+"^":"a;JE",
+Gp:function(a,b){var z=this.JE.II.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Cq:function(a,b,c){var z=this.H6.F8.t(0,b)
+Cq:function(a,b,c){var z=this.JE.F8.t(0,b)
 if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t,s
 z=null
-x=this.H6
-if(!!J.x(a).$isuq){w=x.Pq.t(0,a)
+x=this.JE
+if(!!J.x(a).$isuq){w=x.F3.t(0,a)
 z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
 z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.Cz(z)
+if(d){u=X.na(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.aW(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;H6",
-dM:function(a,b){var z,y,x
-if(J.xC(a,b)||J.xC(b,C.FQ))return!0
-for(z=this.H6,y=z.ZG;!J.xC(a,C.FQ);a=x){x=y.t(0,a)
+"^":"a;JE",
+xs:function(a,b){var z,y,x
+if(J.xC(a,b)||J.xC(b,C.AP))return!0
+for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
 if(x==null){if(!z.nX)return!1
 throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
-UK:function(a,b){var z=this.aR(a,b)
+UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.H6
+z=this.JE
 y=z.of.t(0,a)
 if(y==null){if(!z.nX)return!1
 throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
-CV:function(a,b){var z=this.aR(a,b)
-if(z==null){if(!this.H6.nX)return
+CV:function(a,b){var z=this.NW(a,b)
+if(z==null){if(!this.JE.nX)return
 throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
-fK:function(a,b,c){var z,y,x,w,v,u
+Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.H6
+if(c.Mg){y=this.JE
 x=y.ZG.t(0,b)
-if(x==null){if(y.nX)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.fK(0,x,c)}y=this.H6
+if(x==null){if(y.nX)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.JE
 w=y.of.t(0,b)
 if(w==null){if(!y.nX)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
-if(!c.wq&&v.gZI())continue
+if(!c.kl&&v.gZI())continue
 if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(c.ER&&J.EMK(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
+if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
+u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
-aR:function(a,b){var z,y,x,w,v,u
-for(z=this.H6,y=z.ZG,x=z.of;!J.xC(a,C.FQ);a=u){w=x.t(0,a)
+NW:function(a,b){var z,y,x,w,v,u
+for(z=this.JE,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
 if(u==null){if(!z.nX)return
 throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;H6"},
+"^":"a;JE"},
 tk:{
 "^":"a;GB",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V54;xP,rs,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V57;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 git:function(a){return a.rs},
 sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
-vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
-c.$0()},"$2","gus",4,0,157,221,101],
+vQ:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
+yZ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
+c.$0()},"$2","gus",4,0,161,224,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19567,59 +20028,59 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.rs=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.dX.ZL(a)
+a.n9=x
+a.wy=w
+C.dX.LX(a)
 C.dX.XI(a)
 return a}}},
-V54:{
+V57:{
 "^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
+$isd3:true}}],["","",,X,{
 "^":"",
 uw:{
-"^":"V55;Jl,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V58;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gtN:function(a){return a.Jl},
 stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
-SK:[function(a,b){J.cI(a.Jl).YM(b)},"$1","gvC",2,0,20,101],
-static:{S1:function(a){var z,y,x,w
+pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
+static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.uC.ZL(a)
-C.uC.XI(a)
+a.n9=x
+a.wy=w
+C.bg3.LX(a)
+C.bg3.XI(a)
 return a}}},
-V55:{
+V58:{
 "^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
+$isd3:true}}],["","",,M,{
 "^":"",
 dg:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.glb(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+if(z==null)z=new M.XI([],null,null)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
 w[v]=u}z.ks=w
 return z},
 S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ha(c,a,!1))
+z=b.appendChild(J.Lh(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.SB(z).wh(a)
-if(f!=null)J.D4(M.SB(z),f)}M.mV(z,d,e,g)
+if(d.ghK()){M.Xi(z).cl(a)
+if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
 return z},
 aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
@@ -19627,60 +20088,60 @@
 z=J.UQ(a,"__dartBindable")
 return!!J.x(z).$isAp?z:new M.VB(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.aV
+if(!!J.x(a).$isVB)return a.qf
 z=$.X3
 y=new M.Ra(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
+for(;z=J.cP(a),z!=null;a=z);return a},
 cS:function(a,b){var z,y,x,w,v,u
 if(b==null||b==="")return
 z="#"+H.d(b)
 for(;!0;){a=M.tA(a)
-y=$.FC()
+y=$.Tn()
 y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+x=H.vA(a,"expando$values")
+w=x==null?null:H.vA(x,y.V2())
 y=w==null
-if(!y&&w.gj6()!=null)v=J.Eh(w.gj6(),z)
+if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
 else{u=J.x(a)
 v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gCv()
+a=w.gfQ()
 if(a==null)return}},
-nk:function(a,b,c){if(c==null)return
-return new M.hg(a,b,c)},
+H4o:function(a,b,c){if(c==null)return
+return new M.iT(a,b,c)},
 pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isUn){y=S.j9(a.textContent,M.nk("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
+if(!!z.$isUn){y=S.j9(a.textContent,M.H4o("text",a,b))
+if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.nk(b,a,c))},
+return S.j9(z,M.H4o(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
 y=M.CF(a)
-new W.E9(a).aN(0,new M.NWj(z,a,b,y))
+new W.E9(a).aN(0,new M.fE(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.EI=z
+v.Z0=z
 x=M.rJ(a,"bind",b)
-v.YI=x
+v.lC=x
 u=M.rJ(a,"repeat",b)
-v.Lx=u
-if(z!=null&&x==null&&u==null)v.YI=S.j9("{{}}",M.nk("bind",a,b))
+v.vJ=u
+if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
+return z==null?null:new M.XI(z,null,null)},
+i8:function(a,b,c,d){var z,y,x,w,v,u,t
+if(b.gqz()){z=b.qJ(0)
+y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
 if(typeof w!=="number")return H.s(w)
@@ -19691,33 +20152,33 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.HH(u)
-t=z!=null?z.$3(d,c,!1):b.Pn(u).Tl(d)
+z=b.qJ(u)
+t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.KH(a,b,c,d)
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq)
-return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}y=new L.ww(null,!1,[],null,null,null,$.jq)
-y.Wf=[]
+uF:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.gau())return M.i8(a,b,c,d)
+if(b.gqz()){z=b.qJ(0)
+y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.FU)
+return b.gaW()?y:new Y.Wa(y,b.gPf(),null,null,null)}y=new L.bg(null,!1,[],null,null,null,$.FU)
+y.vS=[]
 x=J.U6(b)
 w=0
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.U0(w)
-z=b.HH(w)
+c$0:{u=b.AX(w)
+z=b.qJ(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else y.Qs(t)
+else y.YU(t)
 break c$0}s=b.Pn(w)
-if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++w}return new Y.Qw(y,b.gEO(),null,null,null)},
+if(u===!0)y.ti(s.WK(d))
+else y.WX(d,s)}++w}return new Y.Wa(y,b.gPf(),null,null,null)},
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.SB(a)
+x=!!J.x(a).$isvy?a:M.Xi(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -19726,22 +20187,22 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.oO(s,r,a,c),r.gwD())
+q=v.nR(x,s,M.uF(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
-u+=2}v.Vz(x)
+u+=2}v.lL(x)
 if(!z.$isqf)return
-p=M.SB(a)
-p.skr(c)
-o=p.Cm(b)
+p=M.Xi(a)
+p.sQk(c)
+o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-SB:function(a){var z,y,x,w
+Xi:function(a){var z,y,x,w
 z=$.cm()
 z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+y=H.vA(a,"expando$values")
+x=y==null?null:H.vA(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
@@ -19749,321 +20210,321 @@
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
 VE:{
-"^":"a;DP",
+"^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
-PW:{
-"^":"a;Cd>,ks>,q1>",
+XI:{
+"^":"a;Cd>,ks>,rz>",
 ghK:function(){return!1},
 JW:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;EI,YI,Lx,Cd,ks,q1",
+"^":"XI;Z0,lC,vJ,Cd,ks,rz",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
-"^":"a;N1<,aV,Xl?",
-gCd:function(a){var z=J.UQ(this.aV,"bindings_")
+"^":"a;KB<,qf,qL?",
+gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
-return new M.lb(this.gN1(),z)},
+return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.kW(this.aV,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.aR(this.gN1(),b)
+nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
-return M.xa(this.aV.V7("bind",[b,c,d]))},
-Vz:function(a){return this.aV.nQ("bindFinished")},
-gmSA:function(a){var z=this.Xl
-if(z!=null);else if(J.Lp(this.gN1())!=null){z=J.Lp(this.gN1())
-z=J.qb(!!J.x(z).$isvy?z:M.SB(z))}else z=null
+return M.xa(this.qf.V7("bind",[b,c,d]))},
+lL:function(a){return this.qf.nQ("bindFinished")},
+gmb:function(a){var z=this.qL
+if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
+z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
 return z},
 $isvy:true},
 lb:{
-"^":"ilb;N1<,mD<",
-gvc:function(a){return J.kl(J.UQ($.Si(),"Object").V7("keys",[this.mD]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.N1).$isUn&&J.xC(b,"text"))b="textContent"
-return M.xa(J.UQ(this.mD,b))},
-u:function(a,b,c){if(!!J.x(this.N1).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.mD,b,M.fg(c))},
+"^":"ilb;KB<,dn<",
+gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
+t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+return M.xa(J.UQ(this.dn,b))},
+u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+J.kW(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
-z=this.N1
+z=this.KB
 b=M.aR(z,b)
-y=this.mD
+y=this.dn
 x=M.xa(J.UQ(y,M.aR(z,b)))
 y.Ji(b)
-return x},"$1","gUS",2,0,223,56],
+return x},"$1","gUS",2,0,226,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
 $asilb:function(){return[P.qU,A.Ap]},
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
-"^":"Xs:13;a",
-$1:[function(a){return!!J.x(this.a.N1).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,56,"call"],
+"^":"Xs:12;a",
+$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 VB:{
-"^":"Ap;aV",
-TR:function(a,b){return this.aV.V7("open",[$.X3.mS(b)])},
-xO:function(a){return this.aV.nQ("close")},
-gP:function(a){return this.aV.nQ("discardChanges")},
-sP:function(a,b){this.aV.V7("setValue",[b])},
-fR:function(){return this.aV.nQ("deliver")},
+"^":"Ap;qf",
+TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
+xO:function(a){return this.qf.nQ("close")},
+gP:function(a){return this.qf.nQ("discardChanges")},
+sP:function(a,b){this.qf.V7("setValue",[b])},
+fR:function(){return this.qf.nQ("deliver")},
 $isVB:true},
 Ra:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
 aY:{
-"^":"Xs:13;b",
+"^":"Xs:12;b",
 $1:function(a){return this.b.rO(a,!1)},
 $isEH:true},
 SL:{
-"^":"Xs:13;c",
-$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,41,"call"],
+"^":"Xs:12;c",
+$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,40,"call"],
 $isEH:true},
 Au:{
-"^":"Xs:13;d",
-$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,173,"call"],
+"^":"Xs:12;d",
+$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,176,"call"],
 $isEH:true},
 no:{
-"^":"Xs:74;e",
+"^":"Xs:76;e",
 $0:[function(){return J.yd(this.e)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uD:{
-"^":"Xs:74;f",
+"^":"Xs:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eT:{
-"^":"Xs:13;UI",
-$1:[function(a){J.ta(this.UI,a)
-return a},"$1",null,2,0,null,173,"call"],
-$isEH:true},
 Wb:{
-"^":"Xs:74;bK",
+"^":"Xs:12;UI",
+$1:[function(a){J.ta(this.UI,a)
+return a},"$1",null,2,0,null,176,"call"],
+$isEH:true},
+SLX:{
+"^":"Xs:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 ze:{
-"^":"a;k8>,Mm,Ve"},
+"^":"a;k8>,tA,MC"},
 DT:{
-"^":"vy;kr?,dH,F3<,z7E,QO?,Me?,mj?,my,dv,kC,N1,aV,Xl",
-gN1:function(){return this.N1},
+"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
 if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
 z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.N1).MW.setAttribute("ref",z)
-this.MQ()
+J.Vs(this.KB).dA.setAttribute("ref",z)
+this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.kW(y.mD,M.aR(y.N1,"ref"),M.fg(c))
+J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
 return c},
-Cm:function(a){var z=this.F3
-if(z!=null)z.z9()
-if(a.EI==null&&a.YI==null&&a.Lx==null){z=this.F3
+KI:function(a){var z=this.kr
+if(z!=null)z.UP()
+if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
-this.F3=null}return}z=this.F3
+this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.F3=z}z.Bq(a,this.kr)
-J.ZW($.ik(),this.N1,["ref"],!0)
-return this.F3},
-ZK:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(c==null)c=this.dH
-z=this.kC
-if(z==null){z=this.gyT()
-z=J.Xu(!!J.x(z).$isvy?z:M.SB(z))
-this.kC=z}y=J.RE(z)
-if(y.glb(z)==null)return $.zl()
-x=c==null?$.DH():c
-w=x.DP
+this.kr=z}z.FE(a,this.Qk)
+J.ZW($.ik(),this.KB,["ref"],!0)
+return this.kr},
+v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+if(c==null)c=this.Rc
+z=this.XA
+if(z==null){z=this.gPI()
+z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+this.XA=z}y=J.RE(z)
+if(y.gNL(z)==null)return $.zl()
+x=c==null?$.Bu():c
+w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
-x.DP=w}v=w.t(0,z)
+x.oe=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
-x.DP.u(0,z,v)}w=this.my
-if(w==null){u=J.Do(this.N1)
-w=$.tF()
+x.oe.u(0,z,v)}w=this.dK
+if(w==null){u=J.lu(this.KB)
+w=$.Ou()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
-M.Uk(t)
-w.u(0,u,t)}this.my=t
+M.AL(t)
+w.u(0,u,t)}this.dK=t
 w=t}s=J.bs(w)
 w=[]
 r=new M.Fi(w,null,null,null)
-q=$.FC()
-r.Cv=this.N1
-r.j6=z
+q=$.Tn()
+r.fQ=this.KB
+r.cA=z
 q.u(0,s,r)
 p=new M.ze(b,null,null)
-M.SB(s).sXl(p)
-for(o=y.glb(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+M.Xi(s).sqL(p)
+for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.JW(n):null
-k=M.S0(o,s,this.my,l,b,c,w,null)
-M.SB(k).sXl(p)
-if(m)r.he=k}p.Mm=s.firstChild
-p.Ve=s.lastChild
-r.j6=null
-r.Cv=null
+k=M.S0(o,s,this.dK,l,b,c,w,null)
+M.Xi(k).sqL(p)
+if(m)r.yi=k}p.tA=s.firstChild
+p.MC=s.lastChild
+r.cA=null
+r.fQ=null
 return s},
-gk8:function(a){return this.kr},
-gA0:function(a){return this.dH},
+gk8:function(a){return this.Qk},
+gA0:function(a){return this.Rc},
 sA0:function(a,b){var z
-if(this.dH!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.dH=b
-this.dv=null
-z=this.F3
-if(z!=null){z.vJ=!1
-z.DO=null
-z.Fy=null}},
-MQ:function(){var z,y
-if(this.F3!=null){z=this.kC
-y=this.gyT()
-y=J.Xu(!!J.x(y).$isvy?y:M.SB(y))
+if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
+this.Rc=b
+this.Fe=null
+z=this.kr
+if(z!=null){z.z1=!1
+z.iz=null
+z.Mv=null}},
+NB:function(){var z,y
+if(this.kr!=null){z=this.XA
+y=this.gPI()
+y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
-this.kC=null
-this.F3.HV(null)
-this.F3.xY(null)},
+this.XA=null
+this.kr.Oo(null)
+this.kr.OP(null)},
 V1:function(a){var z,y
-this.kr=null
-this.dH=null
+this.Qk=null
+this.Rc=null
 if(this.gCd(this)!=null){z=this.gCd(this).Rz(0,"ref")
-if(z!=null)z.xO(0)}this.kC=null
-y=this.F3
+if(z!=null)z.xO(0)}this.XA=null
+y=this.kr
 if(y==null)return
-y.HV(null)
-this.F3.xO(0)
-this.F3=null},
-gyT:function(){var z,y
-this.wo()
-z=M.cS(this.N1,J.Vs(this.N1).MW.getAttribute("ref"))
-if(z==null){z=this.QO
-if(z==null)return this.N1}y=M.SB(z).gyT()
+y.Oo(null)
+this.kr.xO(0)
+this.kr=null},
+gPI:function(){var z,y
+this.xk()
+z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+if(z==null){z=this.Gw
+if(z==null)return this.KB}y=M.Xi(z).gPI()
 return y!=null?y:z},
-gq1:function(a){var z
-this.wo()
-z=this.Me
-return z!=null?z:H.Go(this.N1,"$isfX").content},
-wh:function(a){var z,y,x,w,v,u,t
-if(this.mj===!0)return!1
+grz:function(a){var z
+this.xk()
+z=this.Yz
+return z!=null?z:H.Go(this.KB,"$isfX").content},
+cl:function(a){var z,y,x,w,v,u,t
+if(this.CS===!0)return!1
 M.oR()
 M.hb()
-this.mj=!0
-z=!!J.x(this.N1).$isfX
+this.CS=!0
+z=!!J.x(this.KB).$isfX
 y=!z
-if(y){x=this.N1
+if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.N1)
-v=!!J.x(v).$isvy?v:M.SB(v)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isfX
-u=!0}else{x=this.N1
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.KB)
+v=!!J.x(v).$isvy?v:M.Xi(v)
+v.sCS(!0)
+z=!!J.x(v.gKB()).$isfX
+u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.N1
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(x).insertBefore(t,x)
+t=w.gJ8(x).createElement("template",null)
+w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$isvy?t:M.SB(t)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isfX}else{v=this
+v=!!J.x(t).$isvy?t:M.Xi(t)
+v.sCS(!0)
+z=!!J.x(v.gKB()).$isfX}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sMe(J.bs(M.TA(v.gN1())))
-if(a!=null)v.sQO(a)
-else if(y)M.O1(v,this.N1,u)
-else M.GM(J.Xu(v))
+u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
+if(a!=null)v.sGw(a)
+else if(y)M.O1(v,this.KB,u)
+else M.W1(J.f5(v))
 return!0},
-wo:function(){return this.wh(null)},
+xk:function(){return this.cl(null)},
 $isDT:true,
 static:{"^":"mn,v2,YO,vU,xV,joK",TA:function(a){var z,y,x,w
-z=J.Do(a)
+z=J.lu(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},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
-z.gBy(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
+y=z.gJ8(a).createElement("template",null)
+z.gAd(a).insertBefore(y,a)
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
+switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
 break
 case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
+v=z.gQg(a).dA
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break}}return y},O1:function(a,b,c){var z,y,x,w
-z=J.Xu(a)
+z=J.f5(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.glb(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},W1:function(a){var z,y
 z=new M.yi()
-y=J.MK(a,$.Ze())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
 if($.xV===!0)return
 $.xV=!0
 z=document.createElement("template",null)
 if(!!J.x(z).$isfX){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.Uk(y)}},Uk:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
+if(J.m5(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
+J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z=this.a
-J.Vs(z.N1).MW.setAttribute("ref",a)
-z.MQ()},"$1",null,2,0,null,224,"call"],
+J.Vs(z.KB).dA.setAttribute("ref",a)
+z.NB()},"$1",null,2,0,null,173,"call"],
 $isEH:true},
 yi:{
-"^":"Xs:20;",
-$1:function(a){if(!M.SB(a).wh(null))M.GM(J.Xu(!!J.x(a).$isvy?a:M.SB(a)))},
+"^":"Xs:19;",
+$1:function(a){if(!M.Xi(a).cl(null))M.W1(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
 $isEH:true},
-DOe:{
-"^":"Xs:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,189,"call"],
+YJG:{
+"^":"Xs:12;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,135,"call"],
+$isEH:true},
+lPa:{
+"^":"Xs:81;",
+$2:[function(a,b){var z
+for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,179,13,"call"],
 $isEH:true},
 Ufa:{
-"^":"Xs:80;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).MQ()},"$2",null,4,0,null,176,14,"call"],
-$isEH:true},
-Raa:{
-"^":"Xs:74;",
+"^":"Xs:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.FC().u(0,z,new M.Fi([],null,null,null))
+$.Tn().u(0,z,new M.Fi([],null,null,null))
 return z},
 $isEH:true},
 Fi:{
-"^":"a;mD<,he<,Cv<,j6<"},
-hg:{
-"^":"Xs:13;a,b,c",
+"^":"a;dn<,yi<,fQ<,cA<"},
+iT:{
+"^":"Xs:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
-NWj:{
-"^":"Xs:80;a,b,c,d",
+fE:{
+"^":"Xs:81;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.nk(a,this.b,this.c))
+y=S.j9(b,M.H4o(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -20073,182 +20534,182 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;e9,q5,d8,h5,Ag,DM,Qx,Yq,xS,C8,k0,IY,vJ,DO,Fy",
-Mv:function(a){return this.DO.$1(a)},
+"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,RS,Gi,Sd,lH,AB,z1,iz,Mv",
+ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.Qx},
-z9:function(){var z,y
-z=this.DM
+gP:function(a){return this.h6},
+UP:function(){var z,y
+z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
-this.DM=null}z=this.Qx
+this.Up=null}z=this.h6
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
-this.Qx=null}},
-Bq:function(a,b){var z,y,x
-this.z9()
-z=this.e9.N1
-y=a.EI
+this.h6=null}},
+FE:function(a,b){var z,y,x
+this.UP()
+z=this.yQ.KB
+y=a.Z0
 x=y!=null
-this.Yq=x
-this.xS=a.Lx!=null
-if(x){this.C8=y.wD
-y=M.oO("if",y,z,b)
-this.DM=y
-if(this.C8===!0){if(!(null!=y&&!1!==y)){this.xY(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gAJ())}if(this.xS===!0){y=a.Lx
-this.k0=y.wD
-y=M.oO("repeat",y,z,b)
-this.Qx=y}else{y=a.YI
-this.k0=y.wD
-y=M.oO("bind",y,z,b)
-this.Qx=y}if(this.k0!==!0)J.mu(y,this.gAJ())
-this.xY(null)},
-xY:[function(a){var z,y
-if(this.Yq===!0){z=this.DM
-if(this.C8!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.HV([])
-return}}y=this.Qx
-if(this.k0!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.HV(this.xS!==!0?[y]:y)},"$1","gAJ",2,0,20,14],
-HV:function(a){var z,y
+this.RS=x
+this.Gi=a.vJ!=null
+if(x){this.Sd=y.au
+y=M.uF("if",y,z,b)
+this.Up=y
+if(this.Sd===!0){if(!(null!=y&&!1!==y)){this.OP(null)
+return}}else H.Go(y,"$isAp").TR(0,this.gVN())}if(this.Gi===!0){y=a.vJ
+this.lH=y.au
+y=M.uF("repeat",y,z,b)
+this.h6=y}else{y=a.lC
+this.lH=y.au
+y=M.uF("bind",y,z,b)
+this.h6=y}if(this.lH!==!0)J.mu(y,this.gVN())
+this.OP(null)},
+OP:[function(a){var z,y
+if(this.RS===!0){z=this.Up
+if(this.Sd!==!0){H.Go(z,"$isAp")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
+return}}y=this.h6
+if(this.lH!==!0){H.Go(y,"$isAp")
+y=y.gP(y)}this.Oo(this.Gi!==!0?[y]:y)},"$1","gVN",2,0,19,13],
+Oo:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.d8
+z=this.nH
 if(a===z)return
-this.R5()
-this.h5=a
-if(!!J.x(a).$iswn&&this.xS===!0&&this.k0!==!0){if(a.gb3()!=null)a.sb3([])
-this.IY=a.gQV().yI(this.gLH())}y=this.h5
+this.ud()
+this.dO=a
+if(!!J.x(a).$iswn&&this.Gi===!0&&this.lH!==!0){if(a.glr()!=null)a.slr([])
+this.AB=a.gXF().yI(this.gSp())}y=this.dO
 y=y!=null?y:[]
-this.lC(G.jj(y,0,J.q8(y),z,0,z.length))},
-Yg:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.e9.N1
-z=$.FC()
-y=this.q5
+this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
+Dk:function(a){var z,y,x,w
+if(J.xC(a,-1))return this.yQ.KB
+z=$.Tn()
+y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).ghe()
-if(x==null)return this.Yg(a-1)
-if(!M.CF(x)||x===this.e9.N1)return x
-w=M.SB(x).gF3()
+x=z.t(0,y[a]).gyi()
+if(x==null)return this.Dk(a-1)
+if(!M.CF(x)||x===this.yQ.KB)return x
+w=M.Xi(x).gkr()
 if(w==null)return x
-return w.Yg(w.q5.length-1)},
-nV:function(a){var z,y,x,w,v,u,t
-z=this.Yg(J.Hn(a,1))
-y=this.Yg(a)
-J.TmB(this.e9.N1)
-x=C.Nm.W4(this.q5,a)
+return w.Dk(w.tM.length-1)},
+C8:function(a){var z,y,x,w,v,u,t
+z=this.Dk(J.Hn(a,1))
+y=this.Dk(a)
+J.cP(this.yQ.KB)
+x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-lC:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
-if(this.Ag||J.FN(a)===!0)return
-u=this.e9
-t=u.N1
-if(J.TmB(t)==null){this.xO(0)
-return}s=this.d8
-Q.Y5(s,this.h5,a)
-z=u.dH
-if(!this.vJ){this.vJ=!0
-r=J.qy(!!J.x(u.N1).$isDT?u.N1:u)
-if(r!=null){this.DO=r.Mn.A5(t)
-this.Fy=null}}q=P.YM(P.N3R(),null,null,null,null)
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.vx||J.FN(a)===!0)return
+u=this.yQ
+t=u.KB
+if(J.cP(t)==null){this.xO(0)
+return}s=this.nH
+Q.Y5(s,this.dO,a)
+z=u.Rc
+if(!this.z1){this.z1=!0
+r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.Mn.CE(t)
+this.Mv=null}}q=P.YM(P.Bx(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.nV(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
+i=this.C8(J.WB(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
 n-=l}for(p=p.gA(a);p.G();){m=p.gl()
 for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
-if(x==null)try{if(this.DO!=null)y=this.Mv(y)
+if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
+else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
 w=l
-v=new H.XO(g,null)
+v=new H.oP(g,null)
 l=new P.Gc(0,$.X3,null,null,null,null,null,null)
 l.$builtinTypeInfo=[null]
 new P.Zf(l).$builtinTypeInfo=[null]
 k=w
 if(k==null)H.vh(P.u("Error must not be null"))
-if(l.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
+if(l.YM!==0)H.vh(P.w("Future already completed"))
+l.Nk(k,v)
 x=$.zl()}l=x
-f=this.Yg(h-1)
-e=J.TmB(u.N1)
-C.Nm.xe(this.q5,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.u3(u,0),H.u3(u,1)]);u.G();)this.PY(u.lo)},"$1","gLH",2,0,225,226],
-PY:[function(a){var z,y
-z=$.FC()
+f=this.Dk(h-1)
+e=J.cP(u.KB)
+C.Nm.xe(this.tM,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,227,228],
+vB:[function(a){var z,y
+z=$.Tn()
 z.toString
-y=H.of(a,"expando$values")
-for(z=J.mY((y==null?null:H.of(y,z.J4())).gmD());z.G();)J.yd(z.gl())},"$1","gvi",2,0,227],
-R5:function(){var z=this.IY
+y=H.vA(a,"expando$values")
+for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,229],
+ud:function(){var z=this.AB
 if(z==null)return
-z.ed()
-this.IY=null},
+z.Gv()
+this.AB=null},
 xO:function(a){var z
-if(this.Ag)return
-this.R5()
-z=this.q5
-H.bQ(z,this.gvi())
+if(this.vx)return
+this.ud()
+z=this.tM
+H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.z9()
-this.e9.F3=null
-this.Ag=!0}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+this.UP()
+this.yQ.kr=null
+this.vx=!0}}}],["","",,S,{
 "^":"",
-jb:{
-"^":"a;iB,wD<,UV",
-gqz:function(){return this.iB.length===5},
+VH2:{
+"^":"a;jG,au<,Ke",
+gqz:function(){return this.jG.length===5},
 gaW:function(){var z,y
-z=this.iB
+z=this.jG
 y=z.length
 if(y===5){if(0>=y)return H.e(z,0)
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gEO:function(){return this.UV},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-U0:function(a){var z,y
-z=this.iB
+gPf:function(){return this.Ke},
+qm:function(a){return this.gPf().$1(a)},
+gB:function(a){return C.jn.BU(this.jG.length,4)},
+AX:function(a){var z,y
+z=this.jG
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 Pn:function(a){var z,y
-z=this.iB
+z=this.jG
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-HH:function(a){var z,y
-z=this.iB
+qJ:function(a){var z,y
+z=this.jG
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-ln:[function(a){var z,y,x,w
+xTd:[function(a){var z,y,x,w
 if(a==null)a=""
-z=this.iB
+z=this.jG
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 x=z.length
-w=C.jn.cU(x,4)*4
+w=C.jn.BU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,228,21],
-eF:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
+return y+H.d(z[w])},"$1","gSG",2,0,230,20],
+QY:[function(a){var z,y,x,w,v,u,t,s
+z=this.jG
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
+x=C.jn.BU(z.length,4)
 for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
+if(u!=null)y.IN+=typeof u==="string"?u:H.d(u);++v
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,229,230],
-nH:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
+y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,231,232],
+l3:function(a,b){this.Ke=this.jG.length===5?this.gSG():this.gYF()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
@@ -20272,53 +20733,53 @@
 else w.push(null)
 w.push(m)
 v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.nH(w,u)
-return y}}}}],["tracer","package:observatory/tracer.dart",,Z,{
+y=new S.VH2(w,u,null)
+y.l3(w,u)
+return y}}}}],["","",,Z,{
 "^":"",
 d8:function(a){var z,y
 z=J.x(a)
 if(!!z.$isT8){y=P.Fl(null,null)
-z.aN(a,new Z.WJ(y))
+z.aN(a,new Z.mZ(y))
 return y}else if(!!z.$isWO){y=[]
-z.aN(a,new Z.Jh(y))
+z.aN(a,new Z.WJ(y))
 return y}else return a},
-WJ:{
-"^":"Xs:80;a",
-$2:function(a,b){this.a.u(0,a,Z.d8(b))},
+mZ:{
+"^":"Xs:81;a",
+$2:[function(a,b){this.a.u(0,a,Z.d8(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-Jh:{
-"^":"Xs:13;b",
+WJ:{
+"^":"Xs:12;b",
 $1:function(a){this.b.push(Z.d8(a))},
 $isEH:true},
 lX:{
-"^":"a;Nu,G1>,Ir*",
-gee:function(a){return"T+"+H.d(this.Nu)+"us"},
-bu:[function(a){return"["+("T+"+H.d(this.Nu)+"us")+"] "+H.d(this.G1)},"$0","gAY",0,0,71],
+"^":"a;NP,G1>,Ir*",
+gee:function(a){return"T+"+H.d(this.NP)+"us"},
+bu:[function(a){return"["+("T+"+H.d(this.NP)+"us")+"] "+H.d(this.G1)},"$0","gCR",0,0,73],
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,Nu,Rk*,ro,dUC,U3",
-ed:function(){this.RV.ed()},
-AS:[function(a,b,c){var z,y
-z=this.Nu
-y=new Z.lX(C.CD.Z(z.giU()*1000000,z.dI),b,null)
-y.Ir=Z.d8(c)
-J.bi(this.Rk,y)
-return y},function(a,b){return this.AS(a,b,null)},"wn","$2$map","$1","gtN",2,3,231,23,79,201],
-l8:function(){var z=new P.VV(1000000,null,null)
-this.Nu=z
+"^":"d3;RV,NP,Rk*,ro,XY,cU",
+Gv:function(){this.RV.Gv()},
+ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+z.Ir=Z.d8(c)
+J.bi(this.Rk,z)
+return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,233,22,234,202],
+l8:function(){var z=new P.VV(null,null)
+H.Xe()
+$.Ji=$.xG
+this.NP=z
 z.wE(0)
 this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
-this.Nu.CH(0)
+this.NP.CH(0)
 J.Z8(this.Rk)},
 static:{"^":"ax",NY:function(){var z=new Z.KZ(null,null,Q.ch(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
 Ym:{
-"^":"Xs:163;a",
-$1:[function(a){this.a.wn(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,162,"call"],
-$isEH:true}}],["utf.list_range","package:utf/src/list_range.dart",,G,{
+"^":"Xs:167;a",
+$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,166,"call"],
+$isEH:true}}],["","",,G,{
 "^":"",
 pe:{
 "^":"mW;f9,D1,fO",
@@ -20326,37 +20787,37 @@
 z=this.D1
 y=this.fO
 if(typeof y!=="number")return H.s(y)
-return new G.ay(this.f9,z-1,z+y)},
+return new G.vZG(this.f9,z-1,z+y)},
 gB:function(a){return this.fO},
 a0:function(a,b,c){var z,y,x
 z=this.D1
-if(z>this.f9.iN.length)throw H.b(P.N(z))
+if(z>this.f9.Bx.length)throw H.b(P.N(z))
 y=this.fO
 if(y!=null){if(typeof y!=="number")return y.C()
 x=y<0}else x=!1
 if(x)throw H.b(P.N(y))
 if(typeof y!=="number")return y.g()
 z=y+z
-if(z>this.f9.iN.length)throw H.b(P.N(z))},
+if(z>this.f9.Bx.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-ay:{
-"^":"a;f9,D1,HM",
-gl:function(){return C.xB.j(this.f9.iN,this.D1)},
-G:function(){return++this.D1<this.HM},
-eR:function(a,b){this.D1+=b}}}],["utf.utf_16_code_unit_decoder","package:utf/src/utf_16_code_unit_decoder.dart",,Z,{
+vZG:{
+"^":"a;f9,D1,c0",
+gl:function(){return C.xB.j(this.f9.Bx,this.D1)},
+G:function(){return++this.D1<this.c0},
+eR:function(a,b){this.D1+=b}}}],["","",,Z,{
 "^":"",
 kb:{
-"^":"a;xX,Pa,O4",
+"^":"a;aH,Rr,O4",
 gA:function(a){return this},
 gl:function(){return this.O4},
 G:function(){var z,y,x,w,v,u
 this.O4=null
-z=this.xX
+z=this.aH
 y=++z.D1
-x=z.HM
+x=z.c0
 if(y>=x)return!1
-w=z.f9.iN
+w=z.f9.Bx
 v=C.xB.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
@@ -20364,15 +20825,15 @@
 else if(v<56320&&++z.D1<x){u=C.xB.j(w,z.D1)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
 else{if(u>=55296&&u<56320)--z.D1
-this.O4=this.Pa}}else this.O4=this.Pa
-return!0}}}],["utf.util","package:utf/src/util.dart",,U,{
+this.O4=this.Rr}}else this.O4=this.Rr
+return!0}}}],["","",,U,{
 "^":"",
-Fa:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.iN.length-b
+dZr:function(a,b,c,d){var z,y,x,w,v,u,t
+z=a.Bx.length-b
 new G.pe(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.ay(a,y,z),d,null)
+x=new Z.kb(new G.vZG(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -20382,83 +20843,83 @@
 z.fixed$length=init
 t=H.VM(z,[P.KN])
 H.qG(t,0,v,w,0)
-return t}}}],["vm_connect_element","package:observatory/src/elements/vm_connect.dart",,V,{
+return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V56;P5,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
-gN:function(a){return a.P5},
-sN:function(a,b){a.P5=this.ct(a,C.ft,a.P5,b)},
-ghS:function(a){var z=a.P5
+"^":"V59;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
+gN:function(a){return a.GG},
+sN:function(a,b){a.GG=this.ct(a,C.ft,a.GG,b)},
+ghS:function(a){var z=a.GG
 if(z==null)return!1
 return z.gA9()},
-gnI:function(a){var z=$.Kh.Eh
+gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
-return J.xC(H.Go(z,"$isKM").N,a.P5)},
-f8D:[function(a,b,c,d){var z,y,x,w
+return J.xC(H.Go(z,"$isKM").N,a.GG)},
+xX:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gpL(b)
+y=z.gEV(b)
 if(typeof y!=="number")return y.D()
 if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
 z.e6(b)
-x=$.Kh.Eh
-if(x==null||!J.xC(J.l2(x),a.P5)){z=$.Kh
-y=a.P5
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=$.Kh.Nv
+if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
+y=a.GG
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
-z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,164,2,105,179],
-MeB:[function(a,b,c,d){var z,y,x,w
+z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,168,87,106,182],
+Fh:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
-y=a.P5
+y=a.GG
 x=z.bq
 x.Rz(0,y)
-z.XT()
-z.XT()
-w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gaE",6,0,164,2,105,179],
+z.TV()
+z.TV()
+w=z.wo.IU+".history"
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gFb",6,0,168,87,106,182],
 static:{fXx:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.J57.ZL(a)
+a.n9=x
+a.wy=w
+C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V56:{
+V59:{
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V57;ot,YE,lr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V60;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
 gHL:function(a){return a.YE},
 sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
-gFK:function(a){return a.lr},
-sFK:function(a,b){a.lr=this.ct(a,C.am,a.lr,b)},
-yY:function(a){this.Vf(a)},
-Kl:function(a,b){if(J.co(b,"ws://"))return b
+gFK:function(a){return a.E6},
+sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
+yY:function(a){this.iW(a)},
+VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
-HN:[function(a,b,c,d){var z,y,x
+ny:[function(a,b,c,d){var z,y,x
 J.Kr(b)
-z=this.Kl(a,a.ot)
+z=this.VP(a,a.ot)
 d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,114,1,105,106],
-WU:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,114,1,105,106],
-Vf:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
-U2:function(a){var z=P.ii(0,0,0,0,0,1)
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,115,2,106,107],
+jLH:[function(a,b,c,d){J.Kr(b)
+this.iW(a)},"$3","gzG",6,0,115,2,106,107],
+iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
+Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
 static:{NI:function(a){var z,y,x,w,v
 z=Q.ch(null,L.Z5)
@@ -20469,26 +20930,26 @@
 v=P.Fl(null,null)
 a.ot=""
 a.YE="localhost:9222"
-a.lr=z
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.E6=z
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=y
 a.ZQ=x
-a.iQ=w
-a.Xi=v
-C.hj.ZL(a)
-C.hj.XI(a)
-C.hj.U2(a)
+a.n9=w
+a.wy=v
+C.aXh.LX(a)
+C.aXh.XI(a)
+C.aXh.Kq(a)
 return a}}},
-V57:{
+V60:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
-"^":"Xs:13;a",
+"^":"Xs:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.Z8(z.lr)
+J.Z8(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -20496,15 +20957,15 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,232,"call"],
+J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,235,"call"],
 $isEH:true},
 oU:{
-"^":"Xs:13;b",
-$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,1,"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+"^":"Xs:12;b",
+$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 static:{yC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -20512,272 +20973,359 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Pe=!1
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.vA.ZL(a)
-C.vA.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+a.n9=x
+a.wy=w
+C.V8.LX(a)
+C.V8.XI(a)
+return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V58;uB,lc,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Rr,Uk,oq,Ij,Ap,SD,oG,ZM,ZQ,iQ,Xi",
+"^":"V61;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,n9,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,101],
+pA:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,19,102],
 static:{oH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Rr=[]
-a.Ap=!1
-a.oG=!1
+a.f4=[]
+a.OD=!1
+a.kK=!1
 a.ZM=z
 a.ZQ=y
-a.iQ=x
-a.Xi=w
-C.Hd.ZL(a)
+a.n9=x
+a.wy=w
+C.Hd.LX(a)
 C.Hd.XI(a)
 return a}}},
-V58:{
+V61:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.KN.$isKN=true
-P.KN.$isfRn=true
-P.KN.$asfRn=[P.FK]
-P.KN.$isa=true
-P.Vf.$isVf=true
-P.Vf.$isfRn=true
-P.Vf.$asfRn=[P.FK]
-P.Vf.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-P.qU.$isqU=true
-P.qU.$isfRn=true
-P.qU.$asfRn=[P.qU]
-P.qU.$isa=true
-W.QI.$isa=true
-P.FK.$isfRn=true
-P.FK.$asfRn=[P.FK]
-P.FK.$isa=true
-N.qV.$isfRn=true
-N.qV.$asfRn=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isfRn=true
-P.a6.$asfRn=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.ns.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$isIp=true
-U.mc.$isa=true
-U.cJ.$isIp=true
-U.cJ.$isa=true
-U.uku.$isIp=true
-U.uku.$isa=true
-U.elO.$iselO=true
-U.elO.$isIp=true
-U.elO.$isa=true
-U.ae.$isIp=true
-U.ae.$isa=true
-U.Mm.$isIp=true
-U.Mm.$isa=true
-U.c0.$isIp=true
-U.c0.$isa=true
-U.Dv.$isIp=true
-U.Dv.$isa=true
-U.RWc.$isIp=true
-U.RWc.$isa=true
-U.zX.$iszX=true
-U.zX.$isIp=true
-U.zX.$isa=true
-U.rX.$isIp=true
-U.rX.$isa=true
-U.EO.$isEO=true
-U.EO.$isIp=true
-U.EO.$isa=true
-P.IN.$isIN=true
-P.IN.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.TJ.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-L.U2.$isU2=true
-L.U2.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isT8=true
-D.vO.$asT8=[null,null]
-D.vO.$isa=true
-D.Kp.$isaf=true
-D.Kp.$isa=true
-D.Q4.$isa=true
-D.Db.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-G.DA.$isDA=true
-G.DA.$isyj=true
-G.DA.$isa=true
-W.BI.$isea=true
-W.BI.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-W.Hy.$isHy=true
-W.Hy.$isea=true
-W.Hy.$isa=true
-P.Jb.$isQV=true
-P.Jb.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-D.Z9.$isa=true
-W.fJ.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.D5.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-G.OS.$isa=true
-D.Mk.$isMk=true
-D.Mk.$isaf=true
-D.Mk.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-Z.lX.$islX=true
-Z.lX.$isa=true
-P.A5.$isa=true
-W.PGY.$isea=true
-W.PGY.$isa=true
-L.Zl.$isZl=true
-L.Zl.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$ishsw=true
-W.I0.$isKV=true
-W.I0.$isa=true
-Y.qS.$isa=true
-U.Ip.$isIp=true
-U.Ip.$isa=true
-P.yX.$isyX=true
-P.yX.$isa=true
-L.Z5.$isZ5=true
-L.Z5.$isa=true
-G.Ni.$isa=true
-V.qC.$isqC=true
-V.qC.$isT8=true
-V.qC.$isa=true
-P.BpP.$isBpP=true
-P.BpP.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isyX=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isyX=true
-P.LR.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.JBS.$isJBS=true
-P.JBS.$isa=true
-P.fRn.$isfRn=true
-P.fRn.$isa=true
-P.aYy.$isaYy=true
-P.aYy.$isa=true
-P.T8.$isT8=true
-P.T8.$isa=true
-P.kWp.$iskWp=true
-P.kWp.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.wS.$iswS=true
-P.wS.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.fIm.$isfIm=true
-P.fIm.$isa=true
-P.iP.$isiP=true
-P.iP.$isfRn=true
-P.iP.$asfRn=[null]
-P.iP.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.wv.$iswv=true
-D.wv.$isaf=true
-D.wv.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.lg.$islg=true
-L.lg.$isAp=true
-L.lg.$isa=true
-W.hsw.$ishsw=true
-W.hsw.$isKV=true
-W.hsw.$isa=true
+;(function(){var z=!0,y
+y=P.KN
+y.$isKN=z
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=P.Vf
+y.$isVf=z
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=W.KV
+y.$isKV=z
+y.$isa=z
+W.vKL.$isa=z
+y=P.qU
+y.$isqU=z
+y.$isfRn=z
+y.$asfRn=[P.qU]
+y.$isa=z
+W.QI.$isa=z
+y=P.FK
+y.$isFK=z
+y.$isfRn=z
+y.$asfRn=[P.FK]
+y.$isa=z
+y=N.qV
+y.$isfRn=z
+y.$asfRn=[N.qV]
+y.$isa=z
+y=P.a6
+y.$isa6=z
+y.$isfRn=z
+y.$asfRn=[P.a6]
+y.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.ns.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=A.Ap
+y.$isAp=z
+y.$isa=z
+y=K.Aep
+y.$isAep=z
+y.$isa=z
+y=U.Dc
+y.$isIp=z
+y.$isa=z
+y=U.FH
+y.$isIp=z
+y.$isa=z
+y=U.uku
+y.$isIp=z
+y.$isa=z
+y=U.fp
+y.$isfp=z
+y.$isIp=z
+y.$isa=z
+y=U.nu
+y.$isIp=z
+y.$isa=z
+y=U.Mm
+y.$isIp=z
+y.$isa=z
+y=U.c0
+y.$isIp=z
+y.$isa=z
+y=U.noG
+y.$isIp=z
+y.$isa=z
+y=U.RWc
+y.$isIp=z
+y.$isa=z
+y=U.vn
+y.$isvn=z
+y.$isIp=z
+y.$isa=z
+y=U.x9
+y.$isIp=z
+y.$isa=z
+y=U.EO
+y.$isEO=z
+y.$isIp=z
+y.$isa=z
+y=P.IN
+y.$isIN=z
+y.$isa=z
+y=P.uq
+y.$isuq=z
+y.$isa=z
+N.TJ.$isa=z
+y=T.yj
+y.$isyj=z
+y.$isa=z
+y=W.tV
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=L.U2
+y.$isU2=z
+y.$isa=z
+y=D.af
+y.$isaf=z
+y.$isa=z
+y=D.bv
+y.$isaf=z
+y.$isa=z
+D.Fc.$isa=z
+D.ER.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isT8=z
+y.$asT8=[null,null]
+y.$isa=z
+y=D.Kp
+y.$isaf=z
+y.$isa=z
+y=D.dy
+y.$isdy=z
+y.$isaf=z
+y.$isa=z
+D.Q4.$isa=z
+D.Db.$isa=z
+y=D.U4
+y.$isaf=z
+y.$isa=z
+y=D.vx
+y.$isvx=z
+y.$isaf=z
+y.$isa=z
+D.c2.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+y=W.BI
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Ol
+y.$isQV=z
+y.$isa=z
+y=P.a2
+y.$isa2=z
+y.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+D.Z9.$isa=z
+W.fJ.$isa=z
+y=G.Y2
+y.$isY2=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.So.$isa=z
+y=W.AjY
+y.$isAjY=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=W.PF
+y.$isPF=z
+y.$isea=z
+y.$isa=z
+y=Z.lX
+y.$islX=z
+y.$isa=z
+P.A0.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Zl
+y.$isZl=z
+y.$isa=z
+K.GK.$isa=z
+y=N.HV
+y.$isHV=z
+y.$isa=z
+H.yo.$isa=z
+H.IY.$isa=z
+H.aX.$isa=z
+y=W.I0
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z
+Y.qS.$isa=z
+y=U.Ip
+y.$isIp=z
+y.$isa=z
+y=P.yX
+y.$isyX=z
+y.$isa=z
+y=L.Z5
+y.$isZ5=z
+y.$isa=z
+G.Ni.$isa=z
+y=V.qC
+y.$isqC=z
+y.$isT8=z
+y.$isa=z
+y=P.BpP
+y.$isBpP=z
+y.$isa=z
+y=P.V2
+y.$isV2=z
+y.$isa=z
+y=P.KA
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.LR
+y.$isLR=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
+y=P.fRn
+y.$isfRn=z
+y.$isa=z
+y=P.n7
+y.$isn7=z
+y.$isa=z
+y=P.T8
+y.$isT8=z
+y.$isa=z
+y=P.kWp
+y.$iskWp=z
+y.$isa=z
+y=P.QV
+y.$isQV=z
+y.$isa=z
+y=P.EH
+y.$isEH=z
+y.$isa=z
+y=P.wS
+y.$iswS=z
+y.$isa=z
+y=P.b8
+y.$isb8=z
+y.$isa=z
+y=P.NOT
+y.$isNOT=z
+y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=P.iP
+y.$isiP=z
+y.$isfRn=z
+y.$asfRn=[null]
+y.$isa=z
+y=O.Hz
+y.$isHz=z
+y.$isa=z
+y=D.wv
+y.$iswv=z
+y.$isaf=z
+y.$isa=z
+y=D.N7
+y.$isN7=z
+y.$isaf=z
+y.$isa=z
+y=D.EP
+y.$isEP=z
+y.$isaf=z
+y.$isa=z
+y=A.ES
+y.$isES=z
+y.$isa=z
+y=A.rv
+y.$isrv=z
+y.$isa=z
+y=L.lg
+y.$islg=z
+y.$isAp=z
+y.$isa=z
+y=W.hsw
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z})()
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -20786,13 +21334,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -20805,26 +21353,27 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.prototype
+return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
+J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
+J.AC=function(a,b){return J.RE(a).Ky(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AJ=function(a,b){return J.RE(a).sWp(a,b)}
-J.AL=function(a){return J.RE(a).gW6(a)}
 J.AR=function(a){return J.RE(a).gWt(a)}
+J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.As=function(a){return J.Wx(a).gVz(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
@@ -20832,104 +21381,116 @@
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
+J.Bo=function(a){return J.RE(a).gIt(a)}
+J.Bq=function(a){return J.RE(a).gLe(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
 J.C7=function(a){return J.RE(a).gLc(a)}
-J.CA=function(a,b){return J.RE(a).sLC(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
 J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
+J.Cs=function(a){return J.RE(a).gyg(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
+J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
 J.D4=function(a,b){return J.RE(a).sA0(a,b)}
-J.DB=function(a){return J.RE(a).gn0(a)}
+J.D8=function(a){return J.RE(a).gl6(a)}
+J.DA=function(a){return J.RE(a).goc(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DR=function(a){return J.RE(a).gEE(a)}
-J.Do=function(a){return J.RE(a).gM0(a)}
+J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
+J.Dv=function(a){return J.Wx(a).zQ(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
+J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
+J.EMK=function(a){return J.RE(a).gV5(a)}
 J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
-J.FH=function(a,b){return J.RE(a).sVX(a,b)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FS=function(a){return J.RE(a).gwp(a)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
+J.G9=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
+J.GF=function(a){return J.RE(a).gz2(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
-J.GL=function(a){return J.RE(a).gfN(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
 J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H1=function(a){return J.RE(a).gLe(a)}
+J.H2=function(a){return J.RE(a).gYi(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
 J.HP=function(a){return J.RE(a).gFK(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
-J.Ha=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Hg=function(a){return J.RE(a).gYe(a)}
-J.Hh=function(a){return J.Wx(a).yu(a)}
+J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
+J.Ho=function(a){return J.RE(a).WJ(a)}
+J.Hy=function(a){return J.RE(a).gZp(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.IA=function(a){return J.RE(a).gjT(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
+J.IR=function(a){return J.RE(a).gkZ(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Ii=function(a){return J.rY(a).gYC(a)}
-J.Ir=function(a){return J.RE(a).ghf(a)}
+J.Ir=function(a){return J.RE(a).gyK(a)}
 J.It=function(a,b){return J.rY(a).Fr(a,b)}
 J.Iw=function(a,b){return J.RE(a).sFL(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J0=function(a,b){return J.RE(a).sR1(a,b)}
-J.J1=function(a){return J.RE(a).PJ(a)}
+J.J1=function(a,b){return J.RE(a).rW(a,b)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
-J.J7=function(a){return J.RE(a).gCt(a)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JG=function(a){return J.RE(a).gHn(a)}
-J.JR=function(a){return J.RE(a).gcK(a)}
+J.JG=function(a,b){return J.RE(a).si0(a,b)}
+J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a){return J.RE(a).gWA(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
 J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a){return J.RE(a).gGV(a)}
+J.Jv=function(a){return J.RE(a).gzG(a)}
 J.K0=function(a){return J.RE(a).gd4(a)}
 J.K2=function(a){return J.RE(a).gtN(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
 J.KG=function(a){return J.RE(a).guz(a)}
+J.KL=function(a){return J.RE(a).gtu(a)}
 J.Kd=function(a){return J.RE(a).gCF(a)}
+J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
 J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.L9=function(a,b){return J.RE(a).sdU(a,b)}
+J.L6=function(a){return J.RE(a).glD(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.LE=function(a){return J.RE(a).VD(a)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
-J.LL=function(a){return J.Wx(a).HG(a)}
-J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
+J.LY=function(a){return J.RE(a).gi0(a)}
+J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a){return J.RE(a).gff(a)}
-J.Ln=function(a){return J.RE(a).gdU(a)}
+J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.Lm=function(a){return J.x(a).gbx(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
-J.MB=function(a){return J.RE(a).gzG(a)}
+J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
-J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MU=function(a,b){return J.RE(a).Fc(a,b)}
+J.MF=function(a,b){return J.RE(a).syK(a,b)}
+J.MI=function(a,b){return J.RE(a).sQR(a,b)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
 J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
@@ -20942,40 +21503,45 @@
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
 J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a,b){return J.RE(a).sKw(a,b)}
+J.NV=function(a){return J.RE(a).gYe(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
+J.Nb=function(a){return J.RE(a).gdH(a)}
 J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
+J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OH=function(a,b){return J.RE(a).sMZ(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
 J.OT=function(a){return J.RE(a).gXE(a)}
+J.OX=function(a){return J.rY(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P3=function(a){return J.RE(a).goL(a)}
-J.PB=function(a){return J.RE(a).gBV(a)}
+J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
+J.PB=function(a){return J.RE(a).gI(a)}
+J.PG=function(a){return J.RE(a).gEE(a)}
+J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
+J.PS=function(a){return J.x(a).gCR(a)}
+J.PW=function(a){return J.RE(a).gVb(a)}
 J.PY=function(a){return J.RE(a).goN(a)}
+J.Pc=function(a,b){return J.RE(a).yU(a,b)}
 J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.rY(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
+J.Px=function(a,b){return J.RE(a).swp(a,b)}
+J.Q0=function(a,b){return J.U6(a).OY(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(a)}
+J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.Qa=function(a){return J.RE(a).gNN(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
@@ -20984,274 +21550,273 @@
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
 J.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
+J.RM=function(a){return J.RE(a).gFY(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.Rg=function(a){return J.x(a).gAY(a)}
+J.Rb=function(a,b){return J.RE(a).sCd(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
+J.Rr=function(a){return J.RE(a).ga7(a)}
 J.Ry=function(a){return J.RE(a).gVE(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
-J.SZ=function(a){return J.RE(a).gSO(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
-J.Sk=function(a,b){return J.RE(a).Gy(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
-J.So=function(a,b){return J.RE(a).X3(a,b)}
 J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
+J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
 J.TP=function(a,b){return J.RE(a).sGV(a,b)}
 J.TY=function(a){return J.RE(a).gvp(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
 J.Tg=function(a){return J.RE(a).gCI(a)}
-J.TmB=function(a){return J.RE(a).gBy(a)}
-J.Tr=function(a){return J.RE(a).gCj(a)}
+J.Tm=function(a){return J.RE(a).grX(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
+J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
 J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U8=function(a){return J.RE(a).gEQ(a)}
+J.UA=function(a){return J.RE(a).gP2(a)}
+J.UE=function(a){return J.w1(a).git(a)}
+J.UM=function(a){return J.RE(a).gu7(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
 J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
+J.UR=function(a){return J.RE(a).Lg(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
-J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V5=function(a,b,c,d){return J.RE(a).Yb(a,b,c,d)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
+J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.rY(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.W2=function(a){return J.RE(a).gCf(a)}
-J.W3=function(a){return J.RE(a).gaE(a)}
 J.WB=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WM=function(a){return J.RE(a).geJ(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.We=function(a,b){return J.RE(a).X3(a,b)}
+J.Wf=function(a){return J.RE(a).D4(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
+J.XHl=function(a){return J.Wx(a).yu(a)}
 J.XJ=function(a){return J.RE(a).gRY(a)}
-J.XK=function(a){return J.x(a).gbx(a)}
+J.XP=function(a){return J.RE(a).Um(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xi=function(a){return J.RE(a).gr9(a)}
-J.Xu=function(a){return J.RE(a).gq1(a)}
+J.Y7=function(a){return J.RE(a).gLU(a)}
 J.YG=function(a){return J.RE(a).gQP(a)}
 J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
+J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
 J.Z8=function(a){return J.w1(a).V1(a)}
+J.ZC=function(a){return J.RE(a).gph(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
-J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
 J.ZN=function(a){return J.RE(a).gqN(a)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
+J.Zh=function(a){return J.RE(a).grJ(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
-J.Zq=function(a){return J.RE(a).glp(a)}
+J.Zp=function(a){return J.RE(a).giZ(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
 J.aT=function(a){return J.RE(a).god(a)}
-J.aW=function(a){return J.RE(a).gJp(a)}
 J.an=function(a,b){return J.RE(a).Id(a,b)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
-J.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
+J.ay=function(a){return J.RE(a).giB(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bL=function(a){return J.RE(a).ghS(a)}
-J.bN=function(a,b){return J.RE(a).GE(a,b)}
 J.bS=function(a){return J.RE(a).gUo(a)}
 J.bh=function(a){return J.RE(a).gLf(a)}
 J.bi=function(a,b){return J.w1(a).h(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.bu=function(a){return J.RE(a).gyw(a)}
+J.c7=function(a){return J.RE(a).guS(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a){return J.RE(a).RE(a)}
+J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
 J.cO=function(a){return J.RE(a).gjx(a)}
+J.cP=function(a){return J.RE(a).gAd(a)}
 J.cU=function(a){return J.RE(a).gHh(a)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
+J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.co=function(a,b){return J.rY(a).nC(a,b)}
-J.cs=function(a){return J.RE(a).gwJ(a)}
-J.d5=function(a){return J.Wx(a).gKy(a)}
+J.dE=function(a){return J.RE(a).gGs(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.du=function(a){return J.RE(a).gUj(a)}
+J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
 J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
 J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
-J.ee=function(a){return J.RE(a).giC(a)}
-J.eg=function(a){return J.RE(a).fV(a)}
+J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
+J.f5=function(a){return J.RE(a).grz(a)}
 J.fD=function(a){return J.RE(a).geS(a)}
+J.fU=function(a){return J.RE(a).gDX(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
-J.fp=function(a){return J.RE(a).yy(a)}
+J.fv=function(a){return J.RE(a).gZ9(a)}
 J.fy=function(a){return J.RE(a).gTj(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hh=function(a,b){return J.Wx(a).Y(a,b)}
 J.hn=function(a){return J.RE(a).gEu(a)}
+J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iB=function(a){return J.RE(a).giC(a)}
 J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
 J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
-J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
+J.is=function(a,b){return J.RE(a).snZ(a,b)}
 J.ix=function(a){return J.RE(a).gnI(a)}
-J.iy=function(a){return J.RE(a).gnD(a)}
-J.j0=function(a){return J.RE(a).gO0(a)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jB=function(a){return J.RE(a).gpf(a)}
-J.jC=function(a){return J.RE(a).gSR(a)}
-J.jY=function(a){return J.RE(a).gWp(a)}
-J.jd=function(a,b){return J.RE(a).snZ(a,b)}
+J.jL=function(a){return J.RE(a).gBV(a)}
+J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
+J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.jl=function(a){return J.RE(a).gHt(a)}
-J.jx=function(a){return J.RE(a).gie(a)}
+J.jq=function(a,b){return J.RE(a).sZp(a,b)}
 J.jzo=function(a){if(typeof a=="number")return-a
 return J.Wx(a).J(a)}
-J.k0=function(a){return J.RE(a).giZ(a)}
 J.k7=function(a){return J.RE(a).gbA(a)}
+J.k9=function(a){return J.RE(a).gWL(a)}
 J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(a)}
+J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(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.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.kv=function(a){return J.RE(a).gDf(a)}
-J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lB=function(a){return J.RE(a).guT(a)}
 J.lN=function(a){return J.RE(a).gil(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.lk=function(a){return J.RE(a).gRq(a)}
 J.ls=function(a){return J.RE(a).gt3(a)}
+J.lu=function(a){return J.RE(a).gJ8(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
 J.m5=function(a){return J.RE(a).gQr(a)}
-J.m8=function(a){return J.RE(a).gR2(a)}
-J.mB=function(a,b){return J.U6(a).Mw(a,b)}
-J.mP=function(a){return J.RE(a).gzj(a)}
+J.mF=function(a){return J.RE(a).gHn(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.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
-J.mZ=function(a){return J.RE(a).gVY(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n0=function(a,b){return J.RE(a).Rf(a,b)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
 J.nG=function(a){return J.RE(a).gv8(a)}
+J.nN=function(a){return J.RE(a).gTt(a)}
 J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
+J.nd=function(a){return J.RE(a).gWk(a)}
+J.nq=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.nv=function(a){return J.RE(a).gLW(a)}
 J.o3=function(a,b){return J.RE(a).sjD(a,b)}
 J.o8=function(a,b){return J.RE(a).sqF(a,b)}
-J.o9=function(a){return J.RE(a).gP2(a)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a){return J.RE(a).UV(a)}
+J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
+J.ol=function(a){return J.RE(a).glp(a)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
+J.p6=function(a){return J.RE(a).gBN(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
+J.pI=function(a){return J.RE(a).gH3(a)}
 J.pO=function(a){return J.U6(a).gor(a)}
-J.pP=function(a){return J.RE(a).gKw(a)}
+J.pP=function(a){return J.RE(a).gDD(a)}
 J.pU=function(a){return J.RE(a).ghN(a)}
+J.pa=function(a){return J.RE(a).Lx(a)}
 J.pm=function(a){return J.RE(a).gt0(a)}
+J.pq=function(a,b){return J.RE(a).sV8(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qb=function(a){return J.RE(a).gmSA(a)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
 J.ql=function(a){return J.RE(a).gaB(a)}
-J.qq=function(a){return J.RE(a).dQ(a)}
 J.qy=function(a){return J.RE(a).gA0(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
 J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.r8=function(a){return J.RE(a).gLC(a)}
-J.rA=function(a,b){return J.w1(a).Nk(a,b)}
 J.rK=function(a){return J.RE(a).gjD(a)}
-J.ra=function(a){return J.RE(a).gJ6(a)}
+J.rL=function(a,b){return J.RE(a).spE(a,b)}
+J.re=function(a){return J.RE(a).gmb(a)}
+J.rk=function(a){return J.RE(a).gke(a)}
+J.ro=function(a){return J.RE(a).gOB(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
+J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tC=function(a){return J.RE(a).gj8(a)}
 J.tG=function(a){return J.RE(a).Zi(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
 J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.tw=function(a){return J.RE(a).je(a)}
+J.tf=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.tv=function(a,b){return J.RE(a).sDX(a,b)}
+J.tw=function(a){return J.RE(a).gCK(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uY=function(a){return J.w1(a).grZ(a)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
-J.up=function(a){return J.RE(a).gkh(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.vI=function(a){return J.RE(a).gVX(a)}
+J.v7=function(a){return J.RE(a).gwX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
+J.vP=function(a,b){return J.RE(a).sR(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(a)}
+J.w0=function(a){return J.RE(a).gxD(a)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
-J.wF=function(a,b){return J.Wx(a).Sy(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
+J.wd=function(a){return J.RE(a).gqw(a)}
+J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
 J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wo=function(a,b){return J.U6(a).Gs(a,b)}
+J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.wz=function(a){return J.RE(a).gzx(a)}
@@ -21261,112 +21826,114 @@
 return J.x(a).n(a,b)}
 J.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-J.xW=function(a,b){return J.RE(a).sZm(a,b)}
-J.xd=function(a){return J.RE(a).gIF(a)}
+J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
+J.y1=function(a){return J.RE(a).gV8(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
 J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yc=function(a){return J.RE(a).guS(a)}
+J.yR=function(a,b){return J.RE(a).XT(a,b)}
 J.yd=function(a){return J.RE(a).xO(a)}
-J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yq=function(a){return J.RE(a).gQl(a)}
+J.yq=function(a){return J.RE(a).gNs(a)}
 J.yz=function(a){return J.RE(a).gLF(a)}
-J.z1=function(a){return J.RE(a).gXr(a)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
+J.z4=function(a){return J.RE(a).gXt(a)}
 J.zB=function(a){return J.RE(a).gee(a)}
 J.zF=function(a){return J.RE(a).gHL(a)}
-J.zH=function(a){return J.RE(a).gIs(a)}
-J.zHh=function(a){return J.RE(a).gt5(a)}
+J.zH=function(a){return J.RE(a).gt5(a)}
+J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.Df=X.hV.prototype
+C.Gx=X.hV.prototype
+C.J9=Q.f7.prototype
 C.Gkp=Y.q6.prototype
 C.C8=B.G6.prototype
-C.QLX=T.vr.prototype
-C.HR=A.wM.prototype
+C.FC=T.vr.prototype
+C.ic=A.wM.prototype
 C.oq=Q.eW.prototype
-C.fe=O.eo.prototype
+C.RD=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
 C.O0=R.JI.prototype
-C.wI=F.ZP.prototype
-C.GhT=L.nJ.prototype
+C.On=F.ZP.prototype
+C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
 C.LTI=A.Gk.prototype
-C.Hb=X.MJ.prototype
-C.MO0=X.J3.prototype
+C.vm=W.H05.prototype
+C.ls6=X.MJ.prototype
+C.n0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.wc=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.Ar=W.fJ.prototype
-C.Ug=E.WS.prototype
-C.GII=E.H8.prototype
+C.W3=W.fJ.prototype
+C.bP=E.WS.prototype
+C.tO=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.wvk=E.qM.prototype
-C.OkI=E.av.prototype
+C.hU=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
-C.yr=E.ds.prototype
+C.RVQ=E.wN.prototype
+C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
 C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.wd=E.L4.prototype
+C.j1o=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Fw=E.uE.prototype
 C.aV=E.n5.prototype
-C.po=B.pR.prototype
+C.QFk=O.Im.prototype
+C.hM=B.pR.prototype
 C.yKx=Z.hx.prototype
 C.aXP=D.Z4.prototype
-C.Vi=D.Qh.prototype
+C.rCJ=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
-C.Ji=D.Oz.prototype
+C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
+C.hys=L.qk.prototype
 C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
+C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.S3=A.UK.prototype
+C.ctm=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
+C.Bn=M.CX.prototype
 C.dl=U.WG.prototype
-C.fv=U.VZ.prototype
-C.S2=W.H9.prototype
+C.um=U.VZ.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
 C.br=A.ye.prototype
 C.IG=A.Bm.prototype
 C.Nk=A.Ya.prototype
 C.Mn=A.NK.prototype
-C.L88=A.Zx.prototype
-C.Y6=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.YpE=V.F1.prototype
+C.L8=A.Zx.prototype
+C.J7=A.Ww.prototype
+C.t5=W.yk.prototype
+C.k0=V.F1.prototype
 C.Pfz=Z.uL.prototype
 C.Sx=J.iCW.prototype
 C.GBL=A.xc.prototype
 C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.c07=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
@@ -21374,25 +21941,25 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.uC=X.uw.prototype
+C.bg3=X.uw.prototype
 C.OKl=A.G1.prototype
-C.Rr=U.Um.prototype
+C.Uav=U.Um.prototype
 C.vB=J.kdQ.prototype
-C.hj=V.D2.prototype
+C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
-C.vA=X.I5.prototype
+C.V8=X.I5.prototype
 C.Hd=U.el.prototype
-C.ol=W.K5.prototype
+C.Ui=W.K5.prototype
 C.Kn=new H.hJ()
-C.OL=new U.EO()
+C.x4=new U.EO()
+C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
-C.qY=new T.yy()
+C.qY=new T.hC()
 C.ZB=new P.yRf()
 C.pr=new P.mgb()
 C.aZ=new L.iNc()
 C.NU=new P.R81()
-C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
@@ -21400,22 +21967,22 @@
 C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
-C.hU=new A.iYn(2)
+C.cn=new A.iYn(2)
 C.hf=new H.tx("label")
 C.Gh=H.IL('qU')
 C.B10=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
+C.vrd=new A.xn(!1)
+I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
-C.ucP=I.uL([C.B10,C.vrd])
+C.ucP=I.uLC([C.B10,C.vrd])
 C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.IL('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
 C.Zg=new H.tx("args")
-C.SXK=H.IL('qC')
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.UZ=H.IL('qC')
+C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
 C.MR=H.IL('vO')
 C.S9=new A.ES(C.SR,C.BM,!1,C.MR,!1,C.ucP)
@@ -21424,15 +21991,15 @@
 C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
 C.UL=new H.tx("profileChanged")
 C.yQP=H.IL('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.dn)
+C.dn=I.uLC([])
+C.mM=new A.ES(C.UL,C.cn,!1,C.yQP,!1,C.dn)
 C.TU=new H.tx("endPosChanged")
-C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.dn)
+C.Cp=new A.ES(C.TU,C.cn,!1,C.yQP,!1,C.dn)
 C.ne=new H.tx("exception")
 C.SNu=H.IL('EP')
 C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
 C.Wm=new H.tx("refChanged")
-C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.dn)
+C.QW=new A.ES(C.Wm,C.cn,!1,C.yQP,!1,C.dn)
 C.UY=new H.tx("result")
 C.SmN=H.IL('af')
 C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -21441,8 +22008,8 @@
 C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
 C.SA=new H.tx("lines")
 C.hAX=H.IL('WO')
-C.J19=new K.nd()
-C.X0=I.uL([C.B10,C.J19])
+C.J19=new K.iv()
+C.X0=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
 C.zU=new H.tx("uncheckedText")
 C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
@@ -21455,8 +22022,8 @@
 C.A7=new H.tx("height")
 C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
 C.XA=new H.tx("cls")
-C.jF=H.IL('dy')
-C.dq=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
+C.jFX=H.IL('dy')
+C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
 C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.X0)
 C.rB=new H.tx("isolate")
@@ -21465,9 +22032,9 @@
 C.mJ=new H.tx("color")
 C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
-C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.dn)
+C.Bk=new A.ES(C.bz,C.cn,!1,C.yQP,!1,C.dn)
 C.CG=new H.tx("posChanged")
-C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.dn)
+C.Ml=new A.ES(C.CG,C.cn,!1,C.yQP,!1,C.dn)
 C.yh=new H.tx("error")
 C.oUD=H.IL('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
@@ -21486,12 +22053,14 @@
 C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.X0)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
+C.uO=new H.tx("inboundReferences")
+C.JT=new A.ES(C.uO,C.BM,!1,C.MR,!1,C.ucP)
 C.He=new H.tx("hideTagsChecked")
 C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.dn)
+C.kQ=new A.ES(C.ba,C.cn,!1,C.yQP,!1,C.dn)
 C.Rs=new H.tx("currentPosChanged")
-C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.dn)
+C.EW=new A.ES(C.Rs,C.cn,!1,C.yQP,!1,C.dn)
 C.zz=new H.tx("timeSpan")
 C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.X0)
 C.mr=new H.tx("expanded")
@@ -21499,11 +22068,11 @@
 C.kw=new H.tx("trace")
 C.oC=new A.ES(C.kw,C.BM,!1,C.MR,!1,C.ucP)
 C.qX=new H.tx("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.dn)
+C.dO=new A.ES(C.qX,C.cn,!1,C.yQP,!1,C.dn)
 C.UX=new H.tx("msg")
 C.Pt=new A.ES(C.UX,C.BM,!1,C.MR,!1,C.ucP)
 C.rP=new H.tx("mapChanged")
-C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.dn)
+C.Nt=new A.ES(C.rP,C.cn,!1,C.yQP,!1,C.dn)
 C.nf=new H.tx("function")
 C.QJ7=H.IL('Kp')
 C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.ucP)
@@ -21561,26 +22130,26 @@
 C.pH=new H.tx("small")
 C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
 C.li=new H.tx("startPosChanged")
-C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.dn)
+C.Tz=new A.ES(C.li,C.cn,!1,C.yQP,!1,C.dn)
 C.ox=new H.tx("countersChanged")
-C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.dn)
+C.Rh=new A.ES(C.ox,C.cn,!1,C.yQP,!1,C.dn)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
 C.bJ=new H.tx("counters")
-C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
 C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.X0)
 C.Ys=new H.tx("pad")
 C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
 C.N8=new H.tx("scriptChanged")
-C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
+C.qE=new A.ES(C.N8,C.cn,!1,C.yQP,!1,C.dn)
 C.YT=new H.tx("expr")
-C.eP=H.IL('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
+C.wG=H.IL('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
 C.vZ=new A.ES(C.yB,C.BM,!1,C.MR,!1,C.X0)
 C.xS=new H.tx("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.dn)
+C.bB=new A.ES(C.xS,C.cn,!1,C.yQP,!1,C.dn)
 C.jU=new H.tx("file")
 C.bw=new A.ES(C.jU,C.BM,!1,C.MR,!1,C.ucP)
 C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
@@ -21601,7 +22170,7 @@
 C.aP=new H.tx("active")
 C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
-C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.dn)
+C.az=new A.ES(C.Gn,C.cn,!1,C.yQP,!1,C.dn)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
 C.pM=H.IL('kx')
@@ -21618,9 +22187,9 @@
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.X0)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
 C.OO=new H.tx("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
+C.Cf=new A.ES(C.OO,C.BM,!1,C.UZ,!1,C.ucP)
 C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.eP,!1,C.X0)
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.X0)
 C.uk=new H.tx("last")
 C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
 C.am=new H.tx("chromeTargets")
@@ -21630,16 +22199,16 @@
 C.WQ=new H.tx("field")
 C.ah=new A.ES(C.WQ,C.BM,!1,C.MR,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
-C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.dn)
+C.nP=new A.ES(C.r1,C.cn,!1,C.yQP,!1,C.dn)
 C.Mc=new H.tx("flagList")
 C.f0=new A.ES(C.Mc,C.BM,!1,C.MR,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.fz=new A.ES(C.fn,C.BM,!1,C.MR,!1,C.ucP)
 C.rE=new H.tx("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
+C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
 C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
-C.ngm=I.uL([C.J19])
+C.ngm=I.uLC([C.J19])
 C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
 C.mi=new H.tx("text")
 C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.X0)
@@ -21651,20 +22220,23 @@
 C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
 C.oqo=H.IL('pD')
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
+C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
+C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.X0)
 C.ny=new P.a6(0)
+C.it=new P.moY(!1)
 C.i6=H.VM(new W.FkO("close"),[W.BI])
 C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
-C.JN=H.VM(new W.FkO("error"),[W.ew])
+C.JN=H.VM(new W.FkO("error"),[W.ew7])
 C.MD=H.VM(new W.FkO("error"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.ew])
-C.ph=H.VM(new W.FkO("message"),[W.Hy])
+C.LF=H.VM(new W.FkO("load"),[W.ew7])
+C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
+C.ph=H.VM(new W.FkO("message"),[W.cxu])
 C.Whw=H.VM(new W.FkO("mousedown"),[W.AjY])
 C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
 C.JL=H.VM(new W.FkO("open"),[W.ea])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
+C.yf=H.VM(new W.FkO("popstate"),[W.PF])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -21716,39 +22288,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.MA=function() {
-  function typeNameInChrome(o) {
-    var name = o.constructor.name;
-    if (name) return name;
-    var s = Object.prototype.toString.call(o);
-    return s.substring(8, s.length - 1);
-  }
-  function getUnknownTag(object, tag) {
-    if (/^HTML[A-Z].*Element$/.test(tag)) {
-      var name = Object.prototype.toString.call(object);
-      if (name == "[object Object]") return null;
-      return "HTMLElement";
-    }
-  }
-  function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
-    return getUnknownTag(object, tag);
-  }
-  function prototypeForTag(tag) {
-    if (typeof window == "undefined") return null;
-    if (typeof window[tag] == "undefined") return null;
-    var constructor = window[tag];
-    if (typeof constructor != "function") return null;
-    return constructor.prototype;
-  }
-  function discriminator(tag) { return null; }
-  var isBrowser = typeof navigator == "object";
-  return {
-    getTag: typeNameInChrome,
-    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
-    prototypeForTag: prototypeForTag,
-    discriminator: discriminator };
-}
 C.M1=function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
@@ -21778,6 +22317,39 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
+C.GM=function() {
+  function typeNameInChrome(o) {
+    var name = o.constructor.name;
+    if (name) return name;
+    var s = Object.prototype.toString.call(o);
+    return s.substring(8, s.length - 1);
+  }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = Object.prototype.toString.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: typeNameInChrome,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+}
 C.hQ=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
@@ -21804,48 +22376,51 @@
 C.IF=new N.qV("INFO",800)
 C.cd=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.Gb=H.VM(I.uL([127,2047,65535,1114111]),[P.KN])
-C.NG=I.uL([1,6])
-C.JH=I.uL([0,0,26624,1023,0,0,65534,2047])
+C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
+C.NG=I.uLC([1,6])
+C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.Uq=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-C.Zw=I.uL([C.SY,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.pzc=H.IL('nd')
-C.Cd=I.uL([C.pzc])
-C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
-C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
-C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.LyD=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.UM()},C.MEG)
-C.tq=H.IL('Bo')
+C.WK=I.uLC([C.SY,C.Uq,C.Wn,C.ai,C.nZ])
+C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
+C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
+C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.fJ3=H.IL('iv')
+C.fo=I.uLC([C.fJ3])
+C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
+C.jY=I.uLC(["as","in","this"])
+C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
+C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.mk=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
+C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.iq=I.uLC([40,41,91,93,123,125])
+C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.lY=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.zao)
+C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
+C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
+C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.iM=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
+C.MEG=I.uLC(["enumerate"])
+C.mB=new H.LPe(1,{enumerate:K.FLA()},C.MEG)
+C.lM=H.IL('M8')
+C.jUO=H.IL('xn')
+C.erP=I.uLC([C.jUO])
+C.LM=new A.rv(!0,!0,!0,C.lM,!1,!1,C.erP,null)
 C.uwj=H.IL('wA')
-C.wE=I.uL([C.uwj])
-C.Tb=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
+C.wE=I.uLC([C.uwj])
+C.nk=new A.rv(!1,!1,!0,C.lM,!1,!0,C.wE,null)
 C.eQn=H.IL('Yj')
-C.Qnw=I.uL([C.eQn])
-C.rL=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
-C.uDk=H.IL('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
+C.Qnw=I.uLC([C.eQn])
+C.ci=new A.rv(!0,!0,!0,C.lM,!1,!1,C.Qnw,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -21873,6 +22448,7 @@
 C.la=new H.tx("connectToVm")
 C.Je=new H.tx("current")
 C.RG=new H.tx("currentPage")
+C.ee=new H.tx("data")
 C.Lw=new H.tx("deleteVm")
 C.eR=new H.tx("deoptimizations")
 C.iE=new H.tx("descriptor")
@@ -21888,6 +22464,7 @@
 C.Pn=new H.tx("expanderStyle")
 C.h7=new H.tx("external")
 C.R3=new H.tx("fd")
+C.cJ=new H.tx("fetchInboundReferences")
 C.fV=new H.tx("fields")
 C.Gd=new H.tx("firstTokenPos")
 C.FP=new H.tx("formatSize")
@@ -21945,6 +22522,7 @@
 C.pY=new H.tx("isOptimized")
 C.XL=new H.tx("isPatch")
 C.LA=new H.tx("isPipe")
+C.nQ=new H.tx("isPsuedoNull")
 C.AT=new H.tx("isStatic")
 C.Lk=new H.tx("isString")
 C.dK=new H.tx("isType")
@@ -21987,6 +22565,7 @@
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
 C.I7=new H.tx("readClosed")
+C.vK=new H.tx("reference")
 C.GR=new H.tx("refresh")
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
@@ -22006,15 +22585,19 @@
 C.EA=new H.tx("scripts")
 C.oW=new H.tx("selectExpr")
 C.hd=new H.tx("serviceType")
+C.Jd=new H.tx("slot")
+C.Y4=new H.tx("slotIsArrayIndex")
+C.Si=new H.tx("slotIsField")
 C.jM=new H.tx("socketOwner")
+C.rd=new H.tx("source")
 C.HO=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
 C.ks=new H.tx("stepInto")
 C.Om=new H.tx("stepOut")
 C.iC=new H.tx("stepOver")
-C.k5=new H.tx("subClasses")
 C.Nv=new H.tx("subclass")
-C.Cw=new H.tx("superClass")
+C.Wo=new H.tx("subclasses")
+C.FZ=new H.tx("superclass")
 C.QF=new H.tx("targets")
 C.eO=new H.tx("timeStamp")
 C.hO=new H.tx("tipExclusive")
@@ -22030,7 +22613,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.Kj=new H.tx("totalSamplesInProfile")
+C.kr=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.J2=new H.tx("typeChecksEnabled")
 C.OU=new H.tx("unoptimizedCode")
@@ -22046,7 +22629,7 @@
 C.zn=new H.tx("version")
 C.Tc=new H.tx("vmName")
 C.Uy=new H.tx("writeClosed")
-C.MI=H.IL('hx')
+C.k5=H.IL('hx')
 C.hP=H.IL('uz')
 C.Qb=H.IL('J3')
 C.Mf=H.IL('G1')
@@ -22057,31 +22640,32 @@
 C.uh=H.IL('aI')
 C.Y3=H.IL('CY')
 C.QJ=H.IL('WG')
-C.lU=H.IL('Hl')
+C.Fn=H.IL('Hl')
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
-C.dP=H.IL('vm')
 C.Vx=H.IL('MJ')
+C.Vh=H.IL('Pz')
 C.rR=H.IL('wN')
 C.kt=H.IL('Um')
 C.yS=H.IL('G6')
 C.Sb=H.IL('kn')
-C.FQ=H.IL('a')
+C.AP=H.IL('a')
 C.Yc=H.IL('iP')
 C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
 C.Jo=H.IL('i7')
 C.ON=H.IL('ov')
 C.jR=H.IL('Be')
+C.uC=H.IL('Im')
 C.al=H.IL('es')
 C.PT=H.IL('CX')
 C.iD=H.IL('Vb')
 C.ce=H.IL('kK')
 C.dD=H.IL('av')
 C.FA=H.IL('Ya')
-C.PF=H.IL('yyN')
+C.PFz=H.IL('yyN')
 C.Th=H.IL('fI')
-C.aN=H.IL('Vf')
+C.Df=H.IL('Vf')
 C.tU=H.IL('L4')
 C.yT=H.IL('FK')
 C.cK=H.IL('I5')
@@ -22093,6 +22677,8 @@
 C.ca=H.IL('Z4')
 C.pJ=H.IL('Q6')
 C.Yy=H.IL('uE')
+C.nC=H.IL('cQ')
+C.M5=H.IL('yc')
 C.Yxm=H.IL('Pg')
 C.il=H.IL('xI')
 C.lp=H.IL('LU')
@@ -22101,13 +22687,11 @@
 C.EG=H.IL('Oz')
 C.nw=H.IL('eo')
 C.OG=H.IL('eW')
-C.oZ=H.IL('HS')
 C.km=H.IL('fl')
 C.jV=H.IL('rF')
 C.Tq=H.IL('vj')
 C.ou=H.IL('ak')
 C.JW=H.IL('Ww')
-C.UR=H.IL('Zc')
 C.CT=H.IL('St')
 C.wH=H.IL('zM')
 C.l4=H.IL('uL')
@@ -22122,15 +22706,15 @@
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
+C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
 C.pF=H.IL('WS')
 C.qZ=H.IL('DE')
 C.jw=H.IL('xc')
 C.NW=H.IL('ye')
-C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
-C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
+C.nW=H.IL('V2')
 C.he=H.IL('qM')
 C.Jm=H.IL('q6')
 C.Wz=H.IL('pR')
@@ -22147,7 +22731,8 @@
 C.lE=H.IL('DK')
 C.Az=H.IL('Gk')
 C.GX=H.IL('c8')
-C.NS=H.IL('wP')
+C.R9=H.IL('f7')
+C.hg=H.IL('vi')
 C.X8=H.IL('Ti')
 C.Lg=H.IL('JI')
 C.Ju=H.IL('Ly')
@@ -22155,11 +22740,27 @@
 C.XWY=H.IL('uEY')
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
-C.xM=new P.z0(!1)
+C.xM=new P.u5F(!1)
+C.NA=new P.fM(C.NU,P.Uwa())
+C.Xk=new P.fM(C.NU,P.Dk())
+C.F6=new P.fM(C.NU,P.H9())
+C.Rt=new P.fM(C.NU,P.wLZ())
+C.Sq=new P.fM(C.NU,P.zci())
+C.mc=new P.fM(C.NU,P.OjX())
+C.uo=new P.fM(C.NU,P.uy1())
+C.pj=new P.fM(C.NU,P.qJ6())
+C.lk=new P.fM(C.NU,P.qKH())
+C.Gu=new P.fM(C.NU,P.tz())
+C.Yl=new P.fM(C.NU,P.MM())
+C.Zc=new P.fM(C.NU,P.G2())
+C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
-$.Vz=1
+$.VzC=null
+$.kz=1
 $.z7="$cachedFunction"
-$.eb="$cachedInvocation"
+$.Mr="$cachedInvocation"
+$.xG=null
+$.hG=null
 $.OK=0
 $.bf=null
 $.P4=null
@@ -22175,35 +22776,35 @@
 $.oK=null
 $.S6=null
 $.k8=null
+$.mg=null
+$.v5=!1
 $.X3=C.NU
+$.Sk=null
 $.Km=0
+$.Ji=null
 $.Qz=null
 $.R6=null
 $.RL=!1
-$.Y4=C.IF
+$.DR=C.IF
 $.xO=0
 $.Nc=0
 $.Oo=null
 $.Td=!1
-$.jq=0
+$.FU=0
 $.ljh=1
 $.zk=2
-$.xG=null
+$.rf=null
 $.ok=!1
-$.AC=!1
+$.oQ=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
 $.xV=null
 $.ax=null
-$.Lz=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.vH},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.mA},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.Thl},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.Qj},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.S1},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.V4},C.u4,U.VZ,{created:U.n2},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.Sc},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.xA},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.O3},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.m6},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii1},C.Io,D.Qh,{created:D.b2},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","Ou",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","Fv",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","WH","FX",function(){return $.jk().postMessage!==void 0})
+$.Lz=[C.lM,W.M8,{},C.k5,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.RN},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.Xn},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.yC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.Jz},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.rA},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.BB},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.l4,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.Nw,T.vr,{created:T.aed},C.a8,A.Zx,{created:A.zC},C.NR,K.nm,{created:K.ant},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.mBQ},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
 I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
@@ -22219,48 +22820,50 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
+I.$lazy($,"_rootMap","ln","Rf",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
+I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
+I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
 I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qa","Js",function(){return new L.TV([])})
-I.$lazy($,"_identRegExp","Nb","Gx",function(){return new L.lPa().$0()})
-I.$lazy($,"_logger","Vh","VND",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_instance","l7","lf",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.DOe().$0()})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Zl)})
-I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.So)})
+I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","mw",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","wC","V9",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","yeH",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_sheetLog","dz","bm",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","cq","rt",function(){return new A.rv(!1,!1,!0,C.lM,!1,!0,null,A.tq())})
+I.$lazy($,"_ATTRIBUTES_REGEX","mD","wm",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
+I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dnO",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
+I.$lazy($,"_eventsLog","Tb","q1",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","ho","CE",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.HL,new Z.W6o(),C.yw,new Z.MdQ(),C.aN,new Z.YJG()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w0(),"-",new K.w5(),"!",new K.w10()],null,null)})
-I.$lazy($,"_instance","ln","Cs",function(){return new K.me()})
+I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","zG",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","f8","bI",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","Al",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.Df,new Z.MdQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.Raa(),"-",new K.w5(),"!",new K.w10()],null,null)})
+I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",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($,"kRegularFunction","Ij","YF",function(){return new D.ma("function")})
+I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
 I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
-I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.ma("getter function")})
+I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
 I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
 I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
 I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
@@ -22277,18 +22880,17 @@
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","DH",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","tF",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return C.xB.g("template, ",J.ZG(J.kl(C.z5.gvc(C.z5),new M.DOe()),", "))})
-I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
-I.$lazy($,"_instanceExtension","Xa","FC",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.xB.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.YJG()),", "))})
+I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.lPa())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Ufa().$0()})
+I.$lazy($,"_instanceExtension","nB","Tn",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:233}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"n9",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"X7",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"cX",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"f",{func:"LN",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"VT",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"zo",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.aYy,P.T8]},{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.fRn,P.fRn]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v",{func:"DW",ret:U.Ip,args:[P.qU]},{func:"d7",args:[U.Ip,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},{func:"If",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"mI",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data","theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each",{func:"xA",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"uG",void:true,args:[W.AjY]},"result",{func:"wQ",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"Hq",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.Vf]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.e4y,P.JBS]},{func:"Zg",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"fh",void:true,args:[P.a,P.a]},"prop","records",{func:"qk",args:[L.Zl,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"JR",args:[null,P.qU,P.qU]},"k",{func:"cm",args:[null,W.KV,P.a2]},{func:"Nw",ret:P.a2,args:[null],named:{skipChanges:P.a2}},"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"line",{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"uc",void:true,args:[P.qU,L.U2]},{func:"js",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.Hy]},"exp","details",{func:"D2i",ret:A.Ap,args:[P.qU]},"ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"FM",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"LP",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"cX",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"VT",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"Bp",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"Glb",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v",{func:"DW",ret:U.Ip,args:[P.qU]},{func:"ZU",args:[U.Ip,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"If",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.PF]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"la",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"pG",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.a2},"ignored","convert","element",{func:"K5",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time","ref",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"P5",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"pD",ret:P.a2,args:[null],named:{skipChanges:P.a2}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"zv",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"Xa",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg","exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},{func:"K7",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -22319,22 +22921,6 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-return}if(document.currentScript){a(document.currentScript)
-return}var z=document.scripts
-function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.rk(),b)},[])}else{(function(b){H.wW(E.rk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -22448,6 +23034,22 @@
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
+Isolate.uLC=a.uLC
 return Isolate}}
+!function(){function intern(a){var u={}
+u[a]=1
+return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
+var z="___dart_isolate_tags_"
+var y=Object[z]||(Object[z]=Object.create(null))
+var x="_ZxYxX"
+for(var w=0;;w++){var v=intern(x+"_"+w+"_")
+if(!(v in y)){y[v]=1
+init.isolateTag=v
+break}}}()
+init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
+;(function(a){if(typeof document==="undefined"){a(null)
+return}if(document.currentScript){a(document.currentScript)
+return}var z=document.scripts
+function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.KU(),b)},[])}else{(function(b){H.Ke(E.KU(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_ref.html
index 8d39d2e..726a48e 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 
 <polymer-element name="class-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="css/shared.css"><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+  <template><link rel="stylesheet" href="css/shared.css"><span><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 <script type="application/dart" src="class_ref.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
index cf87ab2..de1e0a4 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/class_view.html
@@ -51,19 +51,19 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls.superClass != null }}">
+        <template if="{{ cls.superclass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls.superclass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls.subClasses.length > 0 }}">
+        <template if="{{ cls.subclasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls.subClasses }}">
+              <template repeat="{{ subclass in cls.subclasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
index a02762e..1bb23f3 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -6,19 +6,19 @@
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="css/shared.css">
-    <div>
+    <span>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
       <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &&
+      <template if="{{ (ref['declaredType'].name == 'dynamic' &&
                         !ref['final'] && !ref['const']) }}">
         var
       </template>
-      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-    </div>
+    </span>
   </template>
 </polymer-element>
 
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
index 307cb77..c785aaa 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/field_view.html
@@ -19,7 +19,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -29,14 +29,14 @@
         <template if="{{ field['static'] }}">static</template>
         <template if="{{ field['final'] }}">final</template>
         <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declared_type']['name'] == 'dynamic' &&
+        <template if="{{ (field['declaredType'].name == 'dynamic' &&
                          !field['final'] && !field['const']) }}">
           var
         </template>
-        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
-          {{ field['declared_type']['user_name'] }}
+        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
+          {{ field['declaredType'].name }}
         </template>
-        {{ field['user_name'] }}
+        {{ field.name }}
       </h1>
       <div class="memberList">
         <div class="memberItem">
@@ -61,19 +61,19 @@
                title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guard_class'] == 'dynamic' }}">
+              <template if="{{ field['guardClass'] == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guard_class'] == 'unknown' }}">
+              <template if="{{ field['guardClass'] == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guard_class'] != 'unknown' &&
-                            field['guard_class'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-                <template if="{{ field['guard_nullable'] }}">
+              <template if="{{ field['guardClass'] != 'unknown' &&
+                            field['guardClass'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
+                <template if="{{ field['guardNullable'] }}">
                   &mdash; null observed
                 </template>
-                <template if="{{ !field['guard_nullable'] }}">
+                <template if="{{ !field['guardNullable'] }}">
                   &mdash; null not observed
                 </template>
               </template>
@@ -93,4 +93,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="field_view.dart"></script>
\ No newline at end of file
+<script type="application/dart" src="field_view.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/inbound_reference.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/inbound_reference.html
new file mode 100644
index 0000000..c613469
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/inbound_reference.html
@@ -0,0 +1,29 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
+<polymer-element name="inbound-reference" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <div>
+      from <any-service-ref ref="{{ source }}"></any-service-ref>
+      <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
+      <template if="{{ slotIsField }}">via <field-ref ref="{{ slot }}"></template>
+
+      <curly-block callback="{{ expander() }}">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">
+              <template repeat="{{ reference in inboundReferences] }}">
+                <inbound-reference ref="{{ reference }}"></inbound-reference>
+              </template>
+            </div>
+          </div>
+        </div>
+      </curly-block>
+    </div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="inbound_reference.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_ref.html
index efb7040..be0893c 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -18,30 +18,31 @@
       }
     </style>
     <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
+      <template if="{{ isError(ref) }}">
+         <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isUnexpected(ref.serviceType) }}">
+      <template if="{{ isUnexpected(ref) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNull(ref.serviceType) }}">
+      <template if="{{ isPsuedoNull(ref) }}">
         <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
+      <template if="{{ (isString(ref) ||
+                        isBool(ref) ||
+                        isNull(ref) ||
+                        isInt(ref)) ||
+                        isDouble(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ (isType(ref.serviceType)) }}">
+      <template if="{{ (isType(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &&
+      <template if="{{ isInstance(ref) &&
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
@@ -49,7 +50,7 @@
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &&
+      <template if="{{ isInstance(ref) &&
                        ref['closureFunc'] == null}}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
@@ -68,7 +69,7 @@
         </curly-block>
       </template>
 
-      <template if="{{ isList(ref.serviceType) }}">
+      <template if="{{ isList(ref) }}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -87,4 +88,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="instance_ref.dart"></script>
\ No newline at end of file
+<script type="application/dart" src="instance_ref.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
index c85d64f..1d7166c 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -5,6 +5,7 @@
 <link rel="import" href="eval_link.html">
 <link rel="import" href="field_ref.html">
 <link rel="import" href="function_ref.html">
+<link rel="import" href="inbound_reference.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
@@ -80,12 +81,12 @@
                 <div class="memberItem">
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
-                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <any-service-ref ref="{{ element['value'] }}"></any-service-ref>
                     <template if="{{ element['parentField'] != null }}">
-                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref> of
                     </template>
                     <template if="{{ element['parentListIndex'] != null }}">
-                      at list index {{ element['parentListIndex'] }} of
+                      in [{{ element['parentListIndex'] }}] of
                     </template>
                   </div>
                   </div>
@@ -101,6 +102,22 @@
               </template>
             </div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">inbound references</div>
+            <div class="memberValue">
+              <template if="{{ inboundReferences == null }}">
+                <eval-link callback="{{ fetchInboundReferences }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ inboundReferences != null }}">
+                <template repeat="{{ reference in inboundReferences['references'] }}">
+                  <inbound-reference ref="{{ reference }}"></inbound-reference>
+                </template>
+              </template>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
index d8e04c9..3b4b930 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/observatory/src/elements/service_ref.html
@@ -4,4 +4,7 @@
 <polymer-element name="service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="any-service-ref" extends="observatory-element">
+</polymer-element>
+
 <script type="application/dart" src="service_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
index efa1301..7ce882c 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
@@ -7,7 +7,9 @@
   var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
   if (!ShadowDOMPolyfill) return;
 
-  if (navigator.userAgent.indexOf('(Dart)') !== -1) {
+  // TODO(sigmund): remove the userAgent check once 1.6 rolls as stable.
+  // See: dartbug.com/18463
+  if (navigator.dartEnabled || (navigator.userAgent.indexOf('(Dart)') !== -1)) {
     console.error("ShadowDOMPolyfill polyfill was loaded in Dartium. This " +
         "will not work. This indicates that Dartium's Chrome version is " +
         "not compatible with this version of web_components.");
diff --git a/runtime/bin/vmservice/observatory/lib/service.dart b/runtime/bin/vmservice/observatory/lib/service.dart
index 97a3de9..9b66b2e 100644
--- a/runtime/bin/vmservice/observatory/lib/service.dart
+++ b/runtime/bin/vmservice/observatory/lib/service.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:typed_data';
 
 import 'package:logging/logging.dart';
 import 'package:observatory/tracer.dart';
diff --git a/runtime/bin/vmservice/observatory/lib/service_common.dart b/runtime/bin/vmservice/observatory/lib/service_common.dart
index d38366ee..1354888 100644
--- a/runtime/bin/vmservice/observatory/lib/service_common.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_common.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:typed_data';
 
 import 'package:logging/logging.dart';
 import 'package:observatory/service.dart';
@@ -69,6 +70,7 @@
   bool get isOpen;
   void send(dynamic data);
   void close();
+  Future<ByteData> nonStringToByteData(dynamic data);
 }
 
 /// A [CommonWebSocketVM] communicates with a Dart VM over a CommonWebSocket.
@@ -85,6 +87,7 @@
       new Map<String, _WebSocketRequest>();
   int _requestSerial = 0;
   bool _hasInitiatedConnect = false;
+  Utf8Decoder _utf8Decoder = new Utf8Decoder();
 
   CommonWebSocket _webSocket;
 
@@ -160,7 +163,23 @@
 
   // WebSocket message event handler.
   void _onMessage(dynamic data) {
-    assert(data is String);  // We don't handle binary data, yet.
+    if (data is! String) {
+      _webSocket.nonStringToByteData(data).then((ByteData bytes) {
+        // See format spec. in VMs Service::SendEvent.
+        int offset = 0;
+        int metaSize = bytes.getUint64(offset, Endianness.BIG_ENDIAN);
+        offset += 8;
+        var meta = _utf8Decoder.convert(new Uint8List.view(
+            bytes.buffer, bytes.offsetInBytes + offset, metaSize));
+        offset += metaSize;
+        var data = new ByteData.view(
+            bytes.buffer,
+            bytes.offsetInBytes + offset,
+            bytes.lengthInBytes - offset);
+        postEventMessage(meta, data);
+      });
+      return;
+    }
     var map = JSON.decode(data);
     if (map == null) {
       Logger.root.severe('WebSocketVM got empty message');
diff --git a/runtime/bin/vmservice/observatory/lib/service_html.dart b/runtime/bin/vmservice/observatory/lib/service_html.dart
index cb3d9bb..14f7311 100644
--- a/runtime/bin/vmservice/observatory/lib/service_html.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_html.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:html';
+import 'dart:typed_data';
 
 import 'package:observatory/service_common.dart';
 
@@ -37,6 +38,14 @@
   void close() {
     _webSocket.close();
   }
+  
+  Future<ByteData> nonStringToByteData(dynamic data) {
+    assert(data is Blob);
+    FileReader fileReader = new FileReader();
+    fileReader.readAsArrayBuffer(data);
+    return fileReader.onLoadEnd.first.then((e)
+        => new ByteData.view(fileReader.result));
+  }
 }
 
 /// The [WebSocketVM] communicates with a Dart VM over WebSocket. The Dart VM
diff --git a/runtime/bin/vmservice/observatory/lib/service_io.dart b/runtime/bin/vmservice/observatory/lib/service_io.dart
index aa65400..77b7964 100644
--- a/runtime/bin/vmservice/observatory/lib/service_io.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_io.dart
@@ -4,7 +4,9 @@
 
 library service_io;
 
+import 'dart:async';
 import 'dart:io';
+import 'dart:typed_data';
 
 import 'package:observatory/service_common.dart';
 
@@ -40,6 +42,15 @@
   void close() {
     _webSocket.close();
   }
+  
+  Future<ByteData> nonStringToByteData(dynamic data) {
+    assert(data is Uint8List);
+    print('nonString: ${data.lengthInBytes}, $data');
+    return new Future.sync(() =>
+        new ByteData.view(data.buffer,
+                          data.offsetInBytes,
+                          data.lengthInBytes));
+  }
 }
 
 /// The [WebSocketVM] communicates with a Dart VM over WebSocket. The Dart VM
diff --git a/runtime/bin/vmservice/observatory/lib/src/app/application.dart b/runtime/bin/vmservice/observatory/lib/src/app/application.dart
index 84a5ae2..c3018c9 100644
--- a/runtime/bin/vmservice/observatory/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/app/application.dart
@@ -89,7 +89,7 @@
 
       default:
         // Ignore unrecognized events.
-        Logger.root.severe('Unrecognized event type: ${event.eventType}');
+        Logger.root.severe('Unrecognized event: $event');
         break;
     }
   }
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/class_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/class_ref.html
index 8d39d2e..726a48e 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/class_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 
 <polymer-element name="class-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="css/shared.css"><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+  <template><link rel="stylesheet" href="css/shared.css"><span><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 <script type="application/dart" src="class_ref.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/class_tree.dart b/runtime/bin/vmservice/observatory/lib/src/elements/class_tree.dart
index c4d1613..c9e1153 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/class_tree.dart
@@ -24,11 +24,11 @@
       // Child rows already created.
       return;
     }
-    for (var subClass in cls.children) {
-      if (subClass.isPatch) {
+    for (var subclass in cls.subclasses) {
+      if (subclass.isPatch) {
         continue;
       }
-      var row = new ClassTreeRow(isolate, subClass, this);
+      var row = new ClassTreeRow(isolate, subclass, this);
       children.add(row);
     }
   }
@@ -37,7 +37,7 @@
   }
 
   bool hasChildren() {
-    return cls.children.length > 0;
+    return cls.subclasses.length > 0;
   }
 }
 
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
index cf87ab2..de1e0a4 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/class_view.html
@@ -51,19 +51,19 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls.superClass != null }}">
+        <template if="{{ cls.superclass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls.superclass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls.subClasses.length > 0 }}">
+        <template if="{{ cls.subclasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls.subClasses }}">
+              <template repeat="{{ subclass in cls.subclasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
index a02762e..1bb23f3 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/field_ref.html
@@ -6,19 +6,19 @@
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="css/shared.css">
-    <div>
+    <span>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
       <template if="{{ ref['const'] }}">const</template>
-      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &&
+      <template if="{{ (ref['declaredType'].name == 'dynamic' &&
                         !ref['final'] && !ref['const']) }}">
         var
       </template>
-      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      <template if="{{ (ref['declaredType'].name != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declaredType'] }}"></instance-ref>
       </template>
       <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-    </div>
+    </span>
   </template>
 </polymer-element>
 
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
index 307cb77..c785aaa 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/field_view.html
@@ -19,7 +19,7 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -29,14 +29,14 @@
         <template if="{{ field['static'] }}">static</template>
         <template if="{{ field['final'] }}">final</template>
         <template if="{{ field['const'] }}">const</template>
-        <template if="{{ (field['declared_type']['name'] == 'dynamic' &&
+        <template if="{{ (field['declaredType'].name == 'dynamic' &&
                          !field['final'] && !field['const']) }}">
           var
         </template>
-        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
-          {{ field['declared_type']['user_name'] }}
+        <template if="{{ (field['declaredType'].name != 'dynamic') }}">
+          {{ field['declaredType'].name }}
         </template>
-        {{ field['user_name'] }}
+        {{ field.name }}
       </h1>
       <div class="memberList">
         <div class="memberItem">
@@ -61,19 +61,19 @@
                title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
             <div class="memberName">observed types</div>
             <div class="memberValue">
-              <template if="{{ field['guard_class'] == 'dynamic' }}">
+              <template if="{{ field['guardClass'] == 'dynamic' }}">
                 various
               </template>
-              <template if="{{ field['guard_class'] == 'unknown' }}">
+              <template if="{{ field['guardClass'] == 'unknown' }}">
                 none
               </template>
-              <template if="{{ field['guard_class'] != 'unknown' &&
-                            field['guard_class'] != 'dynamic' }}">
-                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-                <template if="{{ field['guard_nullable'] }}">
+              <template if="{{ field['guardClass'] != 'unknown' &&
+                            field['guardClass'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guardClass'] }}"></class-ref>
+                <template if="{{ field['guardNullable'] }}">
                   &mdash; null observed
                 </template>
-                <template if="{{ !field['guard_nullable'] }}">
+                <template if="{{ !field['guardNullable'] }}">
                   &mdash; null not observed
                 </template>
               </template>
@@ -93,4 +93,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="field_view.dart"></script>
\ No newline at end of file
+<script type="application/dart" src="field_view.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.dart b/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.dart
new file mode 100644
index 0000000..cb738b5
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library inbound_reference_element;
+
+import 'dart:async';
+import 'package:polymer/polymer.dart';
+import 'package:observatory/service.dart';
+import 'service_ref.dart';
+
+@CustomTag('inbound-reference')
+class InboundReferenceElement extends ServiceRefElement {
+  InboundReferenceElement.created() : super.created();
+
+  dynamic get slot => ref['slot'];
+  bool get slotIsArrayIndex => slot is num;
+  bool get slotIsField => slot is ServiceMap && slot['type'] == '@Field';
+
+  ServiceObject get source => ref['source'];
+
+  // I.e., inbound references to 'source' for recursive pointer chasing.
+  @observable ObservableList inboundReferences;
+  Future<ServiceObject> fetchInboundReferences(arg) {
+    return source.isolate.get(source.id + "/inbound_references?limit=$arg")
+        .then((ServiceMap response) {
+          inboundReferences = new ObservableList.from(response['references']);
+        });
+  }
+
+  // TODO(turnidge): This is here to workaround vm/dart2js differences.
+  dynamic expander() {
+    return expandEvent;
+  }
+ 
+  void expandEvent(bool expand, var done) {
+    assert(ref is ServiceMap);
+    if (expand) {
+      fetchInboundReferences(100).then((result) {
+        notifyPropertyChange(#ref, 0, 1);
+      }).whenComplete(done);
+    } else {
+      ServiceMap refMap = ref;
+      refMap['fields'] = null;
+      refMap['elements'] = null;
+      done();
+    }
+  }
+}
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.html b/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.html
new file mode 100644
index 0000000..c613469
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/inbound_reference.html
@@ -0,0 +1,29 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
+<polymer-element name="inbound-reference" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <div>
+      from <any-service-ref ref="{{ source }}"></any-service-ref>
+      <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
+      <template if="{{ slotIsField }}">via <field-ref ref="{{ slot }}"></template>
+
+      <curly-block callback="{{ expander() }}">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">
+              <template repeat="{{ reference in inboundReferences] }}">
+                <inbound-reference ref="{{ reference }}"></inbound-reference>
+              </template>
+            </div>
+          </div>
+        </div>
+      </curly-block>
+    </div>
+  </template>
+</polymer-element>
+
+<script type="application/dart" src="inbound_reference.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/instance_ref.html
index efb7040..be0893c 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/instance_ref.html
@@ -18,30 +18,31 @@
       }
     </style>
     <span>
-      <template if="{{ isError(ref.serviceType) }}">
-        <pre class="errorBox">{{ ref.message }}</pre>
+      <template if="{{ isError(ref) }}">
+         <pre class="errorBox">{{ ref.message }}</pre>
       </template>
 
-      <template if="{{ isUnexpected(ref.serviceType) }}">
+      <template if="{{ isUnexpected(ref) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
 
-      <template if="{{ isNull(ref.serviceType) }}">
+      <template if="{{ isPsuedoNull(ref) }}">
         <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
-      <template if="{{ (isString(ref.serviceType) ||
-                        isBool(ref.serviceType) ||
-                        isInt(ref.serviceType)) ||
-                        isDouble(ref.serviceType)) }}">
+      <template if="{{ (isString(ref) ||
+                        isBool(ref) ||
+                        isNull(ref) ||
+                        isInt(ref)) ||
+                        isDouble(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ (isType(ref.serviceType)) }}">
+      <template if="{{ (isType(ref)) }}">
         <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &&
+      <template if="{{ isInstance(ref) &&
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
@@ -49,7 +50,7 @@
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) &&
+      <template if="{{ isInstance(ref) &&
                        ref['closureFunc'] == null}}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
@@ -68,7 +69,7 @@
         </curly-block>
       </template>
 
-      <template if="{{ isList(ref.serviceType) }}">
+      <template if="{{ isList(ref) }}">
         <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -87,4 +88,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="instance_ref.dart"></script>
\ No newline at end of file
+<script type="application/dart" src="instance_ref.dart"></script>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.dart
index ac9caef..e705a3f 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.dart
@@ -13,6 +13,7 @@
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
   @published ServiceMap path;
+  @published ServiceMap inboundReferences;
   @observable int retainedBytes = null;
 
   InstanceViewElement.created() : super.created();
@@ -37,6 +38,13 @@
         });
   }
 
+  Future<ServiceObject> fetchInboundReferences(var arg) {
+    return instance.isolate.get(instance.id + "/inbound_references?limit=$arg")
+        .then((ServiceObject obj) {
+           inboundReferences = obj;
+        });
+  }
+
   void refresh(var done) {
     instance.reload().whenComplete(done);
   }
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
index c85d64f..1d7166c 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/instance_view.html
@@ -5,6 +5,7 @@
 <link rel="import" href="eval_link.html">
 <link rel="import" href="field_ref.html">
 <link rel="import" href="function_ref.html">
+<link rel="import" href="inbound_reference.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
@@ -80,12 +81,12 @@
                 <div class="memberItem">
                   <div class="memberName">[{{ element['index']}}]</div>
                   <div class="memberValue">
-                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                    <any-service-ref ref="{{ element['value'] }}"></any-service-ref>
                     <template if="{{ element['parentField'] != null }}">
-                      in <field-ref ref="{{ element['parentField'] }}"></field-ref>
+                      in <field-ref ref="{{ element['parentField'] }}"></field-ref> of
                     </template>
                     <template if="{{ element['parentListIndex'] != null }}">
-                      at list index {{ element['parentListIndex'] }} of
+                      in [{{ element['parentListIndex'] }}] of
                     </template>
                   </div>
                   </div>
@@ -101,6 +102,22 @@
               </template>
             </div>
           </div>
+          <div class="memberItem">
+            <div class="memberName">inbound references</div>
+            <div class="memberValue">
+              <template if="{{ inboundReferences == null }}">
+                <eval-link callback="{{ fetchInboundReferences }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ inboundReferences != null }}">
+                <template repeat="{{ reference in inboundReferences['references'] }}">
+                  <inbound-reference ref="{{ reference }}"></inbound-reference>
+                </template>
+              </template>
+            </div>
+          </div>
           <template if="{{ instance['type_class'] != null }}">
             <div class="memberItem">
               <div class="memberName">type class</div>
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
index 74feff7..71e768a 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/observatory_element.dart
@@ -112,57 +112,62 @@
 
   int parseInt(String value) => int.parse(value);
 
-  bool isNull(String type) {
-    return type == 'Null';
+  bool isNull(ref) {
+    return ref != null && ref.serviceType == 'Null' && ref.id == 'objects/null';
   }
 
-  bool isError(String type) {
-    return type == 'Error';
+  bool isPsuedoNull(ref) {
+    return ref != null && ref.serviceType == 'Null' && ref.id != 'objects/null';
   }
 
-  bool isInt(String type) {
-    return (type == 'Smi' ||
-            type == 'Mint' ||
-            type == 'Bigint');
+  bool isError(ref) {
+    return ref != null && ref.serviceType == 'Error';
   }
 
-  bool isBool(String type) {
-    return type == 'Bool';
+  bool isInt(ref) {
+    return ref != null && (ref.serviceType == 'Smi' ||
+                           ref.serviceType == 'Mint' ||
+                           ref.serviceType == 'Bigint');
   }
 
-  bool isString(String type) {
-    return type == 'String';
+  bool isBool(ref) {
+    return ref != null && ref.serviceType == 'Bool';
   }
 
-  bool isInstance(String type) {
-    return type == 'Instance';
+  bool isString(ref) {
+    return ref != null && ref.serviceType == 'String';
   }
 
-  bool isDouble(String type) {
-    return type == 'Double';
+  bool isInstance(ref) {
+    return ref != null && ref.serviceType == 'Instance';
   }
 
-  bool isList(String type) {
-    return (type == 'GrowableObjectArray' ||
-            type == 'Array');
+  bool isDouble(ref) {
+    return ref != null && ref.serviceType == 'Double';
   }
 
-  bool isType(String type) {
-    return (type == 'Type');
+  bool isList(ref) {
+    return ref != null && (ref.serviceType == 'GrowableObjectArray' ||
+            ref.serviceType == 'Array');
   }
 
-  bool isUnexpected(String type) {
+  bool isType(ref) {
+    return ref != null && (ref.serviceType == 'Type');
+  }
+
+  bool isUnexpected(ref) {
+    if (ref == null) return false;
     return (!['Null',
               'Smi',
               'Mint',
               'Bigint',
               'Bool',
               'String',
-	      'Double',
+              'Double',
               'Instance',
               'GrowableObjectArray',
               'Array',
               'Type',
-              'Error'].contains(type));
+              'Error'].contains(ref.serviceType));
   }
 }
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
index 5b6b1a1..466799d 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.dart
@@ -4,6 +4,8 @@
 
 library service_ref_element;
 
+import 'dart:html';
+import 'package:logging/logging.dart';
 import 'package:polymer/polymer.dart';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
@@ -54,3 +56,72 @@
     return name.isEmpty;
   }
 }
+
+
+@CustomTag('any-service-ref')
+class AnyServiceRefElement extends ObservatoryElement {
+  @published ServiceObject ref;
+  AnyServiceRefElement.created() : super.created();
+
+  Element _constructElementForRef() {
+    var type = ref.serviceType;
+    switch (type) {
+      case 'Class':
+        ServiceRefElement element = new Element.tag('class-ref');
+        element.ref = ref;
+        return element;
+      case 'Code':
+        ServiceRefElement element = new Element.tag('code-ref');
+        element.ref = ref;
+        return element;
+      case 'Field':
+        ServiceRefElement element = new Element.tag('field-ref');
+        element.ref = ref;
+        return element;
+      case 'Function':
+        ServiceRefElement element = new Element.tag('function-ref');
+        element.ref = ref;
+        return element;
+      case 'Library':
+        ServiceRefElement element = new Element.tag('library-ref');
+        element.ref = ref;
+        return element;
+      case 'Array':
+      case 'Bigint':
+      case 'Bool':
+      case 'Closure':
+      case 'Double':
+      case 'GrowableObjectArray':
+      case 'Instance':
+      case 'Mint':
+      case 'Null':
+      case 'Smi':
+      case 'String':
+      case 'Type':
+        ServiceRefElement element = new Element.tag('instance-ref');
+        element.ref = ref;
+        return element;
+      default:
+        SpanElement element = new Element.tag('span');
+        element.text = "<<Unknown service ref: $ref>>";
+        return element;
+    }
+  }
+
+  refChanged(oldValue) {
+    // Remove the current view.
+    children.clear();
+    if (ref == null) {
+      Logger.root.info('Viewing null object.');
+      return;
+    }
+    var type = ref.serviceType;
+    var element = _constructElementForRef();
+    if (element == null) {
+      Logger.root.info('Unable to find a ref element for \'${type}\'');
+      return;
+    }
+    children.add(element);
+    Logger.root.info('Viewing object of \'${type}\'');
+  }
+}
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
index d8e04c9..3b4b930 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_ref.html
@@ -4,4 +4,7 @@
 <polymer-element name="service-ref" extends="observatory-element">
 </polymer-element>
 
+<polymer-element name="any-service-ref" extends="observatory-element">
+</polymer-element>
+
 <script type="application/dart" src="service_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart b/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
index 50f0636..9689f49 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/service_view.dart
@@ -88,6 +88,7 @@
       case 'Instance':
       case 'Smi':
       case 'Mint':
+      case 'Null':
       case 'Bigint':
       case 'String':
         InstanceViewElement element = new Element.tag('instance-view');
diff --git a/runtime/bin/vmservice/observatory/lib/src/service/object.dart b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
index 32055de..d1bad5f 100644
--- a/runtime/bin/vmservice/observatory/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
@@ -253,10 +253,14 @@
   final StreamController<ServiceEvent> events =
       new StreamController.broadcast();
 
-  void postEventMessage(String eventMessage) {
+  void postEventMessage(String eventMessage, [dynamic data]) {
       var map;
       try {
         map = _parseJSON(eventMessage);
+        assert(!map.containsKey('_data'));
+        if (data != null) {
+          map['_data'] = data;
+        }
       } catch (e, st) {
         Logger.root.severe('Ignoring malformed event message: ${eventMessage}');
         return;
@@ -679,7 +683,7 @@
     rootClasses.clear();
     objectClass = null;
     for (var cls in classes) {
-      if (cls.superClass == null) {
+      if (cls.superclass == null) {
         rootClasses.add(cls);
       }
       if ((cls.vmName == 'Object') && (cls.isPatch == false)) {
@@ -1038,6 +1042,8 @@
         return isolate.reload();
       });
   }
+
+  String toString() => "Isolate($_id)";
 }
 
 /// A [ServiceObject] which implements [ObservableMap].
@@ -1055,8 +1061,6 @@
 
   ServiceMap._empty(ServiceObjectOwner owner) : super._empty(owner);
 
-  String toString() => _map.toString();
-
   void _upgradeValues() {
     assert(owner != null);
     _upgradeCollection(_map, owner);
@@ -1071,8 +1075,8 @@
     _map.clear();
     _map.addAll(map);
 
-    name = _map['user_name'];
-    vmName = _map['name'];
+    name = _map['name'];
+    vmName = (_map.containsKey('vmName') ? _map['vmName'] : name);
     _upgradeValues();
   }
 
@@ -1101,6 +1105,8 @@
   void unobserved() => _map.unobserved();
   Stream<List<ChangeRecord>> get changes => _map.changes;
   bool get hasObservers => _map.hasObservers;
+
+  String toString() => "ServiceMap($_map)";
 }
 
 /// A [DartError] is peered to a Dart Error object.
@@ -1120,6 +1126,8 @@
     name = 'DartError $kind';
     vmName = name;
   }
+
+  String toString() => 'DartError($message)';
 }
 
 /// A [ServiceError] is an error that was triggered in the service
@@ -1139,6 +1147,8 @@
     name = 'ServiceError $kind';
     vmName = name;
   }
+
+  String toString() => 'ServiceError($message)';
 }
 
 /// A [ServiceException] is an exception that was triggered in the service
@@ -1167,6 +1177,7 @@
   @observable String eventType;
   @observable ServiceMap breakpoint;
   @observable ServiceMap exception;
+  @observable ByteData data;
 
   void _update(ObservableMap map, bool mapIsRef) {
     _loaded = true;
@@ -1180,6 +1191,14 @@
     if (map['exception'] != null) {
       exception = map['exception'];
     }
+    if (map['_data'] != null) {
+      data = map['_data'];
+    }
+  }
+
+  String toString() {
+    return 'ServiceEvent of type $eventType with '
+        '${data == null ? 0 : data.lengthInBytes} bytes of binary data';
   }
 }
 
@@ -1203,11 +1222,12 @@
         url.startsWith('http://')) {
       shortUrl = url.substring(url.lastIndexOf('/') + 1);
     }
-    name = map['user_name'];
+    name = map['name'];
     if (name.isEmpty) {
+      // When there is no name for a library, use the shortUrl.
       name = shortUrl;
     }
-    vmName = map['name'];
+    vmName = (map.containsKey('vmName') ? map['vmName'] : name);
     if (mapIsRef) {
       return;
     }
@@ -1227,6 +1247,8 @@
     functions.addAll(map['functions']);
     functions.sort(ServiceObject.LexicalSortName);
   }
+
+  String toString() => "Library($url)";
 }
 
 class AllocationCount extends Observable {
@@ -1268,7 +1290,6 @@
 class Class extends ServiceObject with Coverage {
   @observable Library library;
   @observable Script script;
-  @observable Class superClass;
 
   @observable bool isAbstract;
   @observable bool isConst;
@@ -1283,27 +1304,25 @@
 
   final Allocations newSpace = new Allocations();
   final Allocations oldSpace = new Allocations();
+  final AllocationCount promotedByLastNewGC = new AllocationCount();
 
   bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
 
-  @reflectable final children = new ObservableList<Class>();
-  @reflectable final subClasses = new ObservableList<Class>();
   @reflectable final fields = new ObservableList<ServiceMap>();
   @reflectable final functions = new ObservableList<ServiceFunction>();
+
+  @observable Class superclass;
   @reflectable final interfaces = new ObservableList<Class>();
+  @reflectable final subclasses = new ObservableList<Class>();
 
   bool get canCache => true;
   bool get immutable => false;
 
   Class._empty(ServiceObjectOwner owner) : super._empty(owner);
 
-  String toString() {
-    return 'Service Class: $vmName';
-  }
-
   void _update(ObservableMap map, bool mapIsRef) {
-    name = map['user_name'];
-    vmName = map['name'];
+    name = map['name'];
+    vmName = (map.containsKey('vmName') ? map['vmName'] : name);
 
     if (mapIsRef) {
       return;
@@ -1333,9 +1352,9 @@
     tokenPos = map['tokenPos'];
     endTokenPos = map['endTokenPos'];
 
-    subClasses.clear();
-    subClasses.addAll(map['subclasses']);
-    subClasses.sort(ServiceObject.LexicalSortName);
+    subclasses.clear();
+    subclasses.addAll(map['subclasses']);
+    subclasses.sort(ServiceObject.LexicalSortName);
 
     fields.clear();
     fields.addAll(map['fields']);
@@ -1345,9 +1364,10 @@
     functions.addAll(map['functions']);
     functions.sort(ServiceObject.LexicalSortName);
 
-    superClass = map['super'];
-    if (superClass != null) {
-      superClass._addToChildren(this);
+    superclass = map['super'];
+    // Work-around Object not tracking its subclasses in the VM.
+    if (superclass != null && superclass.name == "Object") {
+      superclass._addSubclass(this);
     }
     error = map['error'];
 
@@ -1355,21 +1375,27 @@
     if (allocationStats != null) {
       newSpace.update(allocationStats['new']);
       oldSpace.update(allocationStats['old']);
+      promotedByLastNewGC.instances = allocationStats['promotedInstances'];
+      promotedByLastNewGC.bytes = allocationStats['promotedBytes'];
     }
   }
 
-  void _addToChildren(Class cls) {
-    if (children.contains(cls)) {
+  void _addSubclass(Class subclass) {
+    if (subclasses.contains(subclass)) {
       return;
     }
-    children.add(cls);
+    subclasses.add(subclass);
+    subclasses.sort(ServiceObject.LexicalSortName);
   }
 
   Future<ServiceObject> get(String command) {
     return isolate.get(id + "/$command");
   }
+
+  String toString() => 'Class($vmName)';
 }
 
+// TODO(koda): Sync this with VM.
 class FunctionKind {
   final String _strValue;
   FunctionKind._internal(this._strValue);
@@ -1383,8 +1409,8 @@
       case 'kGetterFunction': return kGetterFunction;
       case 'kSetterFunction': return kSetterFunction;
       case 'kConstructor': return kConstructor;
-      case 'kImplicitGetterFunction': return kImplicitGetterFunction;
-      case 'kImplicitSetterFunction': return kImplicitSetterFunction;
+      case 'kImplicitGetter': return kImplicitGetterFunction;
+      case 'kImplicitSetter': return kImplicitSetterFunction;
       case 'kStaticInitializer': return kStaticInitializer;
       case 'kMethodExtractor': return kMethodExtractor;
       case 'kNoSuchMethodDispatcher': return kNoSuchMethodDispatcher;
@@ -1437,8 +1463,8 @@
   ServiceFunction._empty(ServiceObject owner) : super._empty(owner);
 
   void _update(ObservableMap map, bool mapIsRef) {
-    name = map['user_name'];
-    vmName = map['name'];
+    name = map['name'];
+    vmName = (map.containsKey('vmName') ? map['vmName'] : name);
 
     _upgradeCollection(map, isolate);
 
@@ -1449,18 +1475,18 @@
 
     if (mapIsRef) { return; }
 
-    isStatic = map['isStatic'];
-    isConst = map['isConst'];
+    isStatic = map['static'];
+    isConst = map['const'];
     parent = map['parent'];
     script = map['script'];
     tokenPos = map['tokenPos'];
     endTokenPos = map['endTokenPos'];
     code = _convertNull(map['code']);
-    unoptimizedCode = _convertNull(map['unoptimized_code']);
-    isOptimizable = map['is_optimizable'];
-    isInlinable = map['is_inlinable'];
+    unoptimizedCode = _convertNull(map['unoptimizedCode']);
+    isOptimizable = map['optimizable'];
+    isInlinable = map['inlinable'];
     deoptimizations = map['deoptimizations'];
-    usageCounter = map['usage_counter'];
+    usageCounter = map['usageCounter'];
 
     if (parent == null) {
       qualifiedName = (owningClass != null) ?
@@ -1568,7 +1594,7 @@
     }
     _processSource(map['source']);
     _parseTokenPosTable(map['tokenPosTable']);
-    owningLibrary = map['owning_library'];
+    owningLibrary = map['owningLibrary'];
   }
 
   void _parseTokenPosTable(List<List<int>> table) {
@@ -1974,14 +2000,14 @@
   }
 
   void _update(ObservableMap m, bool mapIsRef) {
-    name = m['user_name'];
-    vmName = m['name'];
-    isOptimized = m['isOptimized'] != null ? m['isOptimized'] : false;
+    name = m['name'];
+    vmName = (m.containsKey('vmName') ? m['vmName'] : name);
+    isOptimized = m['optimized'] != null ? m['optimized'] : false;
     kind = CodeKind.fromString(m['kind']);
     startAddress = int.parse(m['start'], radix:16);
     endAddress = int.parse(m['end'], radix:16);
     function = isolate.getFromMap(m['function']);
-    objectPool = isolate.getFromMap(m['object_pool']);
+    objectPool = isolate.getFromMap(m['objectPool']);
     var disassembly = m['disassembly'];
     if (disassembly != null) {
       _processDisassembly(disassembly);
diff --git a/runtime/bin/vmservice/observatory/test/echo_test.dart b/runtime/bin/vmservice/observatory/test/echo_test.dart
new file mode 100644
index 0000000..87088ed
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/echo_test.dart
@@ -0,0 +1,44 @@
+// 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:async';
+import 'dart:typed_data';
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+var tests = [
+
+(Isolate isolate) =>
+  isolate.vm.get('_echo').then((result) {
+    expect(result['type'], equals("message"));
+    expect(result['id'], equals("_echo"));
+    expect(result.owner, equals(isolate.vm));
+}),
+
+(Isolate isolate) =>
+  isolate.get('_echo').then((result) {
+    expect(result['type'], equals("message"));
+    expect(result['id'], equals("_echo"));
+    expect(result.owner, equals(isolate));
+}),
+
+(Isolate isolate) {
+  Completer completer = new Completer();
+  isolate.vm.events.stream.listen((ServiceEvent event) {
+    if (event.eventType == '_Echo') {
+      expect(event.data.lengthInBytes, equals(3));
+      expect(event.data.getUint8(0), equals(0));
+      expect(event.data.getUint8(1), equals(128));
+      expect(event.data.getUint8(2), equals(255));
+      completer.complete();
+    }
+  });
+  isolate.get('_echo/event');
+  return completer.future;
+},
+
+];
+
+main(args) => runIsolateTests(args, tests);
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/test/functions_test.dart b/runtime/bin/vmservice/observatory/test/functions_test.dart
new file mode 100644
index 0000000..678ee94
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/functions_test.dart
@@ -0,0 +1,35 @@
+// 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 functions_test;
+
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+class Foo {
+  int a;
+}
+
+void script() {
+  new Foo().a = 42;
+}
+
+var tests = [
+
+(Isolate isolate) =>
+  isolate.rootLib.load().then((Library lib) {
+    expect(lib.classes.length, equals(1));
+    return lib.classes.first.load().then((Class fooClass) {
+      expect(fooClass.name, equals('Foo'));
+      return fooClass.get('functions/get%3Aa').then((ServiceFunction func) {
+        expect(func.name, equals('a'));
+        expect(func.kind, equals(FunctionKind.kImplicitGetterFunction));
+      });
+    });
+}),
+
+];
+
+main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/bin/vmservice/observatory/test/gc_test.dart b/runtime/bin/vmservice/observatory/test/gc_test.dart
index dd270a0..7f2c441 100644
--- a/runtime/bin/vmservice/observatory/test/gc_test.dart
+++ b/runtime/bin/vmservice/observatory/test/gc_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.
+
 import 'package:observatory/service_io.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/bin/vmservice/observatory/test/inbound_references_test.dart b/runtime/bin/vmservice/observatory/test/inbound_references_test.dart
new file mode 100644
index 0000000..1d1f460
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/inbound_references_test.dart
@@ -0,0 +1,58 @@
+// 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 inbound_references_test;
+
+import 'dart:async' show Future;
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+class Node {
+  var edge;
+}
+
+class Edge { }
+
+var n, e, array;
+
+void script() {
+  n = new Node();
+  e = new Edge();
+  n.edge = e;
+  array = new List(2);
+  array[0] = n;
+  array[1] = e;
+}
+
+var tests = [
+
+(Isolate isolate) =>
+  isolate.rootLib.load().then((Library lib) {
+    ServiceMap e = lib.variables.where((v) => v.name == 'e').single['value'];
+    var id = e['id'];
+    return isolate.get('/$id/inbound_references?limit=100').then(
+        (ServiceMap response) {
+          List references = response['references'];
+          hasReferenceSuchThat(predicate) {
+            expect(references.any(predicate), isTrue);
+          }
+
+          // Assert e is referenced by at least n, array, and the top-level
+          // field e.
+          hasReferenceSuchThat((r) => r['slot'] is Map &&
+                                      r['slot']['type']=='@Field' &&
+                                      r['slot']['name']=='edge' &&
+                                      r['source']['type']=='@Instance' &&
+                                      r['source']['class'].name=='Node');
+          hasReferenceSuchThat((r) => r['slot']==1 &&
+                                      r['source']['type']=='@Array');
+          hasReferenceSuchThat((r) => r['slot']=='<unknown>' &&
+                                      r['source']['type']=='@Field');
+    });
+}),
+
+];
+
+main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/bin/vmservice/observatory/test/metrics_test.dart b/runtime/bin/vmservice/observatory/test/metrics_test.dart
index 170835f..92a5d47 100644
--- a/runtime/bin/vmservice/observatory/test/metrics_test.dart
+++ b/runtime/bin/vmservice/observatory/test/metrics_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.
+
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
diff --git a/runtime/bin/vmservice/observatory/test/vm_metrics_test.dart b/runtime/bin/vmservice/observatory/test/vm_metrics_test.dart
new file mode 100644
index 0000000..349f212
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/vm_metrics_test.dart
@@ -0,0 +1,39 @@
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+import 'dart:profiler';
+
+void script() {
+  var counter = new Counter('a.b.c', 'description');
+  Metrics.register(counter);
+  counter.value = 1234.5;
+}
+
+var tests = [
+
+(Isolate isolate) =>
+  isolate.get('metrics/vm').then((ServiceMap metrics) {
+    expect(metrics['type'], equals('MetricList'));
+    var members = metrics['members'];
+    expect(members, isList);
+    expect(members.length, greaterThan(1));
+    var foundOldHeapCapacity = members.any((m) =>
+        m['name'] == 'heap.old.capacity');
+    expect(foundOldHeapCapacity, equals(true));
+}),
+
+(Isolate isolate) =>
+  isolate.get('metrics/vm/heap.old.used').then((ServiceMap counter) {
+    expect(counter['type'], equals('Counter'));
+    expect(counter['name'], equals('heap.old.used'));
+}),
+
+(Isolate isolate) =>
+  isolate.get('metrics/vm/doesnotexist').then((DartError err) {
+    expect(err is DartError, isTrue);
+}),
+
+];
+
+main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 9c678e6..c21f242 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -37,15 +37,19 @@
     }
   }
 
-  void post(var seq, String response) {
+  void post(var seq, dynamic response) {
     try {
       Map map = {
         'seq': seq,
         'response': response
       };
-      socket.add(JSON.encode(map));
+      if (seq == null && response is! String) {
+        socket.add(response);
+      } else {
+        socket.add(JSON.encode(map));
+      }
     } catch (_) {
-      // Error posting over WebSocket.
+      print("Ignoring error posting over WebSocket.");
     }
   }
 
diff --git a/runtime/bin/vmservice/vmservice.status b/runtime/bin/vmservice/vmservice.status
index 8beb5c0..441a22c 100644
--- a/runtime/bin/vmservice/vmservice.status
+++ b/runtime/bin/vmservice/vmservice.status
@@ -3,7 +3,9 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2dart ]
-observatory/test/allocations_test: Fail # Issue 20487
+# The transformations of dart2dart are not guaranteed to preserve the
+# state/properties of the VM that the Observatory tests are inspecting.
+observatory/test/*: Skip
 
 [ $browser ]
 observatory/test/*: Skip # Uses dart:io
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 096e373..4debf74 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, static_cast<uword>(NULL));
+  Thread::Start(ThreadMain, static_cast<uword>(NULL));
   return true;
 }
 
diff --git a/runtime/lib/array.cc b/runtime/lib/array.cc
index 81c41a9..7d9e076 100644
--- a/runtime/lib/array.cc
+++ b/runtime/lib/array.cc
@@ -13,26 +13,9 @@
 namespace dart {
 
 DEFINE_NATIVE_ENTRY(List_allocate, 2) {
-  const TypeArguments& type_arguments =
-      TypeArguments::CheckedHandle(isolate, arguments->NativeArgAt(0));
-  const Instance& length = Instance::CheckedHandle(
-      isolate, arguments->NativeArgAt(1));
-  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);
-  }
-  intptr_t len = Smi::Cast(length).Value();
-  if (len < 0 || len > Array::kMaxElements) {
-    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& new_array = Array::Handle(Array::New(len));
-  new_array.SetTypeArguments(type_arguments);
-  return new_array.raw();
+  // Implemented in FlowGraphBuilder::VisitNativeBody.
+  UNREACHABLE();
+  return Object::null();
 }
 
 
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 78d30f7..a24e404 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -102,11 +102,12 @@
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
     int length = end - start;
-    if (start == end) return [];
-    List list = new _GrowableList<E>.withCapacity(length);
-    list.length = length;
-    Lists.copy(this, start, list, 0, length);
-    return list;
+    if (start == end) return <E>[];
+    List list = new _List(length);
+    list._copyFromObjectArray(this, start, 0, length);
+    var result = new _GrowableList<E>.withData(list);
+    result._setLength(length);
+    return result;
   }
 
   // Iterable interface.
@@ -249,8 +250,19 @@
     throw IterableElementError.tooMany();
   }
 
-  List<E> toList({ bool growable: true}) {
-    return new List<E>.from(this, growable: growable);
+  List<E> toList({ bool growable: true }) {
+    var length = this.length;
+    if (length > 0) {
+      var result = growable ? new _List(length) : new _List<E>(length);
+      result._copyFromObjectArray(this, 0, 0, length);
+      if (growable) {
+        result = new _GrowableList<E>.withData(result);
+        result._setLength(length);
+      }
+      return result;
+    }
+    // _GrowableList.withData must not be called with empty list.
+    return growable ? <E>[] : new List<E>(0);
   }
 
   Set<E> toSet() {
@@ -340,11 +352,14 @@
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
     int length = end - start;
-    if (start == end) return [];
-    List list = new List<E>();
-    list.length = length;
-    Lists.copy(this, start, list, 0, length);
-    return list;
+    if (length == 0) return <E>[];
+    List list = new _List(length);
+    for (int i = 0; i < length; i++) {
+      list[i] = this[start + i];
+    }
+    var result = new _GrowableList<E>.withData(list);
+    result._setLength(length);
+    return result;
   }
 
   Iterable<E> getRange(int start, int end) {
@@ -496,7 +511,18 @@
   }
 
   List<E> toList({ bool growable: true }) {
-    return new List<E>.from(this, growable: growable);
+    var length = this.length;
+    if (length > 0) {
+      List list = growable ? new _List(length) : new _List<E>(length);
+      for (int i = 0; i < length; i++) {
+        list[i] = this[i];
+      }
+      if (!growable) return list;
+      var result = new _GrowableList<E>.withData(list);
+      result._setLength(length);
+      return result;
+    }
+    return growable ? <E>[] : new _List<E>(0);
   }
 
   Set<E> toSet() {
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index cb9ca76..424a651 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -32,6 +32,22 @@
     return result;
   }
 
+  /* patch */ factory List.from(Iterable other, { bool growable: true }) {
+    if (other is EfficientLength) {
+      int length = other.length;
+      var list = growable ? new _GrowableList<E>(length) : new _List<E>(length);
+      int i = 0;
+      for (var element in other) { list[i++] = element; }
+      return list;
+    }
+    List<E> list = new _GrowableList<E>(0);
+    for (E e in other) {
+      list.add(e);
+    }
+    if (growable) return list;
+    return makeListFixedLength(list);
+  }
+
   // Factory constructing a mutable List from a parser generated List literal.
   // [elements] contains elements that are already type checked.
   factory List._fromLiteral(List elements) {
diff --git a/runtime/lib/class_id.dart b/runtime/lib/class_id.dart
index 7ae813d..045cfa1 100644
--- a/runtime/lib/class_id.dart
+++ b/runtime/lib/class_id.dart
@@ -4,4 +4,4 @@
 
 class ClassID {
   static int getID(Object value) native "ClassID_getID";
-}
\ No newline at end of file
+}
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index 8bd7e40..2a4ab1b 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:typed_data";
-
 // JSON conversion.
 
 patch _parseJson(String json, reviver(var key, var value)) {
@@ -575,9 +573,3 @@
     throw new FormatException(message, source, position);
   }
 }
-
-// UTF-8 conversion.
-
-patch class _Utf8Encoder {
-  /* patch */ static List<int> _createBuffer(int size) => new Uint8List(size);
-}
diff --git a/runtime/lib/corelib_sources.gypi b/runtime/lib/corelib_sources.gypi
index f5f68cf..cc2af74 100644
--- a/runtime/lib/corelib_sources.gypi
+++ b/runtime/lib/corelib_sources.gypi
@@ -37,6 +37,8 @@
     'lib_prefix.dart',
     'map_patch.dart',
     'null_patch.dart',
+    'num.cc',
+    'num.dart',
     'object.cc',
     'object_patch.dart',
     'regexp.cc',
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 8efe789..aa69bba 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.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.
 
-class _Double implements double {
+class _Double extends _Num implements double {
   factory _Double.fromInteger(int value)
       native "Double_doubleFromInteger";
 
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 1a7b882..ade7ec1 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -102,11 +102,14 @@
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
     int length = end - start;
-    if (start == end) return <T>[];
-    List list = new _GrowableList<T>.withCapacity(length);
-    list.length = length;
-    Lists.copy(this, start, list, 0, length);
-    return list;
+    if (length == 0) return <T>[];
+    List list = new _List(length);
+    for (int i = 0; i < length; i++) {
+      list[i] = this[start + i];
+    }
+    var result = new _GrowableList<T>.withData(list);
+    result._setLength(length);
+    return result;
   }
 
   static const int _kDefaultCapacity = 2;
@@ -171,9 +174,32 @@
   }
 
   void addAll(Iterable<T> iterable) {
-    for (T elem in iterable) {
-      add(elem);
+    var len = length;
+    if (iterable is EfficientLength) {
+      var cap = _capacity;
+      // Pregrow if we know iterable.length.
+      var iterLen = iterable.length;
+      var newLen = len + iterLen;
+      if (newLen > cap) {
+        do {
+          cap *= 2;
+        } while (newLen > cap);
+        _grow(cap);
+      }
     }
+    Iterator it = iterable.iterator;
+    if (!it.moveNext()) return;
+    do {
+      while (len < _capacity) {
+        int newLen = len + 1;
+        this._setLength(newLen);
+        this[len] = it.current;
+        if (!it.moveNext()) return;
+        if (this.length != newLen) throw new ConcurrentModificationError(this);
+        len = newLen;
+      }
+      _grow(_capacity * 2);
+    } while (true);
   }
 
   T removeLast() {
@@ -336,7 +362,18 @@
   }
 
   List<T> toList({ bool growable: true }) {
-    return new List<T>.from(this, growable: growable);
+    var length = this.length;
+    if (length > 0) {
+      List list = growable ? new _List(length) : new _List<T>(length);
+      for (int i = 0; i < length; i++) {
+        list[i] = this[i];
+      }
+      if (!growable) return list;
+      var result = new _GrowableList<T>.withData(list);
+      result._setLength(length);
+      return result;
+    }
+    return growable ? <T>[] : new List<T>(0);
   }
 
   Set<T> toSet() {
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 0252960..162faeb 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -4,7 +4,7 @@
 
 // TODO(srdjan): fix limitations.
 // - shift amount must be a Smi.
-class _IntegerImplementation {
+class _IntegerImplementation extends _Num {
   factory _IntegerImplementation._uninstantiable() {
     throw new UnsupportedError(
         "_IntegerImplementation can only be allocated by the VM");
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index e36fbf0..f85726d 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -38,7 +38,7 @@
   ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
   Dart_Port port_id =
       PortMap::CreatePort(arguments->isolate()->message_handler());
-  return ReceivePort::New(port_id);
+  return ReceivePort::New(port_id, false /* not control port */);
 }
 
 
@@ -139,9 +139,9 @@
 }
 
 
-static bool CreateIsolate(IsolateSpawnState* state, char** error) {
-  Isolate* parent_isolate = Isolate::Current();
-
+static bool CreateIsolate(Isolate* parent_isolate,
+                          IsolateSpawnState* state,
+                          char** error) {
   Dart_IsolateCreateCallback callback = Isolate::CreateCallback();
   if (callback == NULL) {
     *error = strdup("Null callback specified for isolate creation\n");
@@ -166,30 +166,21 @@
 }
 
 
-static RawObject* Spawn(NativeArguments* arguments, IsolateSpawnState* state) {
+static RawObject* Spawn(Isolate* parent_isolate,
+                        IsolateSpawnState* state) {
   // Create a new isolate.
   char* error = NULL;
-  if (!CreateIsolate(state, &error)) {
+  if (!CreateIsolate(parent_isolate, state, &error)) {
     delete state;
     const String& msg = String::Handle(String::New(error));
     free(error);
     ThrowIsolateSpawnException(msg);
   }
 
-  // The result of spawning an Isolate is an array with 3 elements:
-  // [main_port, pause_capability, terminate_capability]
-  const Array& result = Array::Handle(Array::New(3));
-
   // Create a SendPort for the new isolate.
   Isolate* spawned_isolate = state->isolate();
   const SendPort& port = SendPort::Handle(
       SendPort::New(spawned_isolate->main_port()));
-  result.SetAt(0, port);
-  Capability& capability = Capability::Handle();
-  capability = Capability::New(spawned_isolate->pause_capability());
-  result.SetAt(1, capability);  // pauseCapability
-  capability = Capability::New(spawned_isolate->terminate_capability());
-  result.SetAt(2, capability);  // terminateCapability
 
   // Start the new isolate if it is already marked as runnable.
   MutexLocker ml(spawned_isolate->mutex());
@@ -198,12 +189,14 @@
     spawned_isolate->Run();
   }
 
-  return result.raw();
+  return port.raw();
 }
 
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 3) {
+  GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(2));
   if (closure.IsClosure()) {
     Function& func = Function::Handle();
     func = Closure::function(closure);
@@ -213,7 +206,7 @@
       ctx = Closure::context(closure);
       ASSERT(ctx.num_variables() == 0);
 #endif
-      return Spawn(arguments, new IsolateSpawnState(func));
+      return Spawn(isolate, new IsolateSpawnState(port.Id(), func, message));
     }
   }
   const String& msg = String::Handle(String::New(
@@ -223,8 +216,11 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 4) {
+  GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, args, arguments->NativeArgAt(2));
+  GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(3));
 
   // Canonicalize the uri with respect to the current isolate.
   char* error = NULL;
@@ -237,7 +233,8 @@
     ThrowIsolateSpawnException(msg);
   }
 
-  return Spawn(arguments, new IsolateSpawnState(canonical_uri));
+  return Spawn(isolate, new IsolateSpawnState(port.Id(), canonical_uri,
+                                              args, message));
 }
 
 
@@ -258,14 +255,4 @@
   return Object::null();
 }
 
-
-DEFINE_NATIVE_ENTRY(Isolate_mainPort, 0) {
-  // The control port is being accessed as a regular port from Dart code. This
-  // is most likely due to the _startIsolate code in dart:isolate. Account for
-  // this by increasing the number of open control ports.
-  isolate->message_handler()->increment_control_ports();
-
-  return ReceivePort::New(isolate->main_port());
-}
-
 }  // namespace dart
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 00b26e0..39826f6 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -77,6 +77,14 @@
   _pendingImmediateCallback = callback;
 }
 
+void _runPendingImmediateCallback() {
+  if (_pendingImmediateCallback != null) {
+    var callback = _pendingImmediateCallback;
+    _pendingImmediateCallback = null;
+    callback();
+  }
+}
+
 /// The embedder can execute this function to get hold of
 /// [_isolateScheduleImmediate] above.
 Function _getIsolateScheduleImmediateClosure() {
@@ -120,11 +128,7 @@
     // VM. Once we have non-fatal global exceptions we need to catch errors
     // so that we can run the immediate callbacks.
     handler(message);
-    if (_pendingImmediateCallback != null) {
-      var callback = _pendingImmediateCallback;
-      _pendingImmediateCallback = null;
-      callback();
-    }
+    _runPendingImmediateCallback();
   }
 
   // Call into the VM to close the VM maintained mappings.
@@ -176,74 +180,95 @@
 typedef _MainFunctionArgsMessage(args, message);
 
 /**
+ * Takes the real entry point as argument and invokes it with the
+ * initial message.  Defers execution of the entry point until the
+ * isolate is in the message loop.
+ */
+void _startMainIsolate(Function entryPoint,
+                       List<String> args) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (_) {
+    port.close();
+    _startIsolate(null,   // no parent port
+                  entryPoint,
+                  args,
+                  null,   // no message
+                  true,   // isSpawnUri
+                  null,   // no control port
+                  null);  // no capabilities
+  };
+  port.sendPort.send(null);
+}
+
+/**
  * Takes the real entry point as argument and invokes it with the initial
  * message.
- *
- * The initial startup message is received through the control port.
  */
-void _startIsolate(Function entryPoint, bool isSpawnUri) {
-  // This port keeps the isolate alive until the initial startup message has
-  // been received.
-  var keepAlivePort = new RawReceivePort();
-
-  ignoreHandler(message) {
-    // Messages on the current Isolate's control port are dropped after the
-    // initial startup message has been received.
+void _startIsolate(SendPort parentPort,
+                   Function entryPoint,
+                   List<String> args,
+                   var message,
+                   bool isSpawnUri,
+                   RawReceivePort controlPort,
+                   List capabilities) {
+  if (controlPort != null) {
+    controlPort.handler = (_) {};  // Nobody home on the control port.
   }
+  if (parentPort != null) {
+    // Build a message to our parent isolate providing access to the
+    // current isolate's control port and capabilities.
+    //
+    // TODO(floitsch): Send an error message if we can't find the entry point.
+    var readyMessage = new List(2);
+    readyMessage[0] = controlPort.sendPort;
+    readyMessage[1] = capabilities;
 
-  isolateStartHandler(message) {
-    // We received the initial startup message. Ignore all further messages and
-    // close the port which kept this isolate alive.
-    Isolate._self.handler = ignoreHandler;
-    keepAlivePort.close();
+    // Out of an excess of paranoia we clear the capabilities from the
+    // stack.  Not really necessary.
+    capabilities = null;
+    parentPort.send(readyMessage);
+  }
+  assert(capabilities == null);
 
-    SendPort replyTo = message[0];
-    if (replyTo != null) {
-      // TODO(floitsch): don't send ok-message if we can't find the entry point.
-      replyTo.send("started");
-    }
-    if (isSpawnUri) {
-      assert(message.length == 3);
-      List<String> args = message[1];
-      var isolateMessage = message[2];
-      if (entryPoint is _MainFunctionArgsMessage) {
-        entryPoint(args, isolateMessage);
-      } else if (entryPoint is _MainFunctionArgs) {
-        entryPoint(args);
-      } else {
-        entryPoint();
-      }
+  if (isSpawnUri) {
+    if (entryPoint is _MainFunctionArgsMessage) {
+      entryPoint(args, message);
+    } else if (entryPoint is _MainFunctionArgs) {
+      entryPoint(args);
     } else {
-      assert(message.length == 2);
-      var entryMessage = message[1];
-      entryPoint(entryMessage);
+      entryPoint();
     }
+  } else {
+    entryPoint(message);
   }
-
-  Isolate._self.handler = isolateStartHandler;
+  _runPendingImmediateCallback();
 }
 
 patch class Isolate {
   /* patch */ static Future<Isolate> spawn(
       void entryPoint(message), var message, { bool paused: false }) {
     // `paused` isn't handled yet.
+    RawReceivePort readyPort;
     try {
       // The VM will invoke [_startIsolate] with entryPoint as argument.
-      List spawnData = _spawnFunction(entryPoint);
-      assert(spawnData.length == 3);
-      SendPort controlPort = spawnData[0];
-      RawReceivePort readyPort = new RawReceivePort();
-      controlPort.send([readyPort.sendPort, message]);
+      readyPort = new RawReceivePort();
+      _spawnFunction(readyPort.sendPort, entryPoint, message);
       Completer completer = new Completer<Isolate>.sync();
       readyPort.handler = (readyMessage) {
-        assert(readyMessage == 'started');
         readyPort.close();
+        assert(readyMessage is List);
+        assert(readyMessage.length == 2);
+        SendPort controlPort = readyMessage[0];
+        List capabilities = readyMessage[1];
         completer.complete(new Isolate(controlPort,
-                                       pauseCapability: spawnData[1],
-                                       terminateCapability: spawnData[2]));
+                                       pauseCapability: capabilities[0],
+                                       terminateCapability: capabilities[1]));
       };
       return completer.future;
     } catch (e, st) {
+      if (readyPort != null) {
+        readyPort.close();
+      }
       return new Future<Isolate>.error(e, st);
     };
   }
@@ -251,41 +276,45 @@
   /* patch */ static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message, { bool paused: false }) {
     // `paused` isn't handled yet.
+    RawReceivePort readyPort;
     try {
       // The VM will invoke [_startIsolate] and not `main`.
-      List spawnData = _spawnUri(uri.toString());
-      assert(spawnData.length == 3);
-      SendPort controlPort = spawnData[0];
-      RawReceivePort readyPort = new RawReceivePort();
-      controlPort.send([readyPort.sendPort, args, message]);
+      readyPort = new RawReceivePort();
+      _spawnUri(readyPort.sendPort, uri.toString(), args, message);
       Completer completer = new Completer<Isolate>.sync();
       readyPort.handler = (readyMessage) {
-        assert(readyMessage == 'started');
         readyPort.close();
+        assert(readyMessage is List);
+        assert(readyMessage.length == 2);
+        SendPort controlPort = readyMessage[0];
+        List capabilities = readyMessage[1];
         completer.complete(new Isolate(controlPort,
-                                       pauseCapability: spawnData[1],
-                                       terminateCapability: spawnData[2]));
+                                       pauseCapability: capabilities[0],
+                                       terminateCapability: capabilities[1]));
       };
       return completer.future;
     } catch (e, st) {
+      if (readyPort != null) {
+        readyPort.close();
+      }
       return new Future<Isolate>.error(e, st);
     };
     return completer.future;
   }
 
-  static final RawReceivePort _self = _mainPort;
-  static RawReceivePort get _mainPort native "Isolate_mainPort";
-
   // TODO(iposva): Cleanup to have only one definition.
   // These values need to be kept in sync with the class IsolateMessageHandler
   // in vm/isolate.cc.
   static const _PAUSE = 1;
   static const _RESUME = 2;
 
-  static List _spawnFunction(Function topLevelFunction)
+  static SendPort _spawnFunction(SendPort readyPort, Function topLevelFunction,
+                                 var message)
       native "Isolate_spawnFunction";
 
-  static List _spawnUri(String uri) native "Isolate_spawnUri";
+  static SendPort _spawnUri(SendPort readyPort, String uri,
+                            List<String> args, var message)
+      native "Isolate_spawnUri";
 
   static void _sendOOB(port, msg) native "Isolate_sendOOB";
 
diff --git a/runtime/lib/num.cc b/runtime/lib/num.cc
new file mode 100644
index 0000000..85d9426
--- /dev/null
+++ b/runtime/lib/num.cc
@@ -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.
+
+#include "vm/bootstrap_natives.h"
+
+#include "vm/native_entry.h"
+#include "vm/object.h"
+
+namespace dart {
+
+DEFINE_NATIVE_ENTRY(Num_toString, 1) {
+  const Number& number = Number::CheckedHandle(arguments->NativeArgAt(0));
+  return number.ToString(Heap::kNew);
+}
+
+}  // namespace dart
diff --git a/runtime/lib/num.dart b/runtime/lib/num.dart
new file mode 100644
index 0000000..7d67213
--- /dev/null
+++ b/runtime/lib/num.dart
@@ -0,0 +1,9 @@
+// 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.
+
+abstract class _Num implements num {
+
+  /* patch */ String toString() native "Num_toString";
+
+}
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 8c52a24..701fccd 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -46,6 +46,7 @@
 
 DEFINE_NATIVE_ENTRY(Object_toString, 1) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  ASSERT(!instance.IsString());  // See issue 20583.
   const char* c_str = instance.ToCString();
   return String::New(c_str);
 }
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index f750fc3..3ac78a8 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -414,23 +414,29 @@
     return pattern.allMatches(this.substring(startIndex)).isNotEmpty;
   }
 
-  String replaceFirst(Pattern pattern, String replacement) {
+  String replaceFirst(Pattern pattern,
+                      String replacement,
+                      [int startIndex = 0]) {
     if (pattern is! Pattern) {
       throw new ArgumentError("${pattern} is not a Pattern");
     }
     if (replacement is! String) {
       throw new ArgumentError("${replacement} is not a String");
     }
-    StringBuffer buffer = new StringBuffer();
-    int startIndex = 0;
-    Iterator iterator = pattern.allMatches(this).iterator;
-    if (iterator.moveNext()) {
-      Match match = iterator.current;
-      buffer..write(this.substring(startIndex, match.start))
-            ..write(replacement);
-      startIndex = match.end;
+    if (startIndex is! int) {
+      throw new ArgumentError("${startIndex} is not an int");
     }
-    return (buffer..write(this.substring(startIndex))).toString();
+    if ((startIndex < 0) || (startIndex > this.length)) {
+      throw new RangeError.range(startIndex, 0, this.length);
+    }
+    Iterator iterator =
+        startIndex == 0 ? pattern.allMatches(this).iterator
+                        : pattern.allMatches(this, startIndex).iterator;
+    if (!iterator.moveNext()) return this;
+    Match match = iterator.current;
+    return "${this.substring(0, match.start)}"
+           "$replacement"
+           "${this.substring(match.end)}";
   }
 
   String replaceAll(Pattern pattern, String replacement) {
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index cbbc285..7eebb8c 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -286,6 +286,7 @@
 const int kFloatSize = sizeof(float);  // NOLINT
 const int kQuadSize = 4 * kFloatSize;
 const int kSimd128Size = sizeof(simd128_value_t);  // NOLINT
+const int kInt32Size = sizeof(int32_t);  // NOLINT
 #ifdef ARCH_IS_32_BIT
 const int kWordSizeLog2 = 2;
 const uword kUwordMax = kMaxUint32;
diff --git a/runtime/third_party/jscre/pcre_internal.h b/runtime/third_party/jscre/pcre_internal.h
index 19eadad..92011f8 100644
--- a/runtime/third_party/jscre/pcre_internal.h
+++ b/runtime/third_party/jscre/pcre_internal.h
@@ -83,8 +83,8 @@
 #ifndef DFTABLES
 
 // TODO(xxx): Hook this up to something that checks assertions.
-#define ASSERT(x) if (!(x)) *(reinterpret_cast<volatile int*>(NULL)) = NULL
-#define ASSERT_NOT_REACHED() *(reinterpret_cast<volatile int*>(NULL)) = NULL
+#define ASSERT(x) if (!(x)) abort()
+#define ASSERT_NOT_REACHED() abort()
 
 #ifdef WIN32
 #pragma warning(disable: 4232)
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 6ae73b1..3c22762 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -549,6 +549,8 @@
   ASSERT(regs != 0);
   EmitMultiMemOp(cond, am, true, base, regs);
   if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    // On ARMv5, touching a "banked" register after an ldm gives undefined
+    // behavior, so we just add a nop here to make that case easy to avoid.
     nop();
   }
 }
@@ -558,6 +560,11 @@
                     Condition cond) {
   ASSERT(regs != 0);
   EmitMultiMemOp(cond, am, false, base, regs);
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    // On ARMv5, touching a "banked" register after an stm gives undefined
+    // behavior, so we just add a nop here to make that case easy to avoid.
+    nop();
+  }
 }
 
 
@@ -2810,6 +2817,7 @@
   if (TargetCPUFeatures::integer_division_supported()) {
     sdiv(result, left, right);
   } else {
+    ASSERT(TargetCPUFeatures::vfp_supported());
     SRegister stmpl = static_cast<SRegister>(2 * tmpl);
     SRegister stmpr = static_cast<SRegister>(2 * tmpr);
     vmovsr(stmpl, left);
@@ -3181,6 +3189,49 @@
 }
 
 
+void Assembler::TryAllocateArray(intptr_t cid,
+                                 intptr_t instance_size,
+                                 Label* failure,
+                                 Register instance,
+                                 Register end_address,
+                                 Register temp1,
+                                 Register temp2) {
+  if (FLAG_inline_alloc) {
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
+    LoadImmediate(temp1, heap->TopAddress());
+    ldr(instance, Address(temp1, 0));  // Potential new object start.
+    AddImmediate(end_address, instance, instance_size);
+    b(failure, VS);
+
+    // Check if the allocation fits into the remaining space.
+    // instance: potential new object start.
+    // end_address: potential next object start.
+    LoadImmediate(temp2, heap->EndAddress());
+    ldr(temp2, Address(temp2, 0));
+    cmp(end_address, Operand(temp2));
+    b(failure, CS);
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    str(end_address, Address(temp1, 0));
+    add(instance, instance, Operand(kHeapObjectTag));
+    LoadImmediate(temp2, instance_size);
+    UpdateAllocationStatsWithSize(cid, temp2, temp1);
+
+    // Initialize the tags.
+    // instance: new object start as a tagged pointer.
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(cid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    LoadImmediate(temp2, tags);
+    str(temp2, FieldAddress(instance, Array::tags_offset()));  // Store tags.
+  } else {
+    b(failure);
+  }
+}
+
+
 void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
     StubCode* stub_code = Isolate::Current()->stub_code();
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index fc66dec..9a08c8e 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -12,6 +12,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/constants_arm.h"
+#include "vm/cpu.h"
 #include "vm/object.h"
 #include "vm/simulator.h"
 
@@ -774,7 +775,9 @@
   // Instruction pattern from entrypoint is used in Dart frame prologs
   // to set up the frame and save a PC which can be used to figure out the
   // RawInstruction object corresponding to the code running in the frame.
-  static const intptr_t kEntryPointToPcMarkerOffset = Instr::kPCReadOffset;
+  static intptr_t EntryPointToPcMarkerOffset() {
+    return TargetCPUFeatures::store_pc_read_offset();
+  }
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
@@ -809,6 +812,14 @@
                    Register instance_reg,
                    Register temp_reg);
 
+  void TryAllocateArray(intptr_t cid,
+                        intptr_t instance_size,
+                        Label* failure,
+                        Register instance,
+                        Register end_address,
+                        Register temp1,
+                        Register temp2);
+
   // Emit data (e.g encoded instruction or immediate) in instruction stream.
   void Emit(int32_t value);
 
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 7911896..cde458c 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1413,6 +1413,49 @@
 }
 
 
+void Assembler::TryAllocateArray(intptr_t cid,
+                                 intptr_t instance_size,
+                                 Label* failure,
+                                 Register instance,
+                                 Register end_address,
+                                 Register temp1,
+                                 Register temp2) {
+  if (FLAG_inline_alloc) {
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
+    LoadImmediate(temp1, heap->TopAddress(), PP);
+    ldr(instance, Address(temp1, 0));  // Potential new object start.
+    AddImmediate(end_address, instance, instance_size, PP);
+    b(failure, VS);
+
+    // Check if the allocation fits into the remaining space.
+    // instance: potential new object start.
+    // end_address: potential next object start.
+    LoadImmediate(temp2, heap->EndAddress(), PP);
+    ldr(temp2, Address(temp2, 0));
+    cmp(end_address, Operand(temp2));
+    b(failure, CS);
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    str(end_address, Address(temp1, 0));
+    add(instance, instance, Operand(kHeapObjectTag));
+    LoadImmediate(temp2, instance_size, PP);
+    UpdateAllocationStatsWithSize(cid, temp2, PP);
+
+    // Initialize the tags.
+    // instance: new object start as a tagged pointer.
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(cid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    LoadImmediate(temp2, tags, PP);
+    str(temp2, FieldAddress(instance, Array::tags_offset()));  // Store tags.
+  } else {
+    b(failure);
+  }
+}
+
+
 Address Assembler::ElementAddressForIntIndex(bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index ac082d1..4b5b635 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -452,6 +452,9 @@
   // to set up the frame and save a PC which can be used to figure out the
   // RawInstruction object corresponding to the code running in the frame.
   static const intptr_t kEntryPointToPcMarkerOffset = 0;
+  static intptr_t EntryPointToPcMarkerOffset() {
+    return kEntryPointToPcMarkerOffset;
+  }
 
   // Emit data (e.g encoded instruction or immediate) in instruction stream.
   void Emit(int32_t value);
@@ -1221,6 +1224,14 @@
                    Register temp_reg,
                    Register pp);
 
+  void TryAllocateArray(intptr_t cid,
+                        intptr_t instance_size,
+                        Label* failure,
+                        Register instance,
+                        Register end_address,
+                        Register temp1,
+                        Register temp2);
+
   Address ElementAddressForIntIndex(bool is_external,
                                     intptr_t cid,
                                     intptr_t index_scale,
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 1491cf3..d9c372a 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2443,6 +2443,7 @@
       class_heap_stats_table_address + class_offset + size_field_offset);
 }
 
+
 void Assembler::UpdateAllocationStats(intptr_t cid,
                                       Register temp_reg,
                                       Heap::Space space) {
@@ -2523,6 +2524,45 @@
 }
 
 
+void Assembler::TryAllocateArray(intptr_t cid,
+                                 intptr_t instance_size,
+                                 Label* failure,
+                                 bool near_jump,
+                                 Register instance,
+                                 Register end_address) {
+  ASSERT(failure != NULL);
+  if (FLAG_inline_alloc) {
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
+    movl(instance, Address::Absolute(heap->TopAddress()));
+    movl(end_address, instance);
+
+    addl(end_address, Immediate(instance_size));
+    j(CARRY, failure);
+
+    // Check if the allocation fits into the remaining space.
+    // EAX: potential new object start.
+    // EBX: potential next object start.
+    cmpl(end_address, Address::Absolute(heap->EndAddress()));
+    j(ABOVE_EQUAL, failure);
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    movl(Address::Absolute(heap->TopAddress()), end_address);
+    addl(instance, Immediate(kHeapObjectTag));
+    UpdateAllocationStatsWithSize(cid, instance_size, kNoRegister);
+
+    // Initialize the tags.
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(cid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    movl(FieldAddress(instance, Object::tags_offset()), Immediate(tags));
+  } else {
+    jmp(failure);
+  }
+}
+
+
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   EnterFrame(0);
   Label dart_entry;
@@ -2531,7 +2571,7 @@
   // The runtime system assumes that the code marker address is
   // kEntryPointToPcMarkerOffset bytes from the entry.  If there is any code
   // generated before entering the frame, the address needs to be adjusted.
-  const intptr_t offset = kEntryPointToPcMarkerOffset - CodeSize();
+  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
   if (offset != 0) {
     addl(Address(ESP, 0), Immediate(offset));
   }
@@ -2554,7 +2594,7 @@
   // The runtime system assumes that the code marker address is
   // kEntryPointToPcMarkerOffset bytes from the entry.  Since there is no
   // code to set up the frame pointer, the address needs to be adjusted.
-  const intptr_t offset = kEntryPointToPcMarkerOffset - CodeSize();
+  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
   if (offset != 0) {
     addl(Address(ESP, 0), Immediate(offset));
   }
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 8ec66e1..6201cae 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -788,6 +788,9 @@
   //   call L             (size is 5 bytes)
   //   L:
   static const intptr_t kEntryPointToPcMarkerOffset = 8;
+  static intptr_t EntryPointToPcMarkerOffset() {
+    return kEntryPointToPcMarkerOffset;
+  }
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
@@ -812,6 +815,13 @@
                    Register instance_reg,
                    Register temp_reg);
 
+  void TryAllocateArray(intptr_t cid,
+                        intptr_t instance_size,
+                        Label* failure,
+                        bool near_jump,
+                        Register instance,
+                        Register end_address);
+
   // Debugging and bringup support.
   void Stop(const char* message);
   void Unimplemented(const char* message);
@@ -829,13 +839,25 @@
   static const char* FpuRegisterName(FpuRegister reg);
 
   // Smis that do not fit into 17 bits (16 bits of payload) are unsafe.
-  static bool IsSafe(const Object& object) {
-    return !object.IsSmi() ||
-        Utils::IsInt(17, reinterpret_cast<intptr_t>(object.raw()));
-  }
   static bool IsSafeSmi(const Object& object) {
-    return object.IsSmi() &&
-        Utils::IsInt(17, reinterpret_cast<intptr_t>(object.raw()));
+    if (!object.IsSmi()) {
+      return false;
+    }
+
+    if (Utils::IsInt(17, reinterpret_cast<intptr_t>(object.raw()))) {
+      return true;
+    }
+
+    // Single bit smis (powers of two) and corresponding masks are safe.
+    const intptr_t value = Smi::Cast(object).Value();
+    if (Utils::IsPowerOfTwo(value) || Utils::IsPowerOfTwo(value + 1)) {
+      return true;
+    }
+
+    return false;
+  }
+  static bool IsSafe(const Object& object) {
+    return !object.IsSmi() || IsSafeSmi(object);
   }
 
  private:
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 802dd49..4e9243f 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -887,6 +887,51 @@
 }
 
 
+void Assembler::TryAllocateArray(intptr_t cid,
+                                 intptr_t instance_size,
+                                 Label* failure,
+                                 Register instance,
+                                 Register end_address,
+                                 Register temp1,
+                                 Register temp2) {
+  if (FLAG_inline_alloc) {
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
+
+    LoadImmediate(temp1, heap->TopAddress());
+    lw(instance, Address(temp1, 0));  // Potential new object start.
+    // Potential next object start.
+    AddImmediateDetectOverflow(end_address, instance, instance_size, CMPRES1);
+    bltz(CMPRES1, failure);  // CMPRES1 < 0 on overflow.
+
+    // Check if the allocation fits into the remaining space.
+    // instance: potential new object start.
+    // end_address: potential next object start.
+    LoadImmediate(temp2, heap->EndAddress());
+    lw(temp2, Address(temp2, 0));
+    BranchUnsignedGreaterEqual(end_address, temp2, failure);
+
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    sw(end_address, Address(temp1, 0));
+    addiu(instance, instance, Immediate(kHeapObjectTag));
+    LoadImmediate(temp1, instance_size);
+    UpdateAllocationStatsWithSize(cid, temp1, temp2);
+
+    // Initialize the tags.
+    // instance: new object start as a tagged pointer.
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(cid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    LoadImmediate(temp1, tags);
+    sw(temp1, FieldAddress(instance, Array::tags_offset()));  // Store tags.
+  } else {
+    b(failure);
+  }
+}
+
+
 void Assembler::CallRuntime(const RuntimeEntry& entry,
                             intptr_t argument_count) {
   entry.Call(this, argument_count);
@@ -940,7 +985,7 @@
   // The runtime system assumes that the code marker address is
   // kEntryPointToPcMarkerOffset bytes from the entry.  Since there is no
   // code to set up the frame pointer, etc., the address needs to be adjusted.
-  const intptr_t offset = kEntryPointToPcMarkerOffset - CodeSize();
+  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
   // Calculate the offset of the pool pointer from the PC.
   const intptr_t object_pool_pc_dist =
       Instructions::HeaderSize() - Instructions::object_pool_offset() +
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index f5199b8..fbc52dc 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -47,7 +47,7 @@
 
 class Address : public ValueObject {
  public:
-  Address(Register base, int32_t offset = 0)
+  explicit Address(Register base, int32_t offset = 0)
       : ValueObject(), base_(base), offset_(offset) { }
 
   Address(const Address& other)
@@ -194,6 +194,9 @@
   // RawInstruction object corresponding to the code running in the frame.
   // See EnterDartFrame. There are 6 instructions before we know the PC.
   static const intptr_t kEntryPointToPcMarkerOffset = 6 * Instr::kInstrSize;
+  static intptr_t EntryPointToPcMarkerOffset() {
+    return kEntryPointToPcMarkerOffset;
+  }
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
@@ -214,6 +217,14 @@
                    Register instance_reg,
                    Register temp_reg);
 
+  void TryAllocateArray(intptr_t cid,
+                        intptr_t instance_size,
+                        Label* failure,
+                        Register instance,
+                        Register end_address,
+                        Register temp1,
+                        Register temp2);
+
   // Debugging and bringup support.
   void Stop(const char* message);
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 1a4a376..3d4e9ff 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -3023,7 +3023,7 @@
   const intptr_t object_pool_pc_dist =
       Instructions::HeaderSize() - Instructions::object_pool_offset() +
       CodeSize();
-  const intptr_t offset = kEntryPointToPcMarkerOffset - CodeSize();
+  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
   if (offset != 0) {
     addq(Address(RSP, 0), Immediate(offset));
   }
@@ -3082,7 +3082,7 @@
     const intptr_t object_pool_pc_dist =
         Instructions::HeaderSize() - Instructions::object_pool_offset() +
         CodeSize();
-    const intptr_t offset = kEntryPointToPcMarkerOffset - CodeSize();
+    const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
     if (offset != 0) {
       addq(Address(RSP, 0), Immediate(offset));
     }
@@ -3119,28 +3119,43 @@
 }
 
 
-void Assembler::UpdateAllocationStats(intptr_t cid,
-                                      Heap::Space space) {
+void Assembler::ComputeCounterAddressesForCid(intptr_t cid,
+                                              Heap::Space space,
+                                              Address* count_address,
+                                              Address* size_address) {
+  ASSERT(cid < kNumPredefinedCids);
   Register temp_reg = TMP;
-  ASSERT(cid > 0);
   Isolate* isolate = Isolate::Current();
   ClassTable* class_table = isolate->class_table();
+  const uword class_heap_stats_table_address =
+      class_table->PredefinedClassHeapStatsTableAddress();
+  const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
+  const uword count_field_offset = (space == Heap::kNew)
+      ? ClassHeapStats::allocated_since_gc_new_space_offset()
+      : ClassHeapStats::allocated_since_gc_old_space_offset();
+  const uword size_field_offset = (space == Heap::kNew)
+      ? ClassHeapStats::allocated_size_since_gc_new_space_offset()
+      : ClassHeapStats::allocated_size_since_gc_old_space_offset();
+  movq(temp_reg, Immediate(class_heap_stats_table_address + class_offset));
+  *count_address = Address(temp_reg, count_field_offset);
+  *size_address = Address(temp_reg, size_field_offset);
+}
+
+
+void Assembler::UpdateAllocationStats(intptr_t cid,
+                                      Heap::Space space) {
+  ASSERT(cid > 0);
   if (cid < kNumPredefinedCids) {
-    const uword class_heap_stats_table_address =
-        class_table->PredefinedClassHeapStatsTableAddress();
-    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
-    const uword count_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_since_gc_old_space_offset();
-    movq(temp_reg, Immediate(class_heap_stats_table_address + class_offset));
-    const Address& count_address = Address(temp_reg, count_field_offset);
+    Address count_address(kNoRegister, 0), size_address(kNoRegister, 0);
+    ComputeCounterAddressesForCid(cid, space, &count_address, &size_address);
     incq(count_address);
   } else {
-    ASSERT(temp_reg != kNoRegister);
+    Register temp_reg = TMP;
     const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
-    const uword count_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_since_gc_old_space_offset();
+    const uword count_field_offset = (space == Heap::kNew)
+        ? ClassHeapStats::allocated_since_gc_new_space_offset()
+        : ClassHeapStats::allocated_since_gc_old_space_offset();
+    ClassTable* class_table = Isolate::Current()->class_table();
     movq(temp_reg, Immediate(class_table->ClassStatsTableAddress()));
     movq(temp_reg, Address(temp_reg, 0));
     incq(Address(temp_reg, class_offset + count_field_offset));
@@ -3151,39 +3166,24 @@
 void Assembler::UpdateAllocationStatsWithSize(intptr_t cid,
                                               Register size_reg,
                                               Heap::Space space) {
-  Register temp_reg = TMP;
   ASSERT(cid > 0);
-  Isolate* isolate = Isolate::Current();
-  ClassTable* class_table = isolate->class_table();
-  if (cid < kNumPredefinedCids) {
-    const uword class_heap_stats_table_address =
-        class_table->PredefinedClassHeapStatsTableAddress();
-    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
-    const uword count_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_since_gc_old_space_offset();
-    const uword size_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_size_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_size_since_gc_old_space_offset();
-    movq(temp_reg, Immediate(class_heap_stats_table_address + class_offset));
-    const Address& count_address = Address(temp_reg, count_field_offset);
-    const Address& size_address = Address(temp_reg, size_field_offset);
-    incq(count_address);
-    addq(size_address, size_reg);
-  } else {
-    ASSERT(temp_reg != kNoRegister);
-    const uword class_offset = cid * sizeof(ClassHeapStats);  // NOLINT
-    const uword count_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_since_gc_old_space_offset();
-    const uword size_field_offset = (space == Heap::kNew) ?
-      ClassHeapStats::allocated_size_since_gc_new_space_offset() :
-      ClassHeapStats::allocated_size_since_gc_old_space_offset();
-    movq(temp_reg, Immediate(class_table->ClassStatsTableAddress()));
-    movq(temp_reg, Address(temp_reg, 0));
-    incq(Address(temp_reg, class_offset + count_field_offset));
-    addq(Address(temp_reg, class_offset + size_field_offset), size_reg);
-  }
+  ASSERT(cid < kNumPredefinedCids);
+  Address count_address(kNoRegister, 0), size_address(kNoRegister, 0);
+  ComputeCounterAddressesForCid(cid, space, &count_address, &size_address);
+  incq(count_address);
+  addq(size_address, size_reg);
+}
+
+
+void Assembler::UpdateAllocationStatsWithSize(intptr_t cid,
+                                              intptr_t size_in_bytes,
+                                              Heap::Space space) {
+  ASSERT(cid > 0);
+  ASSERT(cid < kNumPredefinedCids);
+  Address count_address(kNoRegister, 0), size_address(kNoRegister, 0);
+  ComputeCounterAddressesForCid(cid, space, &count_address, &size_address);
+  incq(count_address);
+  addq(size_address, Immediate(size_in_bytes));
 }
 
 
@@ -3222,6 +3222,49 @@
 }
 
 
+void Assembler::TryAllocateArray(intptr_t cid,
+                                 intptr_t instance_size,
+                                 Label* failure,
+                                 bool near_jump,
+                                 Register instance,
+                                 Register end_address) {
+  ASSERT(failure != NULL);
+  if (FLAG_inline_alloc) {
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
+
+    movq(instance, Immediate(heap->TopAddress()));
+    movq(instance, Address(instance, 0));
+    movq(end_address, RAX);
+
+    addq(end_address, Immediate(instance_size));
+    j(CARRY, failure);
+
+    // Check if the allocation fits into the remaining space.
+    // instance: potential new object start.
+    // end_address: potential next object start.
+    movq(TMP, Immediate(heap->EndAddress()));
+    cmpq(end_address, Address(TMP, 0));
+    j(ABOVE_EQUAL, failure);
+
+    // Successfully allocated the object(s), now update top to point to
+    // next object start and initialize the object.
+    movq(TMP, Immediate(heap->TopAddress()));
+    movq(Address(TMP, 0), end_address);
+    addq(instance, Immediate(kHeapObjectTag));
+    UpdateAllocationStatsWithSize(kArrayCid, instance_size);
+
+    // Initialize the tags.
+    // instance: new object start as a tagged pointer.
+    uword tags = 0;
+    tags = RawObject::ClassIdTag::update(cid, tags);
+    tags = RawObject::SizeTag::update(instance_size, tags);
+    movq(FieldAddress(instance, Array::tags_offset()), Immediate(tags));
+  } else {
+    jmp(failure);
+  }
+}
+
 void Assembler::Align(int alignment, intptr_t offset) {
   ASSERT(Utils::IsPowerOfTwo(alignment));
   intptr_t pos = offset + buffer_.GetPosition();
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index e589dfe..e66f1c9 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -854,6 +854,9 @@
   //   call L             (size is 5 bytes)
   //   L:
   static const intptr_t kEntryPointToPcMarkerOffset = 9;
+  static intptr_t EntryPointToPcMarkerOffset() {
+    return kEntryPointToPcMarkerOffset;
+  }
 
   void UpdateAllocationStats(intptr_t cid,
                              Heap::Space space = Heap::kNew);
@@ -861,6 +864,9 @@
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
                                      Heap::Space space = Heap::kNew);
+  void UpdateAllocationStatsWithSize(intptr_t cid,
+                                     intptr_t instance_size,
+                                     Heap::Space space = Heap::kNew);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
@@ -874,6 +880,13 @@
                    Register instance_reg,
                    Register pp);
 
+  void TryAllocateArray(intptr_t cid,
+                        intptr_t instance_size,
+                        Label* failure,
+                        bool near_jump,
+                        Register instance,
+                        Register end_address);
+
   // Debugging and bringup support.
   void Stop(const char* message);
   void Unimplemented(const char* message);
@@ -1021,6 +1034,10 @@
                                   Register value,
                                   Label* no_update);
 
+  void ComputeCounterAddressesForCid(intptr_t cid,
+                                     Heap::Space space,
+                                     Address* count_address,
+                                     Address* size_address);
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
 };
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index 26a6be2..95865d0 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -16,6 +16,8 @@
 namespace dart {
 
 #define FOR_EACH_NODE(V)                                                       \
+  V(Await)                                                                     \
+  V(AwaitMarker)                                                               \
   V(Return)                                                                    \
   V(Literal)                                                                   \
   V(Type)                                                                      \
@@ -42,6 +44,7 @@
   V(ConstructorCall)                                                           \
   V(InstanceGetter)                                                            \
   V(InstanceSetter)                                                            \
+  V(InitStaticField)                                                           \
   V(StaticGetter)                                                              \
   V(StaticSetter)                                                              \
   V(NativeBody)                                                                \
@@ -146,6 +149,68 @@
 };
 
 
+class AwaitNode : public AstNode {
+ public:
+  AwaitNode(intptr_t token_pos, AstNode* expr)
+    : AstNode(token_pos), expr_(expr) { }
+
+  void VisitChildren(AstNodeVisitor* visitor) const {
+    expr_->Visit(visitor);
+  }
+
+  AstNode* expr() const { return expr_; }
+
+  DECLARE_COMMON_NODE_FUNCTIONS(AwaitNode);
+
+ private:
+  AstNode* expr_;
+
+  DISALLOW_COPY_AND_ASSIGN(AwaitNode);
+};
+
+
+// AwaitMarker nodes are used to generate markers that the FlowGraphBuilder
+// relies on. They can occur in two kinds:
+// 1) kNewContinuationState: A marker indicating that a new await state needs to
+//    be added to a function preamble. This type also triggers storing of the
+//    current context.
+// 2) kTargetForContinuation: A marker indicating an entry point for the most
+//    recent generated state.
+//
+// In general it is expected (ASSERT) that the different kinds of markers reach
+// the FlowGraphBuilder in alternating order. That is:
+//   <new state> -> <other nodes> -> <target> -> <other nodes> ->
+//   <new state> -> ...
+class AwaitMarkerNode : public AstNode {
+ public:
+  enum MarkerType {
+    kNewContinuationState,
+    kTargetForContinuation,
+  };
+
+  explicit AwaitMarkerNode(MarkerType marker_type)
+    : AstNode(Scanner::kNoSourcePos),
+      marker_type_(marker_type) { }
+
+  void VisitChildren(AstNodeVisitor* visitor) const { }
+
+  MarkerType marker_type() const {
+    return marker_type_;
+  }
+
+  LocalScope* scope() const { return scope_; }
+  void set_scope(LocalScope* scope) { scope_ = scope; }
+
+  DECLARE_COMMON_NODE_FUNCTIONS(AwaitMarkerNode);
+
+ private:
+  MarkerType marker_type_;
+  LocalScope* scope_;
+
+  DISALLOW_COPY_AND_ASSIGN(AwaitMarkerNode);
+};
+
+
 class SequenceNode : public AstNode {
  public:
   SequenceNode(intptr_t token_pos, LocalScope* scope)
@@ -514,24 +579,31 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(PrimaryNode);
 };
 
-
-// TODO(mlippautz): Implement return nodes that are used to return from a
-// continuation.
+// Return nodes can be of different types:
+// * A regular return node that in the case of async functions gets replaced
+//   with appropriate completer calls. This kind is generated by dart code.
+// * A continuation return that just returns from a function. This kind is
+//   generated by AST transformers.
 class ReturnNode : public AstNode {
  public:
+  enum ReturnType {
+    kRegular,
+    kContinuation,
+  };
+
   // Return from a void function returns the null object.
   explicit ReturnNode(intptr_t token_pos)
       : AstNode(token_pos),
         value_(new LiteralNode(token_pos, Instance::ZoneHandle())),
         inlined_finally_list_(),
-        is_regular_return_(true) { }
+        return_type_(kRegular) { }
   // Return from a non-void function.
   ReturnNode(intptr_t token_pos,
              AstNode* value)
       : AstNode(token_pos),
         value_(value),
         inlined_finally_list_(),
-        is_regular_return_(true) {
+        return_type_(kRegular) {
     ASSERT(value_ != NULL);
   }
 
@@ -556,8 +628,8 @@
   void set_scope(LocalScope* scope) { scope_ = scope; }
   LocalScope* scope() const { return scope_; }
 
-  // Returns false if the return node is used to return from a continuation.
-  bool is_regular_return() const { return is_regular_return_; }
+  ReturnType return_type() const { return return_type_; }
+  void set_return_type(ReturnType type) { return_type_ = type; }
 
   DECLARE_COMMON_NODE_FUNCTIONS(ReturnNode);
 
@@ -565,7 +637,7 @@
   AstNode* value_;
   GrowableArray<InlinedFinallyNode*> inlined_finally_list_;
   LocalScope* scope_;
-  bool is_regular_return_;
+  ReturnType return_type_;
 
   DISALLOW_COPY_AND_ASSIGN(ReturnNode);
 };
@@ -1391,6 +1463,26 @@
 };
 
 
+class InitStaticFieldNode : public AstNode {
+ public:
+  InitStaticFieldNode(intptr_t token_pos, const Field& field)
+      : AstNode(token_pos), field_(field) {
+    ASSERT(field_.IsZoneHandle());
+  }
+
+  const Field& field() const { return field_; }
+
+  virtual void VisitChildren(AstNodeVisitor* visitor) const { }
+
+  DECLARE_COMMON_NODE_FUNCTIONS(InitStaticFieldNode);
+
+ private:
+  const Field& field_;
+
+  DISALLOW_COPY_AND_ASSIGN(InitStaticFieldNode);
+};
+
+
 class StaticGetterNode : public AstNode {
  public:
   StaticGetterNode(intptr_t token_pos,
diff --git a/runtime/vm/ast_printer.cc b/runtime/vm/ast_printer.cc
index 1c76c59..e363cfe 100644
--- a/runtime/vm/ast_printer.cc
+++ b/runtime/vm/ast_printer.cc
@@ -46,6 +46,12 @@
 
 void AstPrinter::VisitReturnNode(ReturnNode* node) {
   VisitGenericAstNode(node);
+  OS::Print("(%s %s",
+            node->PrettyName(),
+            (node->return_type() == ReturnNode::kContinuation) ?
+                "continuation" : "");
+  node->VisitChildren(this);
+  OS::Print(")");
 }
 
 
@@ -152,6 +158,16 @@
 }
 
 
+void AstPrinter::VisitAwaitNode(AwaitNode* node) {
+  VisitGenericAstNode(node);
+}
+
+
+void AstPrinter::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
+  VisitGenericAstNode(node);
+}
+
+
 void AstPrinter::VisitPrimaryNode(PrimaryNode* node) {
   OS::Print("*****%s***** \"%s\")",
             node->PrettyName(),
@@ -308,6 +324,12 @@
 }
 
 
+void AstPrinter::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
+  OS::Print("(%s \"%s\")", node->PrettyName(),
+            String::Handle(node->field().name()).ToCString());
+}
+
+
 void AstPrinter::VisitStaticGetterNode(StaticGetterNode* node) {
   String& class_name = String::Handle(node->cls().Name());
   OS::Print("(%s \"%s.%s\")",
@@ -388,10 +410,19 @@
 }
 
 
+static void IndentN(int count) {
+  for (int i = 0; i < count; i++) {
+    OS::Print(" ");
+  }
+}
+
+
 void AstPrinter::PrintLocalScopeVariable(const LocalScope* scope,
-                                         LocalVariable* var) {
+                                         LocalVariable* var,
+                                         int indent) {
   ASSERT(scope != NULL);
   ASSERT(var != NULL);
+  IndentN(indent);
   OS::Print("(%s%s '%s'",
             var->is_final() ? "final " : "",
             String::Handle(var->type().Name()).ToCString(),
@@ -407,30 +438,33 @@
   } else if (var->owner()->function_level() != 0) {
     OS::Print(" lev %d", var->owner()->function_level());
   }
-  OS::Print(" valid %" Pd "-%" Pd ")",
+  OS::Print(" valid %" Pd "-%" Pd ")\n",
             var->token_pos(),
             scope->end_token_pos());
 }
 
 
 void AstPrinter::PrintLocalScope(const LocalScope* scope,
-                                 int start_index) {
+                                 int start_index,
+                                 int indent) {
   ASSERT(scope != NULL);
   for (int i = start_index; i < scope->num_variables(); i++) {
     LocalVariable* var = scope->VariableAt(i);
-    PrintLocalScopeVariable(scope, var);
+    PrintLocalScopeVariable(scope, var, indent);
   }
   const LocalScope* child = scope->child();
   while (child != NULL) {
+    IndentN(indent);
     OS::Print("{scope %p ", child);
     if (child->HasContextLevel()) {
       OS::Print("ctx %d numctxvar %d ",
                 child->context_level(),
                 child->num_context_variables());
     }
-    OS::Print("llev %d ", child->loop_level());
-    PrintLocalScope(child, 0);
-    OS::Print("}");
+    OS::Print("llev %d\n", child->loop_level());
+    PrintLocalScope(child, 0, indent + kScopeIndent);
+    IndentN(indent);
+    OS::Print("}\n");
     child = child->sibling();
   }
 }
@@ -446,21 +480,23 @@
   const LocalScope* scope = node_sequence->scope();
   ASSERT(scope != NULL);
   const char* function_name = function.ToFullyQualifiedCString();
-  OS::Print("Scope for function '%s' {scope %p ", function_name, scope);
+  OS::Print("Scope for function '%s'\n{scope %p ", function_name, scope);
   if (scope->HasContextLevel()) {
     OS::Print("ctx %d numctxvar %d ",
               scope->context_level(),
               scope->num_context_variables());
   }
-  OS::Print("llev %d ", scope->loop_level());
+  OS::Print("llev %d\n", scope->loop_level());
   const int num_fixed_params = function.num_fixed_parameters();
   const int num_params = num_fixed_params + function.NumOptionalParameters();
   // Parameters must be listed first and must all appear in the top scope.
   ASSERT(num_params <= scope->num_variables());
   int pos = 0;  // Current position of variable in scope.
+  int indent = kScopeIndent;
   while (pos < num_params) {
     LocalVariable* param = scope->VariableAt(pos);
     ASSERT(param->owner() == scope);  // No aliases should precede parameters.
+    IndentN(indent);
     OS::Print("(param %s%s '%s'",
               param->is_final() ? "final " : "",
               String::Handle(param->type().Name()).ToCString(),
@@ -477,13 +513,13 @@
         OS::Print(" ctx %d", param->owner()->context_level());
       }
     }
-    OS::Print(" valid %" Pd "-%" Pd ")",
+    OS::Print(" valid %" Pd "-%" Pd ")\n",
               param->token_pos(),
               scope->end_token_pos());
     pos++;
   }
   // Visit remaining non-parameter variables and children scopes.
-  PrintLocalScope(scope, pos);
+  PrintLocalScope(scope, pos, indent);
   OS::Print("}\n");
 }
 
diff --git a/runtime/vm/ast_printer.h b/runtime/vm/ast_printer.h
index 8d5d31f..6823723 100644
--- a/runtime/vm/ast_printer.h
+++ b/runtime/vm/ast_printer.h
@@ -29,9 +29,14 @@
   AstPrinter();
   ~AstPrinter();
 
+  static const int kScopeIndent = 2;
+
   static void PrintLocalScopeVariable(const LocalScope* scope,
-                                      LocalVariable* var);
-  static void PrintLocalScope(const LocalScope* scope, int variable_index);
+                                      LocalVariable* var,
+                                      int indent = 0);
+  static void PrintLocalScope(const LocalScope* scope,
+                              int variable_index,
+                              int indent = 0);
 
   void VisitGenericAstNode(AstNode* node);
   void VisitGenericLocalNode(AstNode* node, const LocalVariable& local);
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
new file mode 100644
index 0000000..6ef865f
--- /dev/null
+++ b/runtime/vm/ast_transformer.cc
@@ -0,0 +1,514 @@
+// 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.
+
+#include "vm/ast_transformer.h"
+
+#include "vm/parser.h"
+
+namespace dart {
+
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+// Nodes that are unreachable from already parsed expressions.
+#define FOR_EACH_UNREACHABLE_NODE(V)                                           \
+  V(AwaitMarker)                                                               \
+  V(Case)                                                                      \
+  V(CatchClause)                                                               \
+  V(CloneContext)                                                              \
+  V(ClosureCall)                                                               \
+  V(DoWhile)                                                                   \
+  V(If)                                                                        \
+  V(InitStaticField)                                                           \
+  V(InlinedFinally)                                                            \
+  V(For)                                                                       \
+  V(Jump)                                                                      \
+  V(LoadInstanceField)                                                         \
+  V(NativeBody)                                                                \
+  V(Primary)                                                                   \
+  V(Return)                                                                    \
+  V(Sequence)                                                                  \
+  V(StoreInstanceField)                                                        \
+  V(Switch)                                                                    \
+  V(TryCatch)                                                                  \
+  V(While)
+
+#define DEFINE_UNREACHABLE(BaseName)                                           \
+void AwaitTransformer::Visit##BaseName##Node(BaseName##Node* node) {           \
+  UNREACHABLE();                                                               \
+}
+
+FOR_EACH_UNREACHABLE_NODE(DEFINE_UNREACHABLE)
+#undef DEFINE_UNREACHABLE
+
+
+AstNode* AwaitTransformer::Transform(AstNode* expr) {
+  expr->Visit(this);
+  return result_;
+}
+
+
+LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
+  const char* await_temp_prefix = ":await_temp_var_";
+  const String& cnt_str = String::ZoneHandle(
+      I, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_));
+  const String& symbol = String::ZoneHandle(I, Symbols::New(cnt_str));
+  ASSERT(!symbol.IsNull());
+  LocalVariable* await_tmp =
+      parsed_function_->await_temps_scope()->LookupVariable(symbol, false);
+  if (await_tmp == NULL) {
+    await_tmp = new(I) LocalVariable(
+        Scanner::kNoSourcePos,
+        symbol,
+        Type::ZoneHandle(I, Type::DynamicType()));
+    parsed_function_->await_temps_scope()->AddVariable(await_tmp);
+  }
+  return await_tmp;
+}
+
+
+LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node) {
+  LocalVariable* tmp_var = EnsureCurrentTempVar();
+  preamble_->Add(new(I) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node));
+  NextTempVar();
+  return tmp_var;
+}
+
+
+void AwaitTransformer::VisitLiteralNode(LiteralNode* node) {
+  result_ = node;
+}
+
+
+void AwaitTransformer::VisitTypeNode(TypeNode* node) {
+  result_ = new(I) TypeNode(node->token_pos(), node->type());
+}
+
+
+void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
+  // Await transformation:
+  //
+  //   :await_temp_var_X = <expr>;
+  //   :result_param = :await_temp_var_X;
+  //   if (:result_param is Future) {
+  //     AwaitMarker(kNewContinuationState);
+  //     :result_param.then(:async_op);
+  //     return;  // (return_type() == kContinuation)
+  //   }
+  //   AwaitMarker(kTargetForContinuation);  // Join happens here.
+  //   :saved_try_ctx_var = :await_saved_try_ctx_var_y;
+  //   :await_temp_var_(X+1) = :result_param;
+
+  LocalVariable* async_op = preamble_->scope()->LookupVariable(
+      Symbols::AsyncOperation(), false);
+  ASSERT(async_op != NULL);
+  LocalVariable* result_param = preamble_->scope()->LookupVariable(
+      Symbols::AsyncOperationParam(), false);
+  ASSERT(result_param != NULL);
+
+  node->expr()->Visit(this);
+  preamble_->Add(new(I) StoreLocalNode(
+      Scanner::kNoSourcePos, result_param, result_));
+  LoadLocalNode* load_result_param = new(I) LoadLocalNode(
+      Scanner::kNoSourcePos, result_param);
+  SequenceNode* is_future_branch = new(I) SequenceNode(
+      Scanner::kNoSourcePos, preamble_->scope());
+  AwaitMarkerNode* await_marker =
+      new(I) AwaitMarkerNode(AwaitMarkerNode::kNewContinuationState);
+  await_marker->set_scope(preamble_->scope());
+  is_future_branch->Add(await_marker);
+  ArgumentListNode* args = new(I) ArgumentListNode(Scanner::kNoSourcePos);
+  args->Add(new(I) LoadLocalNode(Scanner::kNoSourcePos, async_op));
+  is_future_branch->Add(new(I) InstanceCallNode(
+      Scanner::kNoSourcePos, load_result_param, Symbols::FutureThen(), args));
+  ReturnNode* continuation_return = new(I) ReturnNode(Scanner::kNoSourcePos);
+  continuation_return->set_return_type(ReturnNode::kContinuation);
+  is_future_branch->Add(continuation_return);
+
+  const Class& cls = Class::ZoneHandle(
+      I, library_.LookupClass(Symbols::Future()));
+  const AbstractType& future_type = AbstractType::ZoneHandle(I, cls.RareType());
+  ASSERT(!future_type.IsNull());
+  preamble_->Add(new(I) IfNode(
+      Scanner::kNoSourcePos,
+      new (I) ComparisonNode(
+          Scanner::kNoSourcePos,
+          Token::kIS,
+          load_result_param,
+          new (I) TypeNode(Scanner::kNoSourcePos, future_type)),
+      is_future_branch,
+      NULL));
+  preamble_->Add(new (I) AwaitMarkerNode(
+      AwaitMarkerNode::kTargetForContinuation));
+  // If this expression is part of a try block, also append the code for
+  // restoring the saved try context that lives on the stack.
+  if (parsed_function_->saved_try_ctx() != NULL) {
+    preamble_->Add(new (I) StoreLocalNode(
+        Scanner::kNoSourcePos,
+        parsed_function_->saved_try_ctx(),
+        new (I) LoadLocalNode(
+            Scanner::kNoSourcePos, parsed_function_->async_saved_try_ctx())));
+  }
+
+  LocalVariable* result = AddToPreambleNewTempVar(new(I) LoadLocalNode(
+      Scanner::kNoSourcePos, result_param));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+// Transforms boolean expressions into a sequence of evaluatons that only lazily
+// evaluate subexpressions.
+//
+// Example:
+//
+//   (a || b) only evaluates b if a is false
+//
+// Transformation (roughly):
+//
+//   t_1 = a;
+//   if (!t_1) {
+//     t_2 = b;
+//   }
+//   t_3 = t_1 || t_2;  // Compiler takes care that lazy evaluation takes place
+//                         on this level.
+AstNode* AwaitTransformer::LazyTransform(const Token::Kind logical_op,
+                                         AstNode* new_left,
+                                         AstNode* right) {
+  ASSERT(logical_op == Token::kAND || logical_op == Token::kOR);
+  AstNode* result = NULL;
+  const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
+      Token::kEQ : Token::kNE;
+  SequenceNode* eval = new(I) SequenceNode(
+      Scanner::kNoSourcePos, preamble_->scope());
+  SequenceNode* saved_preamble = preamble_;
+  preamble_ = eval;
+  result = Transform(right);
+  preamble_ = saved_preamble;
+  IfNode* right_body = new(I) IfNode(
+      Scanner::kNoSourcePos,
+      new(I) ComparisonNode(
+          Scanner::kNoSourcePos,
+          compare_logical_op,
+          new_left,
+          new(I) LiteralNode(Scanner::kNoSourcePos, Bool::True())),
+      eval,
+      NULL);
+  preamble_->Add(right_body);
+  return result;
+}
+
+
+void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) {
+  node->left()->Visit(this);
+  AstNode* new_left = result_;
+  AstNode* new_right = NULL;
+  // Preserve lazy evaluaton.
+  if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
+    new_right = LazyTransform(node->kind(), new_left, node->right());
+  } else {
+    new_right = Transform(node->right());
+  }
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) BinaryOpNode(node->token_pos(),
+                          node->kind(),
+                          new_left,
+                          new_right));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitBinaryOpWithMask32Node(
+    BinaryOpWithMask32Node* node) {
+  node->left()->Visit(this);
+  AstNode* new_left = result_;
+  AstNode* new_right = NULL;
+  // Preserve lazy evaluaton.
+  if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
+    new_right = LazyTransform(node->kind(), new_left, node->right());
+  } else {
+    new_right = Transform(node->right());
+  }
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) BinaryOpWithMask32Node(node->token_pos(),
+                                    node->kind(),
+                                    new_left,
+                                    new_right,
+                                    node->mask32()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
+  AstNode* new_left = Transform(node->left());
+  AstNode* new_right = Transform(node->right());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) ComparisonNode(node->token_pos(),
+                            node->kind(),
+                            new_left,
+                            new_right));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
+  AstNode* new_operand = Transform(node->operand());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+// ::= (<condition>) ? <true-branch> : <false-branch>
+//
+void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
+  AstNode* new_condition = Transform(node->condition());
+  SequenceNode* new_true = new(I) SequenceNode(
+      Scanner::kNoSourcePos, preamble_->scope());
+  SequenceNode* saved_preamble = preamble_;
+  preamble_ = new_true;
+  AstNode* new_true_result = Transform(node->true_expr());
+  SequenceNode* new_false = new(I) SequenceNode(
+      Scanner::kNoSourcePos, preamble_->scope());
+  preamble_ = new_false;
+  AstNode* new_false_result = Transform(node->false_expr());
+  preamble_ = saved_preamble;
+  IfNode* new_if = new(I) IfNode(Scanner::kNoSourcePos,
+                                 new_condition,
+                                 new_true,
+                                 new_false);
+  preamble_->Add(new_if);
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) ConditionalExprNode(Scanner::kNoSourcePos,
+                                 new_condition,
+                                 new_true_result,
+                                 new_false_result));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) {
+  ArgumentListNode* new_args = new(I) ArgumentListNode(node->token_pos());
+  for (intptr_t i = 0; i < node->length(); i++) {
+    new_args->Add(Transform(node->NodeAt(i)));
+  }
+  result_ = new_args;
+}
+
+
+void AwaitTransformer::VisitArrayNode(ArrayNode* node) {
+  GrowableArray<AstNode*> new_elements;
+  for (intptr_t i = 0; i < node->length(); i++) {
+    new_elements.Add(Transform(node->ElementAt(i)));
+  }
+  result_ = new(I) ArrayNode(node->token_pos(), node->type(), new_elements);
+}
+
+
+void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
+  ArrayNode* new_value = Transform(node->value())->AsArrayNode();
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StringInterpolateNode(node->token_pos(),
+                                   new_value));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitClosureNode(ClosureNode* node) {
+  AstNode* new_receiver = node->receiver();
+  if (new_receiver != NULL) {
+    new_receiver = Transform(new_receiver);
+  }
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) ClosureNode(node->token_pos(),
+                         node->function(),
+                         new_receiver,
+                         node->scope()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) {
+  AstNode* new_receiver = Transform(node->receiver());
+  ArgumentListNode* new_args =
+      Transform(node->arguments())->AsArgumentListNode();
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) InstanceCallNode(node->token_pos(),
+                              new_receiver,
+                              node->function_name(),
+                              new_args));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
+  ArgumentListNode* new_args =
+      Transform(node->arguments())->AsArgumentListNode();
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StaticCallNode(node->token_pos(),
+                            node->function(),
+                            new_args));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
+  ArgumentListNode* new_args =
+      Transform(node->arguments())->AsArgumentListNode();
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) ConstructorCallNode(node->token_pos(),
+                                 node->type_arguments(),
+                                 node->constructor(),
+                                 new_args));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
+  AstNode* new_receiver = Transform(node->receiver());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) InstanceGetterNode(node->token_pos(),
+                                new_receiver,
+                                node->field_name()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) {
+  AstNode* new_receiver = node->receiver();
+  if (new_receiver != NULL) {
+    new_receiver = Transform(new_receiver);
+  }
+  AstNode* new_value = Transform(node->value());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) InstanceSetterNode(node->token_pos(),
+                                new_receiver,
+                                node->field_name(),
+                                new_value));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) {
+  AstNode* new_receiver = node->receiver();
+  if (new_receiver != NULL) {
+    new_receiver = Transform(new_receiver);
+  }
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StaticGetterNode(node->token_pos(),
+                              new_receiver,
+                              node->is_super_getter(),
+                              node->cls(),
+                              node->field_name()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) {
+  AstNode* new_receiver = node->receiver();
+  if (new_receiver != NULL) {
+    new_receiver = Transform(new_receiver);
+  }
+  AstNode* new_value = Transform(node->value());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StaticSetterNode(node->token_pos(),
+                              new_receiver,
+                              node->cls(),
+                              node->field_name(),
+                              new_value));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) {
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) LoadLocalNode(node->token_pos(), &node->local()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
+  AstNode* new_value = Transform(node->value());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StoreLocalNode(node->token_pos(),
+                            &node->local(),
+                            new_value));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) LoadStaticFieldNode(node->token_pos(),
+                                 node->field()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
+  AstNode* new_value = Transform(node->value());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StoreStaticFieldNode(node->token_pos(),
+                                  node->field(),
+                                  new_value));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
+  AstNode* new_array = Transform(node->array());
+  AstNode* new_index = Transform(node->index_expr());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) LoadIndexedNode(node->token_pos(),
+                             new_array,
+                             new_index,
+                             node->super_class()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) {
+  AstNode* new_array = Transform(node->array());
+  AstNode* new_index = Transform(node->index_expr());
+  AstNode* new_value = Transform(node->value());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) StoreIndexedNode(node->token_pos(),
+                              new_array,
+                              new_index,
+                              new_value,
+                              node->super_class()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
+  AstNode* new_expr = Transform(node->expr());
+  LocalVariable* result = AddToPreambleNewTempVar(
+      new(I) AssignableNode(node->token_pos(),
+                            new_expr,
+                            node->type(),
+                            node->dst_name()));
+  result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result);
+}
+
+
+void AwaitTransformer::VisitLetNode(LetNode* node) {
+  // TODO(mlippautz): Check initializers and their temps.
+  LetNode* result = new(I) LetNode(node->token_pos());
+  for (intptr_t i = 0; i < node->nodes().length(); i++) {
+    result->AddNode(Transform(node->nodes()[i]));
+  }
+  result_ = result;
+}
+
+
+void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
+  // TODO(mlippautz): Check if relevant.
+  AstNode* new_exception = Transform(node->exception());
+  AstNode* new_stacktrace = Transform(node->stacktrace());
+  result_ = new(I) ThrowNode(node->token_pos(),
+                             new_exception,
+                             new_stacktrace);
+}
+
+}  // namespace dart
diff --git a/runtime/vm/ast_transformer.h b/runtime/vm/ast_transformer.h
new file mode 100644
index 0000000..6fbd82b
--- /dev/null
+++ b/runtime/vm/ast_transformer.h
@@ -0,0 +1,90 @@
+// 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.
+
+#ifndef VM_AST_TRANSFORMER_H_
+#define VM_AST_TRANSFORMER_H_
+
+#include "platform/assert.h"
+#include "vm/ast.h"
+
+namespace dart {
+
+class ParsedFunction;
+
+// Translate an AstNode containing an expression (that itself contains one or
+// more awaits) into a sequential representation where subexpressions are
+// evaluated sequentially into intermediates. Those intermediates are stored
+// within a context.
+//
+// This allows a function to be suspended and resumed from within evaluating an
+// expression. The evaluation is split among a so-called preamble and the
+// evaluation of the resulting expression (which is only a single load).
+//
+// Example (minimalistic):
+//
+//   var a = (await bar()) + foo();
+//
+// This translates to a premable similar to:
+//
+//   var t_1, t_2, t_3, t_4; // All stored in a context.
+//   t_1 = bar();
+//   :result_param = t_1;
+//   <continuation logic>
+//   t_2 = :result_param;
+//   t_3 = foo();
+//   t_4 = t_2.operator+(t_3);
+//
+// and a resulting expression of a load of t_4.
+//
+class AwaitTransformer : public AstNodeVisitor {
+ public:
+  AwaitTransformer(SequenceNode* preamble,
+                   const Library& library,
+                   ParsedFunction* const parsed_function)
+    : preamble_(preamble),
+      temp_cnt_(0),
+      library_(library),
+      parsed_function_(parsed_function),
+      isolate_(Isolate::Current()) {
+    // We later on save the continuation context and modify the jump counter
+    // from within the preamble context (in the FlowGraphBuilder). Look up the
+    // needed variables to get their corresponding aliases.
+    preamble->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+    preamble->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+  }
+
+#define DECLARE_VISIT(BaseName)                                                \
+  virtual void Visit##BaseName##Node(BaseName##Node* node);
+
+  FOR_EACH_NODE(DECLARE_VISIT)
+#undef DECLARE_VISIT
+
+  AstNode* Transform(AstNode* expr);
+
+ private:
+  LocalVariable* EnsureCurrentTempVar();
+  LocalVariable* AddToPreambleNewTempVar(AstNode* node);
+  ArgumentListNode* TransformArguments(ArgumentListNode* node);
+  AstNode* LazyTransform(const Token::Kind kind,
+                         AstNode* new_left,
+                         AstNode* right);
+
+  void NextTempVar() { temp_cnt_++; }
+
+  Isolate* isolate() const { return isolate_; }
+
+  SequenceNode* preamble_;
+  int32_t temp_cnt_;
+  AstNode* result_;
+  const Library& library_;
+  ParsedFunction* const parsed_function_;
+
+  Isolate* isolate_;
+
+  DISALLOW_COPY_AND_ASSIGN(AwaitTransformer);
+};
+
+}  // namespace dart
+
+#endif  // VM_AST_TRANSFORMER_H_
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 5452449..1c9acdb 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -286,10 +286,9 @@
   V(Int32x4_setFlagZ, 2)                                                       \
   V(Int32x4_setFlagW, 2)                                                       \
   V(Int32x4_select, 3)                                                         \
-  V(Isolate_mainPort, 0)                                                       \
-  V(Isolate_spawnFunction, 1)                                                  \
-  V(Isolate_spawnUri, 1)                                                       \
-  V(Isolate_sendOOB, 2)                                                       \
+  V(Isolate_spawnFunction, 3)                                                  \
+  V(Isolate_spawnUri, 4)                                                       \
+  V(Isolate_sendOOB, 2)                                                        \
   V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \
   V(Mirrors_makeLocalClassMirror, 1)                                           \
   V(Mirrors_makeLocalTypeMirror, 1)                                            \
@@ -370,6 +369,7 @@
   V(UserTag_makeCurrent, 1)                                                    \
   V(Profiler_getCurrentTag, 0)                                                 \
   V(ClassID_getID, 1)                                                          \
+  V(Num_toString, 1)                                                           \
 
 
 class BootstrapNatives : public AllStatic {
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index a12a3be..e2b3dc6 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -96,7 +96,7 @@
   EXPECT(ContainsCid(cha.leaf_classes(), class_c.id()));
   EXPECT(ContainsCid(cha.leaf_classes(), class_d.id()));
 
-  class Class& function_impl_class =
+  const Class& function_impl_class =
       Class::Handle(Type::Handle(Isolate::Current()->object_store()->
           function_impl_type()).type_class());
   EXPECT(cha.HasSubclasses(function_impl_class.id()));
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 2bda885..d6658f4 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1272,13 +1272,14 @@
   //   instance method.
 
   // Resolve type of fields and check for conflicts in super classes.
-  Array& array = Array::Handle(cls.fields());
-  Field& field = Field::Handle();
-  AbstractType& type = AbstractType::Handle();
-  String& name = String::Handle();
-  String& getter_name = String::Handle();
-  String& setter_name = String::Handle();
-  Class& super_class = Class::Handle();
+  Isolate* I = Isolate::Current();
+  Array& array = Array::Handle(I, cls.fields());
+  Field& field = Field::Handle(I);
+  AbstractType& type = AbstractType::Handle(I);
+  String& name = String::Handle(I);
+  String& getter_name = String::Handle(I);
+  String& setter_name = String::Handle(I);
+  Class& super_class = Class::Handle(I);
   const intptr_t num_fields = array.Length();
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= array.At(i);
@@ -1290,8 +1291,8 @@
       getter_name = Field::GetterSymbol(name);
       super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
@@ -1306,8 +1307,8 @@
       setter_name = Field::SetterSymbol(name);
       super_class = FindSuperOwnerOfFunction(cls, setter_name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance setter '%s=' of super class '%s'",
@@ -1322,8 +1323,8 @@
       // (but not getter).
       super_class = FindSuperOwnerOfFunction(cls, name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, field.token_pos(),
                     "field '%s' of class '%s' conflicts with method '%s' "
                     "of super class '%s'",
@@ -1338,13 +1339,13 @@
         (field.value() != Object::sentinel().raw())) {
       // The parser does not preset the value if the type is a type parameter or
       // is parameterized unless the value is null.
-      Error& error = Error::Handle();
+      Error& error = Error::Handle(I);
       if (type.IsMalformedOrMalbounded()) {
         error = type.error();
       } else {
         ASSERT(type.IsInstantiated());
       }
-      const Instance& const_value = Instance::Handle(field.value());
+      const Instance& const_value = Instance::Handle(I, field.value());
       if (!error.IsNull() ||
           (!type.IsDynamicType() &&
            !const_value.IsInstanceOf(type,
@@ -1352,10 +1353,10 @@
                                      &error))) {
         if (FLAG_error_on_bad_type) {
           const AbstractType& const_value_type = AbstractType::Handle(
-              const_value.GetType());
+              I, const_value.GetType());
           const String& const_value_type_name = String::Handle(
-              const_value_type.UserVisibleName());
-          const String& type_name = String::Handle(type.UserVisibleName());
+              I, const_value_type.UserVisibleName());
+          const String& type_name = String::Handle(I, type.UserVisibleName());
           ReportErrors(error, cls, field.token_pos(),
                        "error initializing static %s field '%s': "
                        "type '%s' is not a subtype of type '%s'",
@@ -1373,6 +1374,7 @@
           // we create an implicit static final getter and reset the field value
           // to the sentinel value.
           const Function& getter = Function::Handle(
+              I,
               Function::New(getter_name,
                             RawFunction::kImplicitStaticFinalGetter,
                             /* is_static = */ true,
@@ -1384,21 +1386,14 @@
                             field.token_pos()));
           getter.set_result_type(type);
           cls.AddFunction(getter);
-          field.set_value(Instance::Handle(Object::sentinel().raw()));
-
-          // Create initializer function.
-          if (!field.is_const()) {
-            const Function& init_function = Function::ZoneHandle(
-                Function::NewStaticInitializer(field));
-            cls.AddFunction(init_function);
-          }
+          field.set_value(Instance::Handle(I, Object::sentinel().raw()));
         }
       }
     }
   }
   // Collect interfaces, super interfaces, and super classes of this class.
   const GrowableObjectArray& interfaces =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
   CollectInterfaces(cls, interfaces);
   // Include superclasses in list of interfaces and super interfaces.
   super_class = cls.SuperClass();
@@ -1410,10 +1405,10 @@
   // Resolve function signatures and check for conflicts in super classes and
   // interfaces.
   array = cls.functions();
-  Function& function = Function::Handle();
-  Function& overridden_function = Function::Handle();
+  Function& function = Function::Handle(I);
+  Function& overridden_function = Function::Handle(I);
   const intptr_t num_functions = array.Length();
-  Error& error = Error::Handle();
+  Error& error = Error::Handle(I);
   for (intptr_t i = 0; i < num_functions; i++) {
     function ^= array.At(i);
     ResolveAndFinalizeSignature(cls, function);
@@ -1430,8 +1425,9 @@
         if (!overridden_function.IsNull() &&
             !function.HasCompatibleParametersWith(overridden_function,
                                                   &error)) {
-          const String& class_name = String::Handle(cls.Name());
-          const String& super_class_name = String::Handle(super_class.Name());
+          const String& class_name = String::Handle(I, cls.Name());
+          const String& super_class_name =
+              String::Handle(I, super_class.Name());
           ReportErrors(error, cls, function.token_pos(),
                        "class '%s' overrides method '%s' of super "
                        "class '%s' with incompatible parameters",
@@ -1445,8 +1441,9 @@
       if (function.is_static()) {
         super_class = FindSuperOwnerOfFunction(cls, name);
         if (!super_class.IsNull()) {
-          const String& class_name = String::Handle(cls.Name());
-          const String& super_class_name = String::Handle(super_class.Name());
+          const String& class_name = String::Handle(I, cls.Name());
+          const String& super_class_name =
+              String::Handle(I, super_class.Name());
           ReportError(cls, function.token_pos(),
                       "static setter '%s=' of class '%s' conflicts with "
                       "instance setter '%s=' of super class '%s'",
@@ -1467,8 +1464,8 @@
     if (function.is_static()) {
       super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, function.token_pos(),
                     "static %s '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
@@ -1483,7 +1480,7 @@
         // The function may be a still unresolved redirecting factory. Do not
         // yet try to resolve it in order to avoid cycles in class finalization.
         // However, the redirection type should be finalized.
-        Type& type = Type::Handle(function.RedirectionType());
+        Type& type = Type::Handle(I, function.RedirectionType());
         type ^= FinalizeType(cls, type, kCanonicalize);
         function.SetRedirectionType(type);
       }
@@ -1491,8 +1488,8 @@
                function.IsImplicitGetterFunction()) {
       super_class = FindSuperOwnerOfFunction(cls, name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, function.token_pos(),
                     "getter '%s' of class '%s' conflicts with "
                     "method '%s' of super class '%s'",
@@ -1507,8 +1504,8 @@
       // have the same name. Thus, we do not need to check setters.
       super_class = FindSuperOwnerOfFunction(cls, getter_name);
       if (!super_class.IsNull()) {
-        const String& class_name = String::Handle(cls.Name());
-        const String& super_class_name = String::Handle(super_class.Name());
+        const String& class_name = String::Handle(I, cls.Name());
+        const String& super_class_name = String::Handle(I, super_class.Name());
         ReportError(cls, function.token_pos(),
                     "method '%s' of class '%s' conflicts with "
                     "getter '%s' of super class '%s'",
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 7c307b7..f7cd53e 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -48,6 +48,19 @@
 }
 
 
+ClassTable::ClassTable(ClassTable* original)
+    : top_(original->top_),
+      capacity_(original->top_),
+      table_(reinterpret_cast<RawClass**>(
+          calloc(original->top_, sizeof(RawClass*)))),
+      class_heap_stats_table_(NULL),
+      predefined_class_heap_stats_table_(NULL) {
+  for (intptr_t i = 1; i < top_; i++) {
+    table_[i] = original->At(i);
+  }
+}
+
+
 ClassTable::~ClassTable() {
   free(table_);
   free(predefined_class_heap_stats_table_);
@@ -193,6 +206,8 @@
   recent.Reset();
   accumulated.Reset();
   last_reset.Reset();
+  promoted_count = 0;
+  promoted_size = 0;
 }
 
 
@@ -205,6 +220,8 @@
   last_reset.ResetNew();
   post_gc.ResetNew();
   recent.ResetNew();
+  old_pre_new_gc_count_ = recent.old_count;
+  old_pre_new_gc_size_ = recent.old_size;
 }
 
 
@@ -226,6 +243,8 @@
   recent.UpdateSize(instance_size);
   accumulated.UpdateSize(instance_size);
   last_reset.UpdateSize(instance_size);
+  promoted_size = promoted_count * instance_size;
+  old_pre_new_gc_size_ = old_pre_new_gc_count_ * instance_size;
 }
 
 
@@ -240,6 +259,12 @@
 }
 
 
+void ClassHeapStats::UpdatePromotedAfterNewGC() {
+  promoted_count = recent.old_count - old_pre_new_gc_count_;
+  promoted_size = recent.old_size - old_pre_new_gc_size_;
+}
+
+
 void ClassHeapStats::PrintToJSONObject(const Class& cls,
                                        JSONObject* obj) const {
   obj->AddProperty("type", "ClassHeapStats");
@@ -271,6 +296,8 @@
     old_stats.AddValue64(accumulated.old_size + recent.old_size -
                          last_reset.old_size);
   }
+  obj->AddProperty("promotedInstances", promoted_count);
+  obj->AddProperty("promotedBytes", promoted_size);
 }
 
 
@@ -342,6 +369,16 @@
 }
 
 
+void ClassTable::UpdatePromoted() {
+  for (intptr_t i = 0; i < kNumPredefinedCids; i++) {
+    predefined_class_heap_stats_table_[i].UpdatePromotedAfterNewGC();
+  }
+  for (intptr_t i = kNumPredefinedCids; i < top_; i++) {
+    class_heap_stats_table_[i].UpdatePromotedAfterNewGC();
+  }
+}
+
+
 void ClassTable::AllocationProfilePrintJSON(JSONStream* stream) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index a1ccbb1..f3a51a4 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -74,6 +74,9 @@
   AllocStats<int64_t> accumulated;
   // Snapshot of recent at the time of the last reset.
   AllocStats<intptr_t> last_reset;
+  // Promoted from new to old by last new GC.
+  intptr_t promoted_count;
+  intptr_t promoted_size;
 
   static intptr_t allocated_since_gc_new_space_offset() {
     return OFFSET_OF(ClassHeapStats, recent) +
@@ -96,14 +99,23 @@
   void ResetAtNewGC();
   void ResetAtOldGC();
   void ResetAccumulator();
+  void UpdatePromotedAfterNewGC();
   void UpdateSize(intptr_t instance_size);
   void PrintToJSONObject(const Class& cls, JSONObject* obj) const;
+
+ private:
+  // Recent old at start of last new GC (used to compute promoted_*).
+  intptr_t old_pre_new_gc_count_;
+  intptr_t old_pre_new_gc_size_;
 };
 
 
 class ClassTable {
  public:
   ClassTable();
+  // Create a copy of the original class table only, without copying any of the
+  // stats data.
+  explicit ClassTable(ClassTable* original);
   ~ClassTable();
 
   RawClass* At(intptr_t index) const {
@@ -146,6 +158,8 @@
   void ResetCountersOld();
   // Called whenever a new GC occurs.
   void ResetCountersNew();
+  // Called immediately after a new GC.
+  void UpdatePromoted();
 
   // Used by the generated code.
   uword PredefinedClassHeapStatsTableAddress() {
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0bde868..98d4682 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -894,6 +894,37 @@
 }
 
 
+// Handles a static call in unoptimized code that has one argument type not
+// seen before. Compile the target if necessary and update the ICData.
+// Arg0: argument.
+// Arg1: IC data object.
+DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerOneArg, 2) {
+  const Instance& arg = Instance::CheckedHandle(arguments.ArgAt(0));
+  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
+  // IC data for static call is prepopulated with the statically known target.
+  ASSERT(ic_data.NumberOfChecks() == 1);
+  const Function& target = Function::Handle(ic_data.GetTargetAt(0));
+  if (!target.HasCode()) {
+    const Error& error = Error::Handle(Compiler::CompileFunction(isolate,
+                                                                 target));
+    if (!error.IsNull()) {
+      Exceptions::PropagateError(error);
+    }
+  }
+  ASSERT(!target.IsNull() && target.HasCode());
+  ic_data.AddReceiverCheck(arg.GetClassId(), target, 1);
+  if (FLAG_trace_ic) {
+    DartFrameIterator iterator;
+    StackFrame* caller_frame = iterator.NextFrame();
+    ASSERT(caller_frame != NULL);
+    OS::PrintErr("StaticCallMissHandler at %#" Px
+                 " target %s (%" Pd ")\n",
+                 caller_frame->pc(), target.ToCString(), arg.GetClassId());
+  }
+  arguments.SetReturn(target);
+}
+
+
 // Handles a static call in unoptimized code that has two argument types not
 // seen before. Compile the target if necessary and update the ICData.
 // Arg0: argument 0.
@@ -1551,4 +1582,10 @@
   field.RecordStore(value);
 }
 
+
+DEFINE_RUNTIME_ENTRY(InitStaticField, 1) {
+  const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
+  field.EvaluateInitializer();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 6db04ed..9f88fbc 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -27,6 +27,7 @@
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerTwoArgs);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerThreeArgs);
+DECLARE_RUNTIME_ENTRY(StaticCallMissHandlerOneArg);
 DECLARE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs);
 DECLARE_RUNTIME_ENTRY(Instanceof);
 DECLARE_RUNTIME_ENTRY(TypeCheck);
@@ -46,6 +47,7 @@
 DECLARE_RUNTIME_ENTRY(TraceFunctionExit);
 DECLARE_RUNTIME_ENTRY(DeoptimizeMaterialize);
 DECLARE_RUNTIME_ENTRY(UpdateFieldCid);
+DECLARE_RUNTIME_ENTRY(InitStaticField);
 
 const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason);
 
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index 89fcc20..90c1360 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -509,7 +509,7 @@
   SequenceNode* node_seq = test->node_sequence();
   ArgumentListNode* arguments = new ArgumentListNode(kPos);
   arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
-  arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle()));
+  arguments->Add(new LiteralNode(kPos, Instance::ZoneHandle()));
   arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
   node_seq->Add(new ReturnNode(kPos,
                                new StaticCallNode(kPos, function, arguments)));
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 83500cd..b78f0c7 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -51,6 +51,8 @@
 DEFINE_FLAG(bool, print_flow_graph, false, "Print the IR flow graph.");
 DEFINE_FLAG(bool, print_flow_graph_optimized, false,
     "Print the IR flow graph when optimizing.");
+DEFINE_FLAG(bool, print_ic_data_map, false,
+    "Print the deopt-id to ICData map in optimizing compiler.");
 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis");
 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering.");
 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations.");
@@ -240,7 +242,6 @@
 }
 
 
-
 // Return false if bailed out.
 static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function,
                                         bool optimized,
@@ -289,6 +290,14 @@
           ASSERT(function.deoptimization_counter() <
                  FLAG_deoptimization_counter_threshold);
           function.RestoreICDataMap(ic_data_array);
+          if (FLAG_print_ic_data_map) {
+            for (intptr_t i = 0; i < ic_data_array->length(); i++) {
+              if ((*ic_data_array)[i] != NULL) {
+                OS::Print("%" Pd " ", i);
+                FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]);
+              }
+            }
+          }
         }
 
         // Build the flow graph.
@@ -402,12 +411,24 @@
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
         }
 
+        // Optimistically convert loop phis that have a single non-smi input
+        // coming from the loop pre-header into smi-phis.
+        if (FLAG_loop_invariant_code_motion) {
+          LICM licm(flow_graph);
+          licm.OptimisticallySpecializeSmiPhis();
+          DEBUG_ASSERT(flow_graph->VerifyUseLists());
+        }
+
         // Propagate types and eliminate even more type tests.
         // Recompute types after constant propagation to infer more precise
         // types for uses that were previously reached by now eliminated phis.
         FlowGraphTypePropagator::Propagate(flow_graph);
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
+        // Where beneficial convert Smi operations into Int32 operations.
+        // Only meanigful for 32bit platforms right now.
+        optimizer.WidenSmiToInt32();
+
         // Unbox doubles. Performed after constant propagation to minimize
         // interference from phis merging double values and tagged
         // values coming from dead paths.
@@ -929,6 +950,39 @@
 }
 
 
+RawObject* Compiler::EvaluateStaticInitializer(const Field& field) {
+  ASSERT(field.is_static());
+  // The VM sets the field's value to transiton_sentinel prior to
+  // evaluating the initializer value.
+  ASSERT(field.value() == Object::transition_sentinel().raw());
+  Isolate* isolate = Isolate::Current();
+  StackZone zone(isolate);
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    ParsedFunction* parsed_function =
+        Parser::ParseStaticFieldInitializer(field);
+
+    parsed_function->AllocateVariables();
+    // Non-optimized code generator.
+    CompileParsedFunctionHelper(parsed_function, false, Isolate::kNoDeoptId);
+
+    // Invoke the function to evaluate the expression.
+    const Function& initializer = parsed_function->function();
+    const Object& result = Object::Handle(
+        DartEntry::InvokeFunction(initializer, Object::empty_array()));
+    return result.raw();
+  } else {
+    const Error& error =
+        Error::Handle(isolate, isolate->object_store()->sticky_error());
+    isolate->object_store()->clear_sticky_error();
+    return error.raw();
+  }
+  UNREACHABLE();
+  return Object::null();
+}
+
+
+
 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) {
   Isolate* isolate = Isolate::Current();
   LongJumpScope jump;
@@ -959,7 +1013,7 @@
     // Manually generated AST, do not recompile.
     func.SetIsOptimizable(false);
 
-    // We compile the function here, even though InvokeStatic() below
+    // We compile the function here, even though InvokeFunction() below
     // would compile func automatically. We are checking fewer invariants
     // here.
     ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
diff --git a/runtime/vm/compiler.h b/runtime/vm/compiler.h
index 5185b63..48af3cb 100644
--- a/runtime/vm/compiler.h
+++ b/runtime/vm/compiler.h
@@ -63,6 +63,12 @@
   // on compilation failure.
   static RawObject* ExecuteOnce(SequenceNode* fragment);
 
+  // Evaluates the initializer expression of the given static field.
+  //
+  // The return value is either a RawInstance on success or a RawError
+  // on compilation failure.
+  static RawObject* EvaluateStaticInitializer(const Field& field);
+
   // Eagerly compiles all functions in a class.
   //
   // Returns Error::null() if there is no compilation error.
diff --git a/runtime/vm/coverage_test.cc b/runtime/vm/coverage_test.cc
index 0d2f775..c4c62e1 100644
--- a/runtime/vm/coverage_test.cc
+++ b/runtime/vm/coverage_test.cc
@@ -51,7 +51,7 @@
   OS::SNPrint(buf, sizeof(buf),
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd  "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[]}", lib.index());
   EXPECT_SUBSTRING(buf, js.ToCString());
 }
@@ -88,7 +88,7 @@
   OS::SNPrint(buf, sizeof(buf),
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", lib.index());
   EXPECT_SUBSTRING(buf, js.ToCString());
 
@@ -96,7 +96,7 @@
   OS::SNPrint(buf, sizeof(buf),
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd  "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[10,1,11,1]}", lib.index());
   EXPECT_SUBSTRING(buf, js.ToCString());
 }
@@ -134,7 +134,7 @@
   OS::SNPrint(buf, sizeof(buf),
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[6,0]}", lib.index());
   EXPECT_SUBSTRING(buf, js.ToCString());
 }
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index e775b34..ebb68e8 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -69,6 +69,7 @@
 bool HostCPUFeatures::hardfp_supported_ = false;
 const char* HostCPUFeatures::hardware_ = NULL;
 ARMVersion HostCPUFeatures::arm_version_ = ARMvUnknown;
+intptr_t HostCPUFeatures::store_pc_read_offset_ = 8;
 #if defined(DEBUG)
 bool HostCPUFeatures::initialized_ = false;
 #endif
@@ -83,12 +84,23 @@
   vfp_supported_ = CpuInfo::FieldContains(kCpuInfoFeatures, "vfp") &&
                    FLAG_use_vfp;
 
-  // Check for ARMv5, ARMv6 or ARMv7. It can be in either the Processor or
+  // Check for ARMv5TE, ARMv6 or ARMv7. It can be in either the Processor or
   // Model information fields.
   if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARM926EJ-S") ||
       CpuInfo::FieldContains(kCpuInfoModel, "ARM926EJ-S")) {
     // Lego Mindstorm EV3.
     arm_version_ = ARMv5TE;
+    // On ARMv5, the PC read offset in an STR or STM instruction is either 8 or
+    // 12 bytes depending on the implementation. On the Mindstorm EV3 it is 12
+    // bytes.
+    store_pc_read_offset_ = 12;
+  } else if (CpuInfo::FieldContains(kCpuInfoProcessor, "Feroceon 88FR131") ||
+             CpuInfo::FieldContains(kCpuInfoModel, "Feroceon 88FR131")) {
+    // This is for the DGBox. For the time-being, assume it is similar to the
+    // Lego Mindstorm.
+    arm_version_ = ARMv5TE;
+    // TODO(zra): Verify with DGLogik that this is correct.
+    store_pc_read_offset_ = 12;
   } else if (CpuInfo::FieldContains(kCpuInfoProcessor, "ARMv6") ||
              CpuInfo::FieldContains(kCpuInfoModel, "ARMv6")) {
     // Raspberry Pi, etc.
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index 6bc301e..e1dd907 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -53,6 +53,10 @@
     DEBUG_ASSERT(initialized_);
     return arm_version_;
   }
+  static intptr_t store_pc_read_offset() {
+    DEBUG_ASSERT(initialized_);
+    return store_pc_read_offset_;
+  }
 
 #if !defined(HOST_ARCH_ARM)
   static void set_integer_division_supported(bool supported) {
@@ -80,6 +84,7 @@
   static bool neon_supported_;
   static bool hardfp_supported_;
   static ARMVersion arm_version_;
+  static intptr_t store_pc_read_offset_;
 #if defined(DEBUG)
   static bool initialized_;
 #endif
@@ -102,6 +107,9 @@
   static bool vfp_supported() {
     return HostCPUFeatures::vfp_supported();
   }
+  static bool can_divide() {
+    return integer_division_supported() || vfp_supported();
+  }
   static bool neon_supported() {
     return HostCPUFeatures::neon_supported();
   }
@@ -114,6 +122,9 @@
   static ARMVersion arm_version() {
     return HostCPUFeatures::arm_version();
   }
+  static intptr_t store_pc_read_offset() {
+    return HostCPUFeatures::store_pc_read_offset();
+  }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index d5a1740..84f3908 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -13,6 +13,7 @@
 #include "vm/handles.h"
 #include "vm/heap.h"
 #include "vm/isolate.h"
+#include "vm/metrics.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/object_id_ring.h"
@@ -108,6 +109,7 @@
   ThreadInterrupter::InitOnce();
   Profiler::InitOnce();
   SemiSpace::InitOnce();
+  Metric::InitOnce();
 
 #if defined(USING_SIMULATOR)
   Simulator::InitOnce();
@@ -243,7 +245,10 @@
     }
     SnapshotReader reader(snapshot->content(), snapshot->length(),
                           Snapshot::kFull, isolate);
-    reader.ReadFullSnapshot();
+    const Error& error = Error::Handle(reader.ReadFullSnapshot());
+    if (!error.IsNull()) {
+      return error.raw();
+    }
     if (FLAG_trace_isolates) {
       isolate->heap()->PrintSizes();
       isolate->megamorphic_cache_table()->PrintSizes();
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 2061df6..55b31e8 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -4882,10 +4882,9 @@
                         snapshot->length(),
                         snapshot->kind(),
                         isolate);
-  const Object& tmp = Object::Handle(isolate, reader.ReadObject());
-  if (!tmp.IsLibrary()) {
-    return Api::NewError("%s: Unable to deserialize snapshot correctly.",
-                         CURRENT_FUNC);
+  const Object& tmp = Object::Handle(isolate, reader.ReadScriptSnapshot());
+  if (tmp.IsError()) {
+    return Api::NewHandle(isolate, tmp.raw());
   }
   library ^= tmp.raw();
   library.set_debuggable(true);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 77f7694..9fe96ae 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -7192,7 +7192,7 @@
   // Tell the other thread that shared_isolate is created.
   Dart_Handle lib;
   {
-    sync->Enter();
+    MonitorLocker ml(sync);
     char* error = NULL;
     shared_isolate = Dart_CreateIsolate(NULL, NULL,
                                         bin::snapshot_buffer,
@@ -7211,8 +7211,7 @@
         Dart_SetNativeResolver(lib, &IsolateInterruptTestNativeLookup, NULL);
     DART_CHECK_VALID(result);
 
-    sync->Notify();
-    sync->Exit();
+    ml.Notify();
   }
 
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
@@ -7224,12 +7223,12 @@
   Dart_ExitScope();
   Dart_ShutdownIsolate();
 
-  // Tell the other thread that we are done (don't use MonitorLocker
-  // as there is no current isolate any more).
-  sync->Enter();
-  shared_isolate = NULL;
-  sync->Notify();
-  sync->Exit();
+  // Tell the other thread that we are done.
+  {
+    MonitorLocker ml(sync);
+    shared_isolate = NULL;
+    ml.Notify();
+  }
 }
 
 
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 7a5ce32..129b927 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -38,6 +38,32 @@
 }
 
 
+class ScopedIsolateStackLimits : public ValueObject {
+ public:
+  explicit ScopedIsolateStackLimits(Isolate* isolate)
+      : isolate_(isolate) {
+    ASSERT(isolate_ != NULL);
+    ASSERT(isolate_ == Isolate::Current());
+    uword stack_base = reinterpret_cast<uword>(this);
+    if (stack_base >= isolate_->stack_base()) {
+      isolate_->SetStackLimitFromStackBase(stack_base);
+    }
+  }
+
+  ~ScopedIsolateStackLimits() {
+    ASSERT(isolate_ == Isolate::Current());
+    uword stack_base = reinterpret_cast<uword>(this);
+    if (isolate_->stack_base() == stack_base) {
+      // Bottomed out.
+      isolate_->ClearStackLimit();
+    }
+  }
+
+ private:
+  Isolate* isolate_;
+};
+
+
 RawObject* DartEntry::InvokeFunction(const Function& function,
                                      const Array& arguments,
                                      const Array& arguments_descriptor,
@@ -59,6 +85,7 @@
   const Code& code = Code::Handle(isolate, function.CurrentCode());
   ASSERT(!code.IsNull());
   ASSERT(Isolate::Current()->no_callback_scope_depth() == 0);
+  ScopedIsolateStackLimits stack_limit(isolate);
 #if defined(USING_SIMULATOR)
 #if defined(ARCH_IS_64_BIT)
   // TODO(zra): Change to intptr_t so we have only one case.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 1ed3383..cb3ecd3 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1176,18 +1176,17 @@
 }
 
 
-void Debugger::SetInternalBreakpoints(const Function& target_function) {
+RawError* Debugger::SetInternalBreakpoints(const Function& target_function) {
   if (target_function.is_native()) {
-    // Can't instrument native functions.
-    return;
+    // Can't instrument native functions. Fail silently.
+    return Error::null();
   }
   Isolate* isolate = Isolate::Current();
   if (!target_function.HasCode()) {
-    Compiler::CompileFunction(isolate, target_function);
-    // If there were any errors, ignore them silently and return without
-    // adding breakpoints to target.
-    if (!target_function.HasCode()) {
-      return;
+    const Error& error = Error::Handle(
+        Compiler::CompileFunction(isolate, target_function));
+    if (!error.IsNull()) {
+      return error.raw();
     }
   }
   // Hang on to the code object before deoptimizing, in case deoptimization
@@ -1213,6 +1212,7 @@
       bpt->Enable();
     }
   }
+  return Error::null();
 }
 
 
@@ -1700,7 +1700,6 @@
   if ((kind == RawFunction::kImplicitGetter) ||
       (kind == RawFunction::kImplicitSetter) ||
       (kind == RawFunction::kImplicitStaticFinalGetter) ||
-      (kind == RawFunction::kStaticInitializer) ||
       (kind == RawFunction::kMethodExtractor) ||
       (kind == RawFunction::kNoSuchMethodDispatcher) ||
       (kind == RawFunction::kInvokeFieldDispatcher) ||
@@ -1872,13 +1871,15 @@
 }
 
 
-void Debugger::OneTimeBreakAtEntry(const Function& target_function) {
-  SetInternalBreakpoints(target_function);
-  if (target_function.HasImplicitClosureFunction()) {
+RawError* Debugger::OneTimeBreakAtEntry(const Function& target_function) {
+  Error& err = Error::Handle();
+  err = SetInternalBreakpoints(target_function);
+  if (err.IsNull() && target_function.HasImplicitClosureFunction()) {
     const Function& closure_func =
         Function::Handle(target_function.ImplicitClosureFunction());
-    SetInternalBreakpoints(closure_func);
+    err = SetInternalBreakpoints(closure_func);
   }
+  return err.raw();
 }
 
 
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 90dd1c0..7cb2f3a 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -354,7 +354,7 @@
   // TODO(turnidge): script_url may no longer be specific enough.
   SourceBreakpoint* SetBreakpointAtLine(const String& script_url,
                                         intptr_t line_number);
-  void OneTimeBreakAtEntry(const Function& target_function);
+  RawError* OneTimeBreakAtEntry(const Function& target_function);
 
   void RemoveBreakpoint(intptr_t bp_id);
   SourceBreakpoint* GetBreakpointById(intptr_t id);
@@ -458,7 +458,7 @@
                                 intptr_t requested_token_pos,
                                 intptr_t last_token_pos);
   void DeoptimizeWorld();
-  void SetInternalBreakpoints(const Function& target_function);
+  RawError* SetInternalBreakpoints(const Function& target_function);
   SourceBreakpoint* SetBreakpoint(const Script& script,
                                   intptr_t token_pos,
                                   intptr_t last_token_pos);
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 1822de7..62d99a4 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -450,7 +450,11 @@
                          function_name.ToCString());
   }
 
-  debugger->OneTimeBreakAtEntry(bp_target);
+  const Error& error =
+      Error::Handle(isolate, debugger->OneTimeBreakAtEntry(bp_target));
+  if (!error.IsNull()) {
+    return Api::NewHandle(isolate, error.raw());
+  }
   return Api::Success();
 }
 
diff --git a/runtime/vm/debugger_test.cc b/runtime/vm/debugger_test.cc
index e53f291..35dbcab 100644
--- a/runtime/vm/debugger_test.cc
+++ b/runtime/vm/debugger_test.cc
@@ -74,14 +74,14 @@
         "\"location\":{\"type\":\"Location\","
         "\"script\":{\"type\":\"@Script\","
         "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-        "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+        "\"name\":\"test-lib\","
         "\"kind\":\"script\"},\"tokenPos\":14}},"
         "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\","
         "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false,"
         "\"location\":{\"type\":\"Location\","
         "\"script\":{\"type\":\"@Script\","
         "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-        "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+        "\"name\":\"test-lib\","
         "\"kind\":\"script\"},\"tokenPos\":5}}]",
         vmlib.index(), vmlib.index());
   }
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 99aac37..ed6467f 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -185,42 +185,19 @@
 static bool IsObjectInstruction(DeoptInstr::Kind kind) {
   switch (kind) {
     case DeoptInstr::kConstant:
-    case DeoptInstr::kStackSlot:
-    case DeoptInstr::kDoubleStackSlot:
-    case DeoptInstr::kMintStackSlotPair:
-    case DeoptInstr::kFloat32x4StackSlot:
-    case DeoptInstr::kInt32x4StackSlot:
-    case DeoptInstr::kFloat64x2StackSlot:
     case DeoptInstr::kPp:
     case DeoptInstr::kCallerPp:
     case DeoptInstr::kMaterializedObjectRef:
+    case DeoptInstr::kFloat32x4:
+    case DeoptInstr::kInt32x4:
+    case DeoptInstr::kFloat64x2:
+    case DeoptInstr::kWord:
+    case DeoptInstr::kDouble:
+    case DeoptInstr::kMintPair:
+    case DeoptInstr::kInt32:
+    case DeoptInstr::kUint32:
       return true;
 
-    case DeoptInstr::kRegister:
-    case DeoptInstr::kFpuRegister:
-    case DeoptInstr::kMintRegisterPair:
-    case DeoptInstr::kMintStackSlotRegister:
-    case DeoptInstr::kFloat32x4FpuRegister:
-    case DeoptInstr::kInt32x4FpuRegister:
-    case DeoptInstr::kFloat64x2FpuRegister:
-      // TODO(turnidge): Sometimes we encounter a deopt instruction
-      // with a register source while deoptimizing frames during
-      // debugging but we haven't saved our register set.  This
-      // happens specifically when using the VMService to inspect the
-      // stack.  In that case, the register values will have been
-      // saved before the StackOverflow runtime call but we do not
-      // actually keep track of which registers were saved and
-      // restored.
-      //
-      // It is possible to save this information at the point of the
-      // StackOverflow runtime call but would require a bit of magic
-      // to either make sure that the registers are pushed on the
-      // stack in a predictable fashion or that we save enough
-      // information to recover them after the fact.
-      //
-      // For now, we punt on these instructions.
-      return false;
-
     case DeoptInstr::kRetAddress:
     case DeoptInstr::kPcMarker:
     case DeoptInstr::kCallerFp:
@@ -370,169 +347,6 @@
 }
 
 
-// Deoptimization instruction moving value from optimized frame at
-// 'source_index' to specified slots in the unoptimized frame.
-// 'source_index' represents the slot index of the frame (0 being
-// first argument) and accounts for saved return address, frame
-// pointer, pool pointer and pc marker.
-class DeoptStackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptStackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kStackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "s%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    intptr_t* source_addr =
-        deopt_context->GetSourceFrameAddressAt(source_index);
-    *dest_addr = *source_addr;
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptStackSlotInstr);
-};
-
-
-class DeoptDoubleStackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptDoubleStackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kDoubleStackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "ds%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    double* source_addr = reinterpret_cast<double*>(
-        deopt_context->GetSourceFrameAddressAt(source_index));
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferDoubleMaterialization(
-        *source_addr, reinterpret_cast<RawDouble**>(dest_addr));
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptDoubleStackSlotInstr);
-};
-
-
-class DeoptFloat32x4StackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptFloat32x4StackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kFloat32x4StackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "f32x4s%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
-        deopt_context->GetSourceFrameAddressAt(source_index));
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferFloat32x4Materialization(
-        *source_addr, reinterpret_cast<RawFloat32x4**>(dest_addr));
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptFloat32x4StackSlotInstr);
-};
-
-
-class DeoptFloat64x2StackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptFloat64x2StackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kFloat64x2StackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "f64x2s%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
-        deopt_context->GetSourceFrameAddressAt(source_index));
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferFloat64x2Materialization(
-        *source_addr, reinterpret_cast<RawFloat64x2**>(dest_addr));
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptFloat64x2StackSlotInstr);
-};
-
-
-class DeoptInt32x4StackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptInt32x4StackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kInt32x4StackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "ui32x4s%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    simd128_value_t* source_addr = reinterpret_cast<simd128_value_t*>(
-        deopt_context->GetSourceFrameAddressAt(source_index));
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferInt32x4Materialization(
-        *source_addr, reinterpret_cast<RawInt32x4**>(dest_addr));
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptInt32x4StackSlotInstr);
-};
-
-
 // Deoptimization instruction creating return address using function and
 // deopt-id stored at 'object_table_index'.
 class DeoptRetAddressInstr : public DeoptInstr {
@@ -555,9 +369,9 @@
 
   virtual DeoptInstr::Kind kind() const { return kRetAddress; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "ret oti:%" Pd "(%" Pd ")", object_table_index_, deopt_id_);
+        "%" Pd ", %" Pd "", object_table_index_, deopt_id_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -611,9 +425,9 @@
   virtual intptr_t source_index() const { return object_table_index_; }
   virtual DeoptInstr::Kind kind() const { return kConstant; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "const oti:%" Pd "", object_table_index_);
+        "%" Pd "", object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -629,417 +443,176 @@
 };
 
 
+// Deoptimization instruction moving value from optimized frame at
+// 'source_index' to specified slots in the unoptimized frame.
+// 'source_index' represents the slot index of the frame (0 being
+// first argument) and accounts for saved return address, frame
+// pointer, pool pointer and pc marker.
 // Deoptimization instruction moving a CPU register.
-class DeoptRegisterInstr: public DeoptInstr {
+class DeoptWordInstr: public DeoptInstr {
  public:
-  explicit DeoptRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<Register>(reg_as_int)) {}
+  explicit DeoptWordInstr(intptr_t source_index)
+      : source_(source_index) {}
 
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kRegister; }
+  explicit DeoptWordInstr(const CpuRegisterSource& source)
+      : source_(source) {}
 
-  virtual const char* ToCString() const {
-    return Assembler::RegisterName(reg_);
+  virtual intptr_t source_index() const { return source_.source_index(); }
+  virtual DeoptInstr::Kind kind() const { return kWord; }
+
+  virtual const char* ArgumentsToCString() const {
+    return source_.ToCString();
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    *dest_addr = deopt_context->RegisterValue(reg_);
+    *dest_addr = source_.Value<intptr_t>(deopt_context);
   }
 
  private:
-  const Register reg_;
+  const CpuRegisterSource source_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptRegisterInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptWordInstr);
 };
 
 
-// Deoptimization instruction moving an XMM register.
-class DeoptFpuRegisterInstr: public DeoptInstr {
+class DeoptIntegerInstrBase: public DeoptInstr {
  public:
-  explicit DeoptFpuRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
-
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kFpuRegister; }
-
-  virtual const char* ToCString() const {
-    return Assembler::FpuRegisterName(reg_);
-  }
+  DeoptIntegerInstrBase() { }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    double value = deopt_context->FpuRegisterValue(reg_);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferDoubleMaterialization(
-        value, reinterpret_cast<RawDouble**>(dest_addr));
-  }
-
- private:
-  const FpuRegister reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptFpuRegisterInstr);
-};
-
-
-class DeoptMintRegisterPairInstr: public DeoptInstr {
- public:
-  DeoptMintRegisterPairInstr(intptr_t lo_reg_as_int, intptr_t hi_reg_as_int)
-      : lo_reg_(static_cast<Register>(lo_reg_as_int)),
-        hi_reg_(static_cast<Register>(hi_reg_as_int)) {}
-
-  virtual intptr_t source_index() const {
-    return EncodeRegisters(static_cast<intptr_t>(lo_reg_),
-                           static_cast<intptr_t>(hi_reg_));
-  }
-  virtual DeoptInstr::Kind kind() const { return kMintRegisterPair; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "int64 register pair: %s,%s", Assembler::RegisterName(hi_reg_),
-                                      Assembler::RegisterName(lo_reg_));
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    uint32_t lo_value = deopt_context->RegisterValue(lo_reg_);
-    int32_t hi_value = deopt_context->RegisterValue(hi_reg_);
-    int64_t value = Utils::LowHighTo64Bits(lo_value, hi_value);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
+    const int64_t value = GetValue(deopt_context);
     if (Smi::IsValid(value)) {
-      *dest_addr = reinterpret_cast<intptr_t>(
-          Smi::New(static_cast<intptr_t>(value)));
+      *dest_addr = Smi::RawValue(static_cast<intptr_t>(value));
     } else {
+      *dest_addr = Smi::RawValue(0);
       deopt_context->DeferMintMaterialization(
           value, reinterpret_cast<RawMint**>(dest_addr));
     }
   }
 
+  virtual int64_t GetValue(DeoptContext* deopt_context) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DeoptIntegerInstrBase);
+};
+
+
+class DeoptMintPairInstr: public DeoptIntegerInstrBase {
+ public:
+  explicit DeoptMintPairInstr(intptr_t source_index)
+      : DeoptIntegerInstrBase(),
+        lo_(LoRegister::decode(source_index)),
+        hi_(HiRegister::decode(source_index)) {
+  }
+
+  DeoptMintPairInstr(const CpuRegisterSource& lo, const CpuRegisterSource& hi)
+      : DeoptIntegerInstrBase(), lo_(lo), hi_(hi) {}
+
+  virtual intptr_t source_index() const {
+    return LoRegister::encode(lo_.source_index()) |
+           HiRegister::encode(hi_.source_index());
+  }
+  virtual DeoptInstr::Kind kind() const { return kMintPair; }
+
+  virtual const char* ArgumentsToCString() const {
+    return Isolate::Current()->current_zone()->PrintToString(
+        "%s,%s",
+        lo_.ToCString(),
+        hi_.ToCString());
+  }
+
+  virtual int64_t GetValue(DeoptContext* deopt_context) {
+    return Utils::LowHighTo64Bits(
+        lo_.Value<uint32_t>(deopt_context), hi_.Value<int32_t>(deopt_context));
+  }
+
+ private:
   static const intptr_t kFieldWidth = kBitsPerWord / 2;
   class LoRegister : public BitField<intptr_t, 0, kFieldWidth> { };
   class HiRegister : public BitField<intptr_t, kFieldWidth, kFieldWidth> { };
-  static intptr_t EncodeRegisters(intptr_t lo_reg_as_int,
-                                  intptr_t hi_reg_as_int) {
-    return LoRegister::encode(lo_reg_as_int) |
-           HiRegister::encode(hi_reg_as_int);
-  }
 
-  static intptr_t DecodeLoRegister(intptr_t v) {
-    return LoRegister::decode(v);
-  }
+  const CpuRegisterSource lo_;
+  const CpuRegisterSource hi_;
 
-  static intptr_t DecodeHiRegister(intptr_t v) {
-    return HiRegister::decode(v);
-  }
-
- private:
-  const Register lo_reg_;
-  const Register hi_reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptMintRegisterPairInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptMintPairInstr);
 };
 
 
-class DeoptMintStackSlotPairInstr: public DeoptInstr {
+template<DeoptInstr::Kind K, typename T>
+class DeoptIntInstr : public DeoptIntegerInstrBase {
  public:
-  DeoptMintStackSlotPairInstr(intptr_t lo_slot, intptr_t hi_slot)
-      : lo_slot_(static_cast<Register>(lo_slot)),
-        hi_slot_(static_cast<Register>(hi_slot)) {}
-
-  virtual intptr_t source_index() const {
-    return EncodeSlots(static_cast<intptr_t>(lo_slot_),
-                       static_cast<intptr_t>(hi_slot_));
+  explicit DeoptIntInstr(intptr_t source_index)
+      : DeoptIntegerInstrBase(), source_(source_index) {
   }
-  virtual DeoptInstr::Kind kind() const { return kMintStackSlotPair; }
 
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "int64 stack slots: %" Pd", %" Pd "", lo_slot_, hi_slot_);
+  explicit DeoptIntInstr(const CpuRegisterSource& source)
+      : DeoptIntegerInstrBase(), source_(source) {
+  }
+
+  virtual intptr_t source_index() const { return source_.source_index(); }
+  virtual DeoptInstr::Kind kind() const { return K; }
+
+  virtual const char* ArgumentsToCString() const {
+    return source_.ToCString();
+  }
+
+  virtual int64_t GetValue(DeoptContext* deopt_context) {
+    return static_cast<int64_t>(source_.Value<T>(deopt_context));
+  }
+
+ private:
+  const CpuRegisterSource source_;
+
+  DISALLOW_COPY_AND_ASSIGN(DeoptIntInstr);
+};
+
+
+typedef DeoptIntInstr<DeoptInstr::kUint32, uint32_t> DeoptUint32Instr;
+typedef DeoptIntInstr<DeoptInstr::kInt32, int32_t> DeoptInt32Instr;
+
+
+template<DeoptInstr::Kind K,
+         typename Type,
+         typename RawObjectType>
+class DeoptFpuInstr: public DeoptInstr {
+ public:
+  explicit DeoptFpuInstr(intptr_t source_index)
+      : source_(source_index) {}
+
+  explicit DeoptFpuInstr(const FpuRegisterSource& source)
+      : source_(source) {}
+
+  virtual intptr_t source_index() const { return source_.source_index(); }
+  virtual DeoptInstr::Kind kind() const { return K; }
+
+  virtual const char* ArgumentsToCString() const {
+    return source_.ToCString();
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t lo_source_index =
-        deopt_context->source_frame_size() - lo_slot_ - 1;
-    int32_t* lo_source_addr = reinterpret_cast<int32_t*>(
-        deopt_context->GetSourceFrameAddressAt(lo_source_index));
-    intptr_t hi_source_index =
-       deopt_context->source_frame_size() - hi_slot_ - 1;
-    int32_t* hi_source_addr = reinterpret_cast<int32_t*>(
-        deopt_context->GetSourceFrameAddressAt(hi_source_index));
-    int64_t value = Utils::LowHighTo64Bits(*lo_source_addr, *hi_source_addr);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid(value)) {
-      *dest_addr = reinterpret_cast<intptr_t>(
-          Smi::New(static_cast<intptr_t>(value)));
-    } else {
-      deopt_context->DeferMintMaterialization(
-          value, reinterpret_cast<RawMint**>(dest_addr));
-    }
-  }
-
-  static const intptr_t kFieldWidth = kBitsPerWord / 2;
-  class LoSlot : public BitField<intptr_t, 0, kFieldWidth> { };
-  class HiSlot : public BitField<intptr_t, kFieldWidth, kFieldWidth> { };
-  static intptr_t EncodeSlots(intptr_t lo_slot,
-                              intptr_t hi_slot) {
-    return LoSlot::encode(lo_slot) |
-           HiSlot::encode(hi_slot);
-  }
-
-  static intptr_t DecodeLoSlot(intptr_t v) {
-    return LoSlot::decode(v);
-  }
-
-  static intptr_t DecodeHiSlot(intptr_t v) {
-    return HiSlot::decode(v);
+    *dest_addr = Smi::RawValue(0);
+    deopt_context->DeferMaterialization(
+        source_.Value<Type>(deopt_context),
+        reinterpret_cast<RawObjectType**>(dest_addr));
   }
 
  private:
-  const intptr_t lo_slot_;
-  const intptr_t hi_slot_;
+  const FpuRegisterSource source_;
 
-  DISALLOW_COPY_AND_ASSIGN(DeoptMintStackSlotPairInstr);
+  DISALLOW_COPY_AND_ASSIGN(DeoptFpuInstr);
 };
 
+typedef DeoptFpuInstr<DeoptInstr::kDouble, double, RawDouble> DeoptDoubleInstr;
 
-class DeoptMintStackSlotRegisterInstr : public DeoptInstr {
- public:
-  DeoptMintStackSlotRegisterInstr(intptr_t source_index,
-                                  intptr_t reg_as_int,
-                                  bool flip)
-      : slot_(source_index),
-        reg_(static_cast<Register>(reg_as_int)),
-        flip_(flip) {
-    // when flip_ is false, stack slot is low bits and reg is high bits.
-    // when flip_ is true, stack slot is high bits and reg is low bits.
-  }
-
-  virtual intptr_t source_index() const {
-    return Encode(static_cast<intptr_t>(slot_),
-                  static_cast<intptr_t>(reg_),
-                  flip_ ? 1 : 0);
-  }
-  virtual DeoptInstr::Kind kind() const { return kMintStackSlotRegister; }
-
-  virtual const char* ToCString() const {
-    if (flip_) {
-      return Isolate::Current()->current_zone()->PrintToString(
-          "int64 reg: %s, stack slot:  %" Pd "", Assembler::RegisterName(reg_),
-                                                 slot_);
-    } else {
-      return Isolate::Current()->current_zone()->PrintToString(
-          "int64 stack slot: %" Pd", reg: %s", slot_,
-                                               Assembler::RegisterName(reg_));
-    }
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t slot_source_index =
-        deopt_context->source_frame_size() - slot_ - 1;
-    int32_t* slot_source_addr = reinterpret_cast<int32_t*>(
-        deopt_context->GetSourceFrameAddressAt(slot_source_index));
-    int32_t slot_value = *slot_source_addr;
-    int32_t reg_value = deopt_context->RegisterValue(reg_);
-    int64_t value;
-    if (flip_) {
-      value = Utils::LowHighTo64Bits(reg_value, slot_value);
-    } else {
-      value = Utils::LowHighTo64Bits(slot_value, reg_value);
-    }
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid(value)) {
-      *dest_addr = reinterpret_cast<intptr_t>(
-          Smi::New(static_cast<intptr_t>(value)));
-    } else {
-      deopt_context->DeferMintMaterialization(
-          value, reinterpret_cast<RawMint**>(dest_addr));
-    }
-  }
-
-  static const intptr_t kFieldWidth = kBitsPerWord / 2;
-  class Slot : public BitField<intptr_t, 0, kFieldWidth> { };
-  class Reg : public BitField<intptr_t, kFieldWidth, kFieldWidth - 1> { };
-  // 1 bit for the flip.
-  class Flip : public BitField<intptr_t, kFieldWidth * 2 - 1, 1> { };
-
-  static intptr_t Encode(intptr_t slot,
-                         intptr_t reg_as_int,
-                         bool flip) {
-    return Slot::encode(slot) |
-           Reg::encode(reg_as_int) |
-           Flip::encode(flip ? 1 : 0);
-  }
-
-  static intptr_t DecodeSlot(intptr_t v) {
-    return Slot::decode(v);
-  }
-
-  static intptr_t DecodeReg(intptr_t v) {
-    return Reg::decode(v);
-  }
-
-  static bool DecodeFlip(intptr_t v) {
-    return Flip::decode(v);
-  }
-
- private:
-  const intptr_t slot_;
-  const Register reg_;
-  const bool flip_;
-  DISALLOW_COPY_AND_ASSIGN(DeoptMintStackSlotRegisterInstr);
-};
-
-
-class DeoptUint32RegisterInstr: public DeoptInstr {
- public:
-  explicit DeoptUint32RegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<Register>(reg_as_int)) {}
-
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kUint32Register; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "uint32 %s", Assembler::RegisterName(reg_));
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    uint32_t low = static_cast<uint32_t>(deopt_context->RegisterValue(reg_));
-    int64_t value = Utils::LowHighTo64Bits(low, 0);
-    if (Smi::IsValid(value)) {
-      *dest_addr = reinterpret_cast<intptr_t>(
-          Smi::New(static_cast<intptr_t>(value)));
-    } else {
-      *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-      deopt_context->DeferMintMaterialization(
-          value, reinterpret_cast<RawMint**>(dest_addr));
-    }
-  }
-
- private:
-  const Register reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptUint32RegisterInstr);
-};
-
-
-class DeoptUint32StackSlotInstr : public DeoptInstr {
- public:
-  explicit DeoptUint32StackSlotInstr(intptr_t source_index)
-      : stack_slot_index_(source_index) {
-    ASSERT(stack_slot_index_ >= 0);
-  }
-
-  virtual intptr_t source_index() const { return stack_slot_index_; }
-  virtual DeoptInstr::Kind kind() const { return kUint32StackSlot; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "uint32 s%" Pd "", stack_slot_index_);
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    intptr_t source_index =
-       deopt_context->source_frame_size() - stack_slot_index_ - 1;
-    uint32_t* source_addr = reinterpret_cast<uint32_t*>(
-        deopt_context->GetSourceFrameAddressAt(source_index));
-    int64_t value = Utils::LowHighTo64Bits(*source_addr, 0);
-    if (Smi::IsValid(value)) {
-      *dest_addr = reinterpret_cast<intptr_t>(
-          Smi::New(static_cast<intptr_t>(value)));
-    } else {
-      *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-      deopt_context->DeferMintMaterialization(
-          value, reinterpret_cast<RawMint**>(dest_addr));
-    }
-  }
-
- private:
-  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptUint32StackSlotInstr);
-};
-
-
-// Deoptimization instruction moving an XMM register.
-class DeoptFloat32x4FpuRegisterInstr: public DeoptInstr {
- public:
-  explicit DeoptFloat32x4FpuRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
-
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kFloat32x4FpuRegister; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "%s(f32x4)", Assembler::FpuRegisterName(reg_));
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferFloat32x4Materialization(
-        value, reinterpret_cast<RawFloat32x4**>(dest_addr));
-  }
-
- private:
-  const FpuRegister reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptFloat32x4FpuRegisterInstr);
-};
-
-
-class DeoptFloat64x2FpuRegisterInstr: public DeoptInstr {
- public:
-  explicit DeoptFloat64x2FpuRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
-
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kFloat64x2FpuRegister; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "%s(f64x2)", Assembler::FpuRegisterName(reg_));
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferFloat64x2Materialization(
-        value, reinterpret_cast<RawFloat64x2**>(dest_addr));
-  }
-
- private:
-  const FpuRegister reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptFloat64x2FpuRegisterInstr);
-};
-
-
-// Deoptimization instruction moving an XMM register.
-class DeoptInt32x4FpuRegisterInstr: public DeoptInstr {
- public:
-  explicit DeoptInt32x4FpuRegisterInstr(intptr_t reg_as_int)
-      : reg_(static_cast<FpuRegister>(reg_as_int)) {}
-
-  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
-  virtual DeoptInstr::Kind kind() const { return kInt32x4FpuRegister; }
-
-  virtual const char* ToCString() const {
-    return Isolate::Current()->current_zone()->PrintToString(
-        "%s(f32x4)", Assembler::FpuRegisterName(reg_));
-  }
-
-  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    simd128_value_t value = deopt_context->FpuRegisterValueAsSimd128(reg_);
-    *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    deopt_context->DeferInt32x4Materialization(
-        value, reinterpret_cast<RawInt32x4**>(dest_addr));
-  }
-
- private:
-  const FpuRegister reg_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeoptInt32x4FpuRegisterInstr);
-};
-
+// Simd128 types.
+typedef DeoptFpuInstr<DeoptInstr::kFloat32x4, simd128_value_t, RawFloat32x4>
+    DeoptFloat32x4Instr;
+typedef DeoptFpuInstr<DeoptInstr::kFloat32x4, simd128_value_t, RawFloat32x4>
+    DeoptFloat32x4Instr;
+typedef DeoptFpuInstr<DeoptInstr::kFloat64x2, simd128_value_t, RawFloat64x2>
+    DeoptFloat64x2Instr;
+typedef DeoptFpuInstr<DeoptInstr::kInt32x4, simd128_value_t, RawInt32x4>
+    DeoptInt32x4Instr;
 
 // Deoptimization instruction creating a PC marker for the code of
 // function at 'object_table_index'.
@@ -1053,9 +626,9 @@
   virtual intptr_t source_index() const { return object_table_index_; }
   virtual DeoptInstr::Kind kind() const { return kPcMarker; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "pcmark oti:%" Pd "", object_table_index_);
+        "%" Pd "", object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -1070,7 +643,7 @@
         Function::Handle(deopt_context->isolate(), code.function());
     ASSERT(function.HasCode());
     const intptr_t pc_marker =
-        code.EntryPoint() + Assembler::kEntryPointToPcMarkerOffset;
+        code.EntryPoint() + Assembler::EntryPointToPcMarkerOffset();
     *dest_addr = pc_marker;
     // Increment the deoptimization counter. This effectively increments each
     // function occurring in the optimized frame.
@@ -1107,9 +680,9 @@
   virtual intptr_t source_index() const { return object_table_index_; }
   virtual DeoptInstr::Kind kind() const { return kPp; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "pp oti:%" Pd "", object_table_index_);
+        "%" Pd "", object_table_index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -1135,10 +708,6 @@
   virtual intptr_t source_index() const { return 0; }
   virtual DeoptInstr::Kind kind() const { return kCallerFp; }
 
-  virtual const char* ToCString() const {
-    return "callerfp";
-  }
-
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = deopt_context->GetCallerFp();
     deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(
@@ -1158,10 +727,6 @@
   virtual intptr_t source_index() const { return 0; }
   virtual DeoptInstr::Kind kind() const { return kCallerPp; }
 
-  virtual const char* ToCString() const {
-    return "callerpp";
-  }
-
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = deopt_context->GetSourcePp();
   }
@@ -1180,10 +745,6 @@
   virtual intptr_t source_index() const { return 0; }
   virtual DeoptInstr::Kind kind() const { return kCallerPc; }
 
-  virtual const char* ToCString() const {
-    return "callerpc";
-  }
-
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
     *dest_addr = deopt_context->GetSourcePc();
   }
@@ -1216,9 +777,9 @@
   }
   virtual DeoptInstr::Kind kind() const { return kSuffix; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "suffix %" Pd ":%" Pd, info_number_, suffix_length_);
+        "%" Pd ":%" Pd, info_number_, suffix_length_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -1255,9 +816,9 @@
   virtual intptr_t source_index() const { return index_; }
   virtual DeoptInstr::Kind kind() const { return kMaterializedObjectRef; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "mat ref #%" Pd "", index_);
+        "#%" Pd "", index_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -1286,9 +847,9 @@
   virtual intptr_t source_index() const { return field_count_; }
   virtual DeoptInstr::Kind kind() const { return kMaterializeObject; }
 
-  virtual const char* ToCString() const {
+  virtual const char* ArgumentsToCString() const {
     return Isolate::Current()->current_zone()->PrintToString(
-        "mat obj len:%" Pd "", field_count_);
+        "%" Pd "", field_count_);
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
@@ -1333,58 +894,40 @@
 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t source_index) {
   Kind kind = static_cast<Kind>(kind_as_int);
   switch (kind) {
-    case kStackSlot: return new DeoptStackSlotInstr(source_index);
-    case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(source_index);
-    case kFloat32x4StackSlot:
-        return new DeoptFloat32x4StackSlotInstr(source_index);
-    case kFloat64x2StackSlot:
-        return new DeoptFloat64x2StackSlotInstr(source_index);
-    case kInt32x4StackSlot:
-        return new DeoptInt32x4StackSlotInstr(source_index);
-    case kRetAddress: return new DeoptRetAddressInstr(source_index);
-    case kConstant: return new DeoptConstantInstr(source_index);
-    case kRegister: return new DeoptRegisterInstr(source_index);
-    case kFpuRegister: return new DeoptFpuRegisterInstr(source_index);
-    case kMintRegisterPair: {
-      intptr_t lo_reg_as_int =
-          DeoptMintRegisterPairInstr::LoRegister::decode(source_index);
-      intptr_t hi_reg_as_int =
-          DeoptMintRegisterPairInstr::HiRegister::decode(source_index);
-      return new DeoptMintRegisterPairInstr(lo_reg_as_int, hi_reg_as_int);
-    }
-    case kMintStackSlotPair: {
-      intptr_t lo_slot =
-          DeoptMintStackSlotPairInstr::LoSlot::decode(source_index);
-      intptr_t hi_slot =
-          DeoptMintStackSlotPairInstr::HiSlot::decode(source_index);
-      return new DeoptMintStackSlotPairInstr(lo_slot, hi_slot);
-    }
-    case kMintStackSlotRegister: {
-      intptr_t slot =
-          DeoptMintStackSlotRegisterInstr::Slot::decode(source_index);
-      intptr_t reg_as_int =
-          DeoptMintStackSlotRegisterInstr::Reg::decode(source_index);
-      bool flip = DeoptMintStackSlotRegisterInstr::Flip::decode(source_index);
-      return new DeoptMintStackSlotRegisterInstr(slot, reg_as_int, flip);
-    }
-    case kUint32Register:
-      return new DeoptUint32RegisterInstr(source_index);
-    case kUint32StackSlot:
-      return new DeoptUint32StackSlotInstr(source_index);
-    case kFloat32x4FpuRegister:
-        return new DeoptFloat32x4FpuRegisterInstr(source_index);
-    case kFloat64x2FpuRegister:
-        return new DeoptFloat64x2FpuRegisterInstr(source_index);
-    case kInt32x4FpuRegister:
-        return new DeoptInt32x4FpuRegisterInstr(source_index);
-    case kPcMarker: return new DeoptPcMarkerInstr(source_index);
-    case kPp: return new DeoptPpInstr(source_index);
-    case kCallerFp: return new DeoptCallerFpInstr();
-    case kCallerPp: return new DeoptCallerPpInstr();
-    case kCallerPc: return new DeoptCallerPcInstr();
-    case kSuffix: return new DeoptSuffixInstr(source_index);
+    case kWord:
+      return new DeoptWordInstr(source_index);
+    case kDouble:
+      return new DeoptDoubleInstr(source_index);
+    case kMintPair:
+      return new DeoptMintPairInstr(source_index);
+    case kInt32:
+      return new DeoptInt32Instr(source_index);
+    case kUint32:
+      return new DeoptUint32Instr(source_index);
+    case kFloat32x4:
+      return new DeoptFloat32x4Instr(source_index);
+    case kFloat64x2:
+      return new DeoptFloat64x2Instr(source_index);
+    case kInt32x4:
+      return new DeoptInt32x4Instr(source_index);
+    case kRetAddress:
+      return new DeoptRetAddressInstr(source_index);
+    case kConstant:
+      return new DeoptConstantInstr(source_index);
+    case kPcMarker:
+      return new DeoptPcMarkerInstr(source_index);
+    case kPp:
+      return new DeoptPpInstr(source_index);
+    case kCallerFp:
+      return new DeoptCallerFpInstr();
+    case kCallerPp:
+      return new DeoptCallerPpInstr();
+    case kCallerPc:
+      return new DeoptCallerPcInstr();
+    case kSuffix:
+      return new DeoptSuffixInstr(source_index);
     case kMaterializedObjectRef:
-        return new DeoptMaterializedObjectRefInstr(source_index);
+      return new DeoptMaterializedObjectRefInstr(source_index);
     case kMaterializeObject:
       return new DeoptMaterializeObjectInstr(source_index);
   }
@@ -1393,6 +936,50 @@
 }
 
 
+const char* DeoptInstr::KindToCString(Kind kind) {
+  switch (kind) {
+    case kWord:
+      return "word";
+    case kDouble:
+      return "double";
+    case kMintPair:
+      return "mint";
+    case kInt32:
+      return "int32";
+    case kUint32:
+      return "uint32";
+    case kFloat32x4:
+      return "float32x4";
+    case kFloat64x2:
+      return "float64x2";
+    case kInt32x4:
+      return "int32x4";
+    case kRetAddress:
+      return "retaddr";
+    case kConstant:
+      return "const";
+    case kPcMarker:
+      return "pc";
+    case kPp:
+      return "pp";
+    case kCallerFp:
+      return "callerfp";
+    case kCallerPp:
+      return "callerpp";
+    case kCallerPc:
+      return "callerpc";
+    case kSuffix:
+      return "suffix";
+    case kMaterializedObjectRef:
+      return "ref";
+    case kMaterializeObject:
+      return "mat";
+  }
+  UNREACHABLE();
+  return NULL;
+}
+
+
 class DeoptInfoBuilder::TrieNode : public ZoneAllocated {
  public:
   // Construct the root node representing the implicit "shared" terminator
@@ -1459,6 +1046,31 @@
 }
 
 
+CpuRegisterSource DeoptInfoBuilder::ToCpuRegisterSource(const Location& loc) {
+  if (loc.IsRegister()) {
+    return CpuRegisterSource(CpuRegisterSource::kRegister, loc.reg());
+  } else {
+    ASSERT(loc.IsStackSlot());
+    return CpuRegisterSource(
+        CpuRegisterSource::kStackSlot, CalculateStackIndex(loc));
+  }
+}
+
+
+FpuRegisterSource DeoptInfoBuilder::ToFpuRegisterSource(
+  const Location& loc,
+  Location::Kind stack_slot_kind) {
+  if (loc.IsFpuRegister()) {
+    return FpuRegisterSource(FpuRegisterSource::kRegister, loc.fpu_reg());
+  } else {
+    ASSERT((stack_slot_kind == Location::kQuadStackSlot) ||
+           (stack_slot_kind == Location::kDoubleStackSlot));
+    ASSERT(loc.kind() == stack_slot_kind);
+    return FpuRegisterSource(
+        FpuRegisterSource::kStackSlot, CalculateStackIndex(loc));
+  }
+}
+
 void DeoptInfoBuilder::AddReturnAddress(const Code& code,
                                         intptr_t deopt_id,
                                         intptr_t dest_index) {
@@ -1498,79 +1110,6 @@
   if (source_loc.IsConstant()) {
     intptr_t object_table_index = FindOrAddObjectInTable(source_loc.constant());
     deopt_instr = new(isolate()) DeoptConstantInstr(object_table_index);
-  } else if (source_loc.IsRegister()) {
-    if (value->definition()->representation() == kUnboxedUint32) {
-      deopt_instr = new(isolate()) DeoptUint32RegisterInstr(source_loc.reg());
-    } else {
-      ASSERT(value->definition()->representation() == kTagged);
-      deopt_instr = new(isolate()) DeoptRegisterInstr(source_loc.reg());
-    }
-  } else if (source_loc.IsFpuRegister()) {
-    if (value->definition()->representation() == kUnboxedDouble) {
-      deopt_instr = new(isolate()) DeoptFpuRegisterInstr(source_loc.fpu_reg());
-    } else if (value->definition()->representation() == kUnboxedFloat32x4) {
-      deopt_instr =
-          new(isolate()) DeoptFloat32x4FpuRegisterInstr(source_loc.fpu_reg());
-    } else if (value->definition()->representation() == kUnboxedInt32x4) {
-      deopt_instr =
-          new(isolate()) DeoptInt32x4FpuRegisterInstr(source_loc.fpu_reg());
-    } else {
-      ASSERT(value->definition()->representation() == kUnboxedFloat64x2);
-      deopt_instr =
-          new(isolate()) DeoptFloat64x2FpuRegisterInstr(source_loc.fpu_reg());
-    }
-  } else if (source_loc.IsStackSlot()) {
-    if (value->definition()->representation() == kUnboxedUint32) {
-      intptr_t source_index = CalculateStackIndex(source_loc);
-      deopt_instr = new(isolate()) DeoptUint32StackSlotInstr(source_index);
-    } else {
-      ASSERT(value->definition()->representation() == kTagged);
-      intptr_t source_index = CalculateStackIndex(source_loc);
-      deopt_instr = new(isolate()) DeoptStackSlotInstr(source_index);
-    }
-  } else if (source_loc.IsDoubleStackSlot()) {
-    ASSERT(value->definition()->representation() == kUnboxedDouble);
-    intptr_t source_index = CalculateStackIndex(source_loc);
-    deopt_instr = new(isolate()) DeoptDoubleStackSlotInstr(source_index);
-  } else if (source_loc.IsQuadStackSlot()) {
-    intptr_t source_index = CalculateStackIndex(source_loc);
-    if (value->definition()->representation() == kUnboxedFloat32x4) {
-      deopt_instr = new(isolate()) DeoptFloat32x4StackSlotInstr(source_index);
-    } else if (value->definition()->representation() == kUnboxedInt32x4) {
-      deopt_instr = new(isolate()) DeoptInt32x4StackSlotInstr(source_index);
-    } else {
-      ASSERT(value->definition()->representation() == kUnboxedFloat64x2);
-      deopt_instr = new(isolate()) DeoptFloat64x2StackSlotInstr(source_index);
-    }
-  } else if (source_loc.IsPairLocation()) {
-    ASSERT(value->definition()->representation() == kUnboxedMint);
-    // There are four cases to consider here:
-    // (R = Register, S = Stack slot).
-    // 1) R, R.
-    // 2) S, S.
-    // 3) R, S.
-    // 4) S, R.
-    PairLocation* pair = source_loc.AsPairLocation();
-    if (pair->At(0).IsRegister() && pair->At(1).IsRegister()) {
-      deopt_instr =
-          new(isolate()) DeoptMintRegisterPairInstr(pair->At(0).reg(),
-                                                    pair->At(1).reg());
-    } else if (pair->At(0).IsStackSlot() && pair->At(1).IsStackSlot()) {
-      deopt_instr = new(isolate()) DeoptMintStackSlotPairInstr(
-          CalculateStackIndex(pair->At(0)),
-          CalculateStackIndex(pair->At(1)));
-    } else if (pair->At(0).IsRegister() && pair->At(1).IsStackSlot()) {
-      deopt_instr = new(isolate()) DeoptMintStackSlotRegisterInstr(
-          CalculateStackIndex(pair->At(1)),
-          pair->At(0).reg(),
-          true);
-    } else {
-      ASSERT(pair->At(0).IsStackSlot() && pair->At(1).IsRegister());
-      deopt_instr = new(isolate()) DeoptMintStackSlotRegisterInstr(
-          CalculateStackIndex(pair->At(0)),
-          pair->At(1).reg(),
-          false);
-    }
   } else if (source_loc.IsInvalid() &&
              value->definition()->IsMaterializeObject()) {
     const intptr_t index = FindMaterialization(
@@ -1578,7 +1117,48 @@
     ASSERT(index >= 0);
     deopt_instr = new(isolate()) DeoptMaterializedObjectRefInstr(index);
   } else {
-    UNREACHABLE();
+    ASSERT(!source_loc.IsInvalid());
+    switch (value->definition()->representation()) {
+      case kTagged:
+        deopt_instr = new(isolate()) DeoptWordInstr(
+          ToCpuRegisterSource(source_loc));
+        break;
+      case kUnboxedMint: {
+        ASSERT(source_loc.IsPairLocation());
+        PairLocation* pair = source_loc.AsPairLocation();
+        deopt_instr = new(isolate()) DeoptMintPairInstr(
+            ToCpuRegisterSource(pair->At(0)),
+            ToCpuRegisterSource(pair->At(1)));
+        break;
+      }
+      case kUnboxedInt32:
+        deopt_instr = new(isolate()) DeoptInt32Instr(
+          ToCpuRegisterSource(source_loc));
+        break;
+      case kUnboxedUint32:
+        deopt_instr = new(isolate()) DeoptUint32Instr(
+          ToCpuRegisterSource(source_loc));
+        break;
+      case kUnboxedDouble:
+        deopt_instr = new(isolate()) DeoptDoubleInstr(
+            ToFpuRegisterSource(source_loc, Location::kDoubleStackSlot));
+        break;
+      case kUnboxedFloat32x4:
+        deopt_instr = new(isolate()) DeoptFloat32x4Instr(
+            ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
+        break;
+      case kUnboxedFloat64x2:
+        deopt_instr = new(isolate()) DeoptFloat64x2Instr(
+            ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
+        break;
+      case kUnboxedInt32x4:
+        deopt_instr = new(isolate()) DeoptInt32x4Instr(
+            ToFpuRegisterSource(source_loc, Location::kQuadStackSlot));
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
   }
   ASSERT(dest_index == FrameSize());
   ASSERT(deopt_instr != NULL);
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 93def97..c2ee735 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -10,6 +10,7 @@
 #include "vm/code_generator.h"
 #include "vm/deferred_objects.h"
 #include "vm/growable_array.h"
+#include "vm/locations.h"
 #include "vm/object.h"
 
 namespace dart {
@@ -70,13 +71,6 @@
     return *reinterpret_cast<double*>(&fpu_registers_[reg]);
   }
 
-  int64_t FpuRegisterValueAsInt64(FpuRegister reg) const {
-    ASSERT(fpu_registers_ != NULL);
-    ASSERT(reg >= 0);
-    ASSERT(reg < kNumberOfFpuRegisters);
-    return *reinterpret_cast<int64_t*>(&fpu_registers_[reg]);
-  }
-
   simd128_value_t FpuRegisterValueAsSimd128(FpuRegister reg) const {
     ASSERT(fpu_registers_ != NULL);
     ASSERT(reg >= 0);
@@ -120,7 +114,7 @@
         deferred_slots_);
   }
 
-  void DeferDoubleMaterialization(double value, RawDouble** slot) {
+  void DeferMaterialization(double value, RawDouble** slot) {
     deferred_slots_ = new DeferredDouble(
         value,
         reinterpret_cast<RawInstance**>(slot),
@@ -134,24 +128,21 @@
         deferred_slots_);
   }
 
-  void DeferFloat32x4Materialization(simd128_value_t value,
-                                     RawFloat32x4** slot) {
+  void DeferMaterialization(simd128_value_t value, RawFloat32x4** slot) {
     deferred_slots_ = new DeferredFloat32x4(
         value,
         reinterpret_cast<RawInstance**>(slot),
         deferred_slots_);
   }
 
-  void DeferFloat64x2Materialization(simd128_value_t value,
-                                     RawFloat64x2** slot) {
+  void DeferMaterialization(simd128_value_t value, RawFloat64x2** slot) {
     deferred_slots_ = new DeferredFloat64x2(
         value,
         reinterpret_cast<RawInstance**>(slot),
         deferred_slots_);
   }
 
-  void DeferInt32x4Materialization(simd128_value_t value,
-                                    RawInt32x4** slot) {
+  void DeferMaterialization(simd128_value_t value, RawInt32x4** slot) {
     deferred_slots_ = new DeferredInt32x4(
         value,
         reinterpret_cast<RawInstance**>(slot),
@@ -221,23 +212,16 @@
   enum Kind {
     kRetAddress,
     kConstant,
-    kRegister,
-    kFpuRegister,
-    kFloat32x4FpuRegister,
-    kFloat64x2FpuRegister,
-    kInt32x4FpuRegister,
-    kStackSlot,
-    kDoubleStackSlot,
-    kFloat32x4StackSlot,
-    kFloat64x2StackSlot,
-    kInt32x4StackSlot,
+    kWord,
+    kDouble,
+    kFloat32x4,
+    kFloat64x2,
+    kInt32x4,
     // Mints are split into low and high words. Each word can be in a register
     // or stack slot. Note Mints are only used on 32-bit architectures.
-    kMintRegisterPair,
-    kMintStackSlotPair,
-    kMintStackSlotRegister,
-    kUint32Register,
-    kUint32StackSlot,
+    kMintPair,
+    kInt32,
+    kUint32,
     kPcMarker,
     kPp,
     kCallerFp,
@@ -253,7 +237,15 @@
   DeoptInstr() {}
   virtual ~DeoptInstr() {}
 
-  virtual const char* ToCString() const = 0;
+  virtual const char* ToCString() const {
+    const char* args = ArgumentsToCString();
+    if (args != NULL) {
+      return Isolate::Current()->current_zone()->PrintToString(
+          "%s(%s)", KindToCString(kind()), args);
+    } else {
+      return KindToCString(kind());
+    }
+  }
 
   virtual void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) = 0;
 
@@ -285,11 +277,116 @@
 
   virtual intptr_t source_index() const = 0;
 
+  virtual const char* ArgumentsToCString() const {
+    return NULL;
+  }
+
  private:
+  static const char* KindToCString(Kind kind);
+
   DISALLOW_COPY_AND_ASSIGN(DeoptInstr);
 };
 
 
+// Helper class that allows to read a value of the given register from
+// the DeoptContext as the specified type.
+// It calls different method depending on which kind of register (cpu/fpu) and
+// destination types are specified.
+template<typename RegisterType, typename DestinationType>
+struct RegisterReader;
+
+template<typename T>
+struct RegisterReader<Register, T> {
+  static intptr_t Read(DeoptContext* context, Register reg) {
+    return context->RegisterValue(reg);
+  }
+};
+
+template<>
+struct RegisterReader<FpuRegister, double> {
+  static double Read(DeoptContext* context, FpuRegister reg) {
+    return context->FpuRegisterValue(reg);
+  }
+};
+
+
+template<>
+struct RegisterReader<FpuRegister, simd128_value_t> {
+  static simd128_value_t Read(DeoptContext* context, FpuRegister reg) {
+    return context->FpuRegisterValueAsSimd128(reg);
+  }
+};
+
+
+// Class that encapsulates reading and writing of values that were either in
+// the registers in the optimized code or were spilled from those registers
+// to the stack.
+template<typename RegisterType>
+class RegisterSource {
+ public:
+  enum Kind {
+    // Spilled register source represented as its spill slot.
+    kStackSlot = 0,
+    // Register source represented as its register index.
+    kRegister = 1
+  };
+
+  explicit RegisterSource(intptr_t source_index)
+      : source_index_(source_index) { }
+
+  RegisterSource(Kind kind, intptr_t index)
+      : source_index_(KindField::encode(kind) | RawIndexField::encode(index)) {
+  }
+
+  template<typename T>
+  T Value(DeoptContext* context) const {
+    if (is_register()) {
+      return static_cast<T>(RegisterReader<RegisterType, T>::Read(
+        context, reg()));
+    } else {
+      return *reinterpret_cast<T*>(context->GetSourceFrameAddressAt(
+          context->source_frame_size() - raw_index() - 1));
+    }
+  }
+
+  intptr_t source_index() const { return source_index_; }
+
+  const char* ToCString() const {
+    if (is_register()) {
+      return Name(reg());
+    } else {
+      return Isolate::Current()->current_zone()->PrintToString(
+          "s%" Pd "", raw_index());
+    }
+  }
+
+ private:
+  class KindField : public BitField<intptr_t, 0, 1> { };
+  class RawIndexField : public BitField<intptr_t, 1, kBitsPerWord - 1> { };
+
+  bool is_register() const {
+    return KindField::decode(source_index_) == kRegister;
+  }
+  intptr_t raw_index() const { return RawIndexField::decode(source_index_); }
+
+  RegisterType reg() const { return static_cast<RegisterType>(raw_index()); }
+
+  static const char* Name(Register reg) {
+    return Assembler::RegisterName(reg);
+  }
+
+  static const char* Name(FpuRegister fpu_reg) {
+    return Assembler::FpuRegisterName(fpu_reg);
+  }
+
+  const intptr_t source_index_;
+};
+
+
+typedef RegisterSource<Register> CpuRegisterSource;
+typedef RegisterSource<FpuRegister> FpuRegisterSource;
+
+
 // Builds a deoptimization info table, one DeoptInfo at a time.  Call AddXXX
 // methods in the order of their target, starting wih deoptimized code
 // continuation pc and ending with the first argument of the deoptimized
@@ -342,6 +439,10 @@
  private:
   class TrieNode;
 
+  CpuRegisterSource ToCpuRegisterSource(const Location& loc);
+  FpuRegisterSource ToFpuRegisterSource(const Location& loc,
+                                      Location::Kind expected_stack_slot_kind);
+
   intptr_t FindOrAddObjectInTable(const Object& obj) const;
   intptr_t FindMaterialization(MaterializeObjectInstr* mat) const;
   intptr_t CalculateStackIndex(const Location& source_loc) const;
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2e95096..96b4984 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -747,6 +747,9 @@
       class_name = &Symbols::AbstractClassInstantiationError();
       constructor_name = &Symbols::DotCreate();
       break;
+    case kCyclicInitializationError:
+      library = Library::CoreLibrary();
+      class_name = &Symbols::CyclicInitializationError();
   }
 
   return DartLibraryCalls::InstanceCreate(library,
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 5e87e3b..a7ab022 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -65,6 +65,7 @@
     kType,
     kFallThrough,
     kAbstractClassInstantiation,
+    kCyclicInitializationError,
   };
 
   static void ThrowByType(ExceptionType type, const Array& arguments);
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 0971696..9259bf6 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -623,8 +623,8 @@
   } else {
     ConstantInstr* constant = defn->AsConstant();
     ASSERT(constant != NULL);
-    range->set_assigned_location(Location::Constant(constant->value()));
-    range->set_spill_slot(Location::Constant(constant->value()));
+    range->set_assigned_location(Location::Constant(constant));
+    range->set_spill_slot(Location::Constant(constant));
   }
   AssignSafepoints(defn, range);
   range->finger()->Initialize(range);
@@ -734,7 +734,7 @@
 
     ConstantInstr* constant = val->definition()->AsConstant();
     if (constant != NULL) {
-      move->set_src(Location::Constant(constant->value()));
+      move->set_src(Location::Constant(constant));
       move_idx++;
       continue;
     }
@@ -849,7 +849,7 @@
 
       ConstantInstr* constant = def->AsConstant();
       if (constant != NULL) {
-        locations[i] = Location::Constant(constant->value());
+        locations[i] = Location::Constant(constant);
         continue;
       }
 
@@ -912,7 +912,7 @@
 
     ConstantInstr* constant = def->AsConstant();
     if (constant != NULL) {
-      locations[i] = Location::Constant(constant->value());
+      locations[i] = Location::Constant(constant);
       continue;
     }
 
@@ -1150,9 +1150,9 @@
     // TODO(vegorov): improve allocation when we have enough registers to keep
     // constants used in the loop in them.
     if (HasOnlyUnconstrainedUses(range)) {
-      const Object& value = def->AsConstant()->value();
-      range->set_assigned_location(Location::Constant(value));
-      range->set_spill_slot(Location::Constant(value));
+      ConstantInstr* constant_instr = def->AsConstant();
+      range->set_assigned_location(Location::Constant(constant_instr));
+      range->set_spill_slot(Location::Constant(constant_instr));
       range->finger()->Initialize(range);
       ConvertAllUses(range);
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index ded5990..40cdf4c 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -260,7 +260,10 @@
         args_pushed_(0),
         nesting_stack_(NULL),
         osr_id_(osr_id),
-        is_optimizing_(is_optimizing) { }
+        is_optimizing_(is_optimizing),
+        jump_cnt_(0),
+        await_joins_(new(I) ZoneGrowableArray<JoinEntryInstr*>()),
+        await_levels_(new(I) ZoneGrowableArray<intptr_t>()) { }
 
 
 void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
@@ -1038,15 +1041,6 @@
     }
   }
 
-  intptr_t current_context_level = owner()->context_level();
-  ASSERT(current_context_level >= 0);
-  if (owner()->parsed_function()->saved_entry_context_var() != NULL) {
-    // CTX on entry was saved, but not linked as context parent.
-    BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var());
-  } else {
-    UnchainContexts(current_context_level);
-  }
-
   // Async functions contain two types of return statements:
   // 1) Returns that should complete the completer once all finally blocks have
   //    been inlined (call: :async_completer.complete(return_value)). These
@@ -1056,18 +1050,19 @@
   //
   // We distinguish those kinds of nodes via is_regular_return().
   //
-  if (function.is_async_closure() && node->is_regular_return()) {
+  if (function.is_async_closure() &&
+      (node->return_type() == ReturnNode::kRegular)) {
     // Temporary store the computed return value.
     Do(BuildStoreExprTemp(return_value));
 
     LocalVariable* rcv_var = node->scope()->LookupVariable(
         Symbols::AsyncCompleter(), false);
     ASSERT(rcv_var != NULL && rcv_var->is_captured());
-    Value* rcv_value = Bind(BuildLoadLocal(*rcv_var));
-    Value* returned_value = Bind(BuildLoadExprTemp());
     ZoneGrowableArray<PushArgumentInstr*>* arguments =
         new(I) ZoneGrowableArray<PushArgumentInstr*>(2);
+    Value* rcv_value = Bind(BuildLoadLocal(*rcv_var));
     arguments->Add(PushArgument(rcv_value));
+    Value* returned_value = Bind(BuildLoadExprTemp());
     arguments->Add(PushArgument(returned_value));
     InstanceCallInstr* call = new(I) InstanceCallInstr(
         Scanner::kNoSourcePos,
@@ -1083,6 +1078,16 @@
     return_value = BuildNullValue();
   }
 
+  intptr_t current_context_level = owner()->context_level();
+  ASSERT(current_context_level >= 0);
+  if (owner()->parsed_function()->saved_entry_context_var() != NULL) {
+    // CTX on entry was saved, but not linked as context parent.
+    BuildRestoreContext(*owner()->parsed_function()->saved_entry_context_var());
+  } else {
+    UnchainContexts(current_context_level);
+  }
+
+
   AddReturnExit(node->token_pos(), return_value);
 }
 
@@ -1444,6 +1449,58 @@
 }
 
 
+void EffectGraphVisitor::BuildAwaitJump(LocalScope* lookup_scope,
+                                        const intptr_t old_ctx_level,
+                                        JoinEntryInstr* target) {
+  // Building a jump consists of the following actions:
+  // * Record the current continuation result in a temporary.
+  // * Restore the old context.
+  // * Overwrite the old context's continuation result with the temporary.
+  // * Append a Goto to the target's join.
+  LocalVariable* old_ctx = lookup_scope->LookupVariable(
+      Symbols::AwaitContextVar(), false);
+  LocalVariable* continuation_result = lookup_scope->LookupVariable(
+      Symbols::AsyncOperationParam(), false);
+  ASSERT((continuation_result != NULL) && continuation_result->is_captured());
+  ASSERT((old_ctx != NULL) && old_ctx->is_captured());
+  // Before restoring the continuation context we need to temporary save the
+  // current continuation result.
+  Value* continuation_result_value = Bind(BuildLoadLocal(*continuation_result));
+  Do(BuildStoreExprTemp(continuation_result_value));
+
+  // Restore the saved continuation context.
+  BuildRestoreContext(*old_ctx);
+
+  // Pass over the continuation result.
+  Value* saved_continuation_result = Bind(BuildLoadExprTemp());
+  // FlowGraphBuilder is at top context level, but the await target has possibly
+  // been recorded in a nested context (old_ctx_level). We need to unroll
+  // manually here.
+  LocalVariable* tmp_var = EnterTempLocalScope(saved_continuation_result);
+  intptr_t delta = old_ctx_level -
+                   continuation_result->owner()->context_level();
+  ASSERT(delta >= 0);
+  Value* context = Bind(new(I) CurrentContextInstr());
+  while (delta-- > 0) {
+    context = Bind(new(I) LoadFieldInstr(
+        context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
+        Scanner::kNoSourcePos));
+  }
+  Value* tmp_val = Bind(new(I) LoadLocalInstr(*tmp_var));
+  StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
+      Context::variable_offset(continuation_result->index()),
+      context,
+      tmp_val,
+      kEmitStoreBarrier,
+      Scanner::kNoSourcePos);
+  Do(store);
+  Do(ExitTempLocalScope(tmp_var));
+
+  // Goto saved join.
+  Goto(target);
+}
+
+
 // Used for type casts and to test assignments.
 Value* EffectGraphVisitor::BuildAssignableValue(intptr_t token_pos,
                                                 Value* value,
@@ -2114,6 +2171,53 @@
 }
 
 
+void EffectGraphVisitor::VisitAwaitNode(AwaitNode* node) {
+  // Await nodes are temporary during parsing.
+  UNREACHABLE();
+}
+
+
+void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
+  if (node->marker_type() == AwaitMarkerNode::kNewContinuationState) {
+    // We need to create a new await state which involves:
+    // * Increase the jump counter. Sanity check against the list of targets.
+    // * Save the current context for resuming.
+    ASSERT(node->scope() != NULL);
+    LocalVariable* jump_var = node->scope()->LookupVariable(
+        Symbols::AwaitJumpVar(), false);
+    LocalVariable* ctx_var = node->scope()->LookupVariable(
+        Symbols::AwaitContextVar(), false);
+    ASSERT((jump_var != NULL) && jump_var->is_captured());
+    ASSERT((ctx_var != NULL) && ctx_var->is_captured());
+    const intptr_t jump_cnt = owner()->next_await_counter();
+    ASSERT(jump_cnt >= 0);
+    // Sanity check that we always add a JoinEntryInstr before adding a new
+    // state.
+    ASSERT(jump_cnt == owner()->await_joins()->length());
+    // Store the counter in :await_jump_var.
+    Value* jump_val = Bind(new (I) ConstantInstr(
+        Smi::ZoneHandle(I, Smi::New(jump_cnt))));
+    Do(BuildStoreLocal(*jump_var, jump_val));
+    // Save the current context for resuming.
+    BuildSaveContext(*ctx_var);
+    owner()->await_levels()->Add(owner()->context_level());
+    return;
+  }
+  if (node->marker_type() == AwaitMarkerNode::kTargetForContinuation) {
+    // We need to create a new await target which involves:
+    // * Append a join that is also added to the list that will later result in
+    //   a preamble.
+    JoinEntryInstr* const join = new(I) JoinEntryInstr(
+        owner()->AllocateBlockId(), owner()->try_index());
+    owner()->await_joins()->Add(join);
+    Goto(join);
+    exit_ = join;
+    return;
+  }
+  UNREACHABLE();
+}
+
+
 intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
   return kFirstLocalSlotFromFp
       - owner()->num_stack_locals()
@@ -2529,6 +2633,12 @@
 }
 
 
+void EffectGraphVisitor::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
+  Value* field = Bind(new(I) ConstantInstr(node->field()));
+  AddInstruction(new(I) InitStaticFieldInstr(field, node->field()));
+}
+
+
 void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
   Value* context = Bind(new(I) CurrentContextInstr());
   Value* clone = Bind(new(I) CloneContextInstr(node->token_pos(), context));
@@ -3117,6 +3227,18 @@
         length_load->set_recognized_kind(MethodRecognizer::kObjectArrayLength);
         return ReturnDefinition(length_load);
       }
+      case MethodRecognizer::kObjectArrayAllocate: {
+        LocalVariable* type_args_parameter =
+            node->scope()->LookupVariable(Symbols::TypeArgumentsParameter(),
+                                          true);
+        Value* element_type = Bind(new(I) LoadLocalInstr(*type_args_parameter));
+        LocalVariable* length_parameter =
+            node->scope()->LookupVariable(Symbols::Length(), true);
+        Value* length = Bind(new(I) LoadLocalInstr(*length_parameter));
+        CreateArrayInstr* create_array =
+            new CreateArrayInstr(node->token_pos(), element_type, length);
+        return ReturnDefinition(create_array);
+      }
       default:
         break;
     }
@@ -3507,10 +3629,10 @@
         parent_context = Bind(new(I) CurrentContextInstr());
       }
       Do(new(I) StoreInstanceFieldInstr(Context::parent_offset(),
-                                     tmp_val,
-                                     parent_context,
-                                     kEmitStoreBarrier,
-                                     Scanner::kNoSourcePos));
+                                        tmp_val,
+                                        parent_context,
+                                        kEmitStoreBarrier,
+                                        Scanner::kNoSourcePos));
       AddInstruction(
           new(I) StoreContextInstr(Bind(ExitTempLocalScope(tmp_var))));
     }
@@ -3614,6 +3736,22 @@
     }
   }
 
+  // Continuation part:
+  // If this node sequence is the body of an async closure leave room for a
+  // preamble. The preamble is generated after visiting the body.
+  GotoInstr* preamble_start = NULL;
+  if ((node == owner()->parsed_function()->node_sequence()) &&
+      (owner()->parsed_function()->function().is_async_closure())) {
+    JoinEntryInstr* preamble_end = new(I) JoinEntryInstr(
+        owner()->AllocateBlockId(), owner()->try_index());
+    ASSERT(exit() != NULL);
+    exit()->Goto(preamble_end);
+    ASSERT(exit()->next()->IsGoto());
+    preamble_start = exit()->next()->AsGoto();
+    ASSERT(preamble_start->IsGoto());
+    exit_ = preamble_end;
+  }
+
   intptr_t i = 0;
   while (is_open() && (i < node->length())) {
     EffectGraphVisitor for_effect(owner());
@@ -3625,6 +3763,62 @@
     }
   }
 
+  // Continuation part:
+  // After generating the CFG for the body we can create the preamble because we
+  // know exactly how many continuation states we need.
+  if ((node == owner()->parsed_function()->node_sequence()) &&
+      (owner()->parsed_function()->function().is_async_closure())) {
+    ASSERT(preamble_start != NULL);
+    // We are at the top level. Fetch the corresponding scope.
+    LocalScope* top_scope = node->scope();
+    LocalVariable* jump_var = top_scope->LookupVariable(
+        Symbols::AwaitJumpVar(), false);
+    ASSERT(jump_var != NULL && jump_var->is_captured());
+
+    Instruction* saved_entry = entry_;
+    Instruction* saved_exit = exit_;
+    entry_ = NULL;
+    exit_ = NULL;
+
+    LoadLocalNode* load_jump_cnt = new(I) LoadLocalNode(
+        Scanner::kNoSourcePos, jump_var);
+    ComparisonNode* check_jump_cnt;
+    const intptr_t num_await_states = owner()->await_joins()->length();
+    for (intptr_t i = 0; i < num_await_states; i++) {
+      check_jump_cnt = new(I) ComparisonNode(
+          Scanner::kNoSourcePos,
+          Token::kEQ,
+          load_jump_cnt,
+          new(I) LiteralNode(
+              Scanner::kNoSourcePos, Smi::ZoneHandle(I, Smi::New(i))));
+      TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+      check_jump_cnt->Visit(&for_test);
+      EffectGraphVisitor for_true(owner());
+      EffectGraphVisitor for_false(owner());
+
+      for_true.BuildAwaitJump(top_scope,
+                              (*owner()->await_levels())[i],
+                              (*owner()->await_joins())[i]);
+      Join(for_test, for_true, for_false);
+
+      if (i == 0) {
+        // Manually link up the preamble start.
+        preamble_start->previous()->set_next(for_test.entry());
+        for_test.entry()->set_previous(preamble_start->previous());
+      }
+      if (i == (num_await_states - 1)) {
+        // Link up preamble end.
+        if (exit_ == NULL) {
+          exit_ = preamble_start;
+        } else {
+          exit_->LinkTo(preamble_start);
+        }
+      }
+    }
+    entry_ = saved_entry;
+    exit_ = saved_exit;
+  }
+
   if (is_open()) {
     if (MustSaveRestoreContext(node)) {
       BuildRestoreContext(
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index ad59569..fe23674 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -179,6 +179,13 @@
   void set_catch_try_index(intptr_t value) { catch_try_index_ = value; }
   intptr_t catch_try_index() const { return catch_try_index_; }
 
+  intptr_t next_await_counter() { return jump_cnt_++; }
+
+  ZoneGrowableArray<intptr_t>* await_levels() const { return await_levels_; }
+  ZoneGrowableArray<JoinEntryInstr*>* await_joins() const {
+    return await_joins_;
+  }
+
   void AddCatchEntry(CatchBlockEntryInstr* entry);
 
   intptr_t num_copied_params() const {
@@ -267,6 +274,10 @@
   // Do not generate a different graph based on this flag.
   const bool is_optimizing_;
 
+  intptr_t jump_cnt_;
+  ZoneGrowableArray<JoinEntryInstr*>* await_joins_;
+  ZoneGrowableArray<intptr_t>* await_levels_;
+
   DISALLOW_IMPLICIT_CONSTRUCTORS(FlowGraphBuilder);
 };
 
@@ -457,6 +468,10 @@
 
   void BuildLetTempExpressions(LetNode* node);
 
+  void BuildAwaitJump(LocalScope* lookup_scope,
+                      const intptr_t old_ctx_level,
+                      JoinEntryInstr* target);
+
   Isolate* isolate() const { return owner()->isolate(); }
 
  private:
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index fa4d6e5..eb987ae 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -159,7 +159,7 @@
           ic_data = current->AsInstanceCall()->ic_data();
           ASSERT(ic_data != NULL);
         }
-        if ((ic_data != NULL) && (ic_data->NumberOfChecks() == 0)) {
+        if ((ic_data != NULL) && (ic_data->NumberOfUsedChecks() == 0)) {
           may_reoptimize_ = true;
         }
         if (is_leaf &&
@@ -462,7 +462,7 @@
 
 void FlowGraphCompiler::GenerateDeferredCode() {
   for (intptr_t i = 0; i < slow_path_code_.length(); i++) {
-    slow_path_code_[i]->EmitNativeCode(this);
+    slow_path_code_[i]->GenerateCode(this);
   }
   for (intptr_t i = 0; i < deopt_infos_.length(); i++) {
     deopt_infos_[i]->GenerateCode(this, i);
@@ -836,10 +836,10 @@
     LocationSummary* locs,
     const ICData& ic_data) {
   ASSERT(!ic_data.IsNull());
-  ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0));
+  ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfUsedChecks() == 0));
   uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) {
+  if (is_optimizing() && (ic_data.NumberOfUsedChecks() == 0)) {
     if (ic_data.IsClosureCall()) {
       // This IC call may be closure call only.
       label_address = stub_code->ClosureCallInlineCacheEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 5ce839c..e770a8b 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -190,9 +190,15 @@
   Label* entry_label() { return &entry_label_; }
   Label* exit_label() { return &exit_label_; }
 
-  virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0;
+  void GenerateCode(FlowGraphCompiler* compiler) {
+    ASSERT(exit_label_.IsBound());
+    EmitNativeCode(compiler);
+    ASSERT(entry_label_.IsBound());
+  }
 
  private:
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0;
+
   Label entry_label_;
   Label exit_label_;
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 56539af..1bb2829 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1296,15 +1296,9 @@
     intptr_t token_pos,
     LocationSummary* locs,
     const ICData& ic_data) {
-  uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (ic_data.NumArgsTested() == 0) {
-    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.NumArgsTested() == 2) {
-    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
-  } else {
-    UNIMPLEMENTED();
-  }
+  const uword label_address =
+      stub_code->UnoptimizedStaticCallEntryPoint(ic_data.NumArgsTested());
   ExternalLabel target_label(label_address);
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id,
@@ -1486,7 +1480,7 @@
                                         intptr_t token_index,
                                         LocationSummary* locs) {
   ASSERT(is_optimizing());
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfUsedChecks() > 0));
   Label match_found;
   const intptr_t len = ic_data.NumberOfChecks();
   GrowableArray<CidTarget> sorted(len);
@@ -1606,7 +1600,11 @@
     ASSERT(source.IsConstant());
     const Object& constant = source.constant();
     if (destination.IsRegister()) {
-      __ LoadObject(destination.reg(), constant);
+      if (source.constant_instruction()->representation() == kUnboxedInt32) {
+        __ LoadImmediate(destination.reg(), Smi::Cast(constant).Value());
+      } else {
+        __ LoadObject(destination.reg(), constant);
+      }
     } else if (destination.IsFpuRegister()) {
       const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
       if (Utils::DoublesBitEqual(Double::Cast(constant).value(), 0.0) &&
@@ -1632,7 +1630,11 @@
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
-      __ LoadObject(TMP, constant);
+      if (source.constant_instruction()->representation() == kUnboxedInt32) {
+        __ LoadImmediate(TMP, Smi::Cast(constant).Value());
+      } else {
+        __ LoadObject(TMP, constant);
+      }
       __ StoreToOffset(kWord, TMP, FP, dest_offset);
     }
   }
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 90fbd1c..b35cd93 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1301,15 +1301,9 @@
     intptr_t token_pos,
     LocationSummary* locs,
     const ICData& ic_data) {
-  uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (ic_data.NumArgsTested() == 0) {
-    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.NumArgsTested() == 2) {
-    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
-  } else {
-    UNIMPLEMENTED();
-  }
+  const uword label_address =
+      stub_code->UnoptimizedStaticCallEntryPoint(ic_data.NumArgsTested());
   ExternalLabel target_label(label_address);
   __ LoadObject(R5, ic_data, PP);
   GenerateDartCall(deopt_id,
@@ -1472,7 +1466,7 @@
                                         intptr_t token_index,
                                         LocationSummary* locs) {
   ASSERT(is_optimizing());
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfUsedChecks() > 0));
   Label match_found;
   const intptr_t len = ic_data.NumberOfChecks();
   GrowableArray<CidTarget> sorted(len);
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 29b006a..a00e8b9 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1178,15 +1178,9 @@
     intptr_t token_pos,
     LocationSummary* locs,
     const ICData& ic_data) {
-  uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (ic_data.NumArgsTested() == 0) {
-    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.NumArgsTested() == 2) {
-    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
-  } else {
-    UNIMPLEMENTED();
-  }
+  const uword label_address =
+      stub_code->UnoptimizedStaticCallEntryPoint(ic_data.NumArgsTested());
   ExternalLabel target_label(label_address);
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
@@ -1482,7 +1476,7 @@
                                         intptr_t token_index,
                                         LocationSummary* locs) {
   ASSERT(is_optimizing());
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfUsedChecks() > 0));
   Label match_found;
   const intptr_t len = ic_data.NumberOfChecks();
   GrowableArray<CidTarget> sorted(len);
@@ -1582,6 +1576,9 @@
       const Object& constant = source.constant();
       if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
         __ xorl(destination.reg(), destination.reg());
+      } else if (constant.IsSmi() &&
+          source.constant_instruction()->representation() == kUnboxedInt32) {
+        __ movl(destination.reg(), Immediate(Smi::Cast(constant).Value()));
       } else {
         __ LoadObjectSafely(destination.reg(), constant);
       }
@@ -1615,7 +1612,14 @@
       __ movsd(destination.ToStackSlotAddress(), XMM0);
     } else {
       ASSERT(destination.IsStackSlot());
-      StoreObject(destination.ToStackSlotAddress(), source.constant());
+      const Object& constant = source.constant();
+      if (constant.IsSmi() &&
+          source.constant_instruction()->representation() == kUnboxedInt32) {
+        __ movl(destination.ToStackSlotAddress(),
+                Immediate(Smi::Cast(constant).Value()));
+      } else {
+        StoreObject(destination.ToStackSlotAddress(), source.constant());
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 537a0dd..aa3d0c1 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1337,15 +1337,9 @@
     intptr_t token_pos,
     LocationSummary* locs,
     const ICData& ic_data) {
-  uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (ic_data.NumArgsTested() == 0) {
-    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.NumArgsTested() == 2) {
-    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
-  } else {
-    UNIMPLEMENTED();
-  }
+  const uword label_address =
+      stub_code->UnoptimizedStaticCallEntryPoint(ic_data.NumArgsTested());
   ExternalLabel target_label(label_address);
   __ LoadObject(S5, ic_data);
   GenerateDartCall(deopt_id,
@@ -1542,7 +1536,7 @@
                                         intptr_t token_index,
                                         LocationSummary* locs) {
   ASSERT(is_optimizing());
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfUsedChecks() > 0));
   Label match_found;
   const intptr_t len = ic_data.NumberOfChecks();
   GrowableArray<CidTarget> sorted(len);
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index d11ec6a..d0c60c9 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -991,7 +991,7 @@
         Instructions::HeaderSize() - Instructions::object_pool_offset() +
         __ CodeSize();
     const intptr_t offset =
-        Assembler::kEntryPointToPcMarkerOffset - __ CodeSize();
+        Assembler::EntryPointToPcMarkerOffset() - __ CodeSize();
     __ popq(new_pc);
     if (offset != 0) {
       __ addq(new_pc, Immediate(offset));
@@ -1035,7 +1035,7 @@
         Instructions::HeaderSize() - Instructions::object_pool_offset() +
         __ CodeSize();
     const intptr_t offset =
-        Assembler::kEntryPointToPcMarkerOffset - __ CodeSize();
+        Assembler::EntryPointToPcMarkerOffset() - __ CodeSize();
     __ popq(new_pc);
     if (offset != 0) {
       __ addq(new_pc, Immediate(offset));
@@ -1215,15 +1215,9 @@
     intptr_t token_pos,
     LocationSummary* locs,
     const ICData& ic_data) {
-  uword label_address = 0;
   StubCode* stub_code = isolate()->stub_code();
-  if (ic_data.NumArgsTested() == 0) {
-    label_address = stub_code->ZeroArgsUnoptimizedStaticCallEntryPoint();
-  } else if (ic_data.NumArgsTested() == 2) {
-    label_address = stub_code->TwoArgsUnoptimizedStaticCallEntryPoint();
-  } else {
-    UNIMPLEMENTED();
-  }
+  const uword label_address =
+      stub_code->UnoptimizedStaticCallEntryPoint(ic_data.NumArgsTested());
   ExternalLabel target_label(label_address);
   __ LoadObject(RBX, ic_data, PP);
   GenerateDartCall(deopt_id,
@@ -1475,7 +1469,7 @@
                                         intptr_t token_index,
                                         LocationSummary* locs) {
   ASSERT(is_optimizing());
-  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfChecks() > 0));
+  ASSERT(!ic_data.IsNull() && (ic_data.NumberOfUsedChecks() > 0));
   Label match_found;
   const intptr_t len = ic_data.NumberOfChecks();
   GrowableArray<CidTarget> sorted(len);
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 361a67e..ca7e504 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -362,7 +362,7 @@
         } else if (current->IsStaticCall()) {
           StaticCallInstr* static_call = current->AsStaticCall();
           if (!inline_only_recognized_methods ||
-              static_call->function().is_recognized()) {
+              static_call->function().IsRecognized()) {
             static_calls_.Add(StaticCallInfo(static_call, graph));
           } else {
             // Method not inlined because inlining too deep and method
@@ -1286,12 +1286,9 @@
 
 bool PolymorphicInliner::TryInliningPoly(intptr_t receiver_cid,
                                         const Function& target) {
-  if (!target.IsInlineable()) {
-    if (TryInlineRecognizedMethod(receiver_cid, target)) {
-      owner_->inlined_ = true;
-      return true;
-    }
-    return false;
+  if (TryInlineRecognizedMethod(receiver_cid, target)) {
+    owner_->inlined_ = true;
+    return true;
   }
 
   GrowableArray<Value*> arguments(call_->ArgumentCount());
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index fb8a0a6..72d8d93 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -42,6 +42,9 @@
 DEFINE_FLAG(bool, truncating_left_shift, true,
     "Optimize left shift to truncate if possible");
 DEFINE_FLAG(bool, use_cha, true, "Use class hierarchy analysis.");
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_IA32)
+DEFINE_FLAG(bool, trace_smi_widening, false, "Trace Smi->Int32 widening pass.");
+#endif
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, source_lines);
 DECLARE_FLAG(bool, trace_type_check_elimination);
@@ -112,7 +115,7 @@
 // Attempt to build ICData for call using propagated class-ids.
 bool FlowGraphOptimizer::TryCreateICData(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
-  if (call->ic_data()->NumberOfChecks() > 0) {
+  if (call->ic_data()->NumberOfUsedChecks() > 0) {
     // This occurs when an instance call has too many checks, will be converted
     // to megamorphic call.
     return false;
@@ -195,8 +198,7 @@
                                                       intptr_t cid) {
   ASSERT(ic_data.NumArgsTested() == 1);
 
-  if ((ic_data.NumberOfChecks() == 1) &&
-      (ic_data.GetReceiverClassIdAt(0) == cid)) {
+  if ((ic_data.NumberOfUsedChecks() == 1) && ic_data.HasReceiverClassId(cid)) {
     return ic_data;  // Nothing to do
   }
 
@@ -582,6 +584,13 @@
 }
 
 
+static bool IsUnboxedInteger(Representation rep) {
+  return (rep == kUnboxedInt32) ||
+         (rep == kUnboxedUint32) ||
+         (rep == kUnboxedMint);
+}
+
+
 void FlowGraphOptimizer::InsertConversion(Representation from,
                                           Representation to,
                                           Value* use,
@@ -608,10 +617,25 @@
     converted = new(I) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedMint) && (to == kTagged)) {
     converted = new(I) BoxIntegerInstr(use->CopyWithType());
-  } else if ((from == kUnboxedMint) && (to == kUnboxedUint32)) {
-    converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
-  } else if ((from == kUnboxedUint32) && (to == kUnboxedMint)) {
-    converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
+  } else if (IsUnboxedInteger(from) && IsUnboxedInteger(to)) {
+    const intptr_t deopt_id = (to == kUnboxedInt32) && (deopt_target != NULL) ?
+        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    converted = new(I) UnboxedIntConverterInstr(from,
+                                                to,
+                                                use->CopyWithType(),
+                                                deopt_id);
+  } else if ((from == kUnboxedInt32) && (to == kUnboxedDouble)) {
+    converted = new Int32ToDoubleInstr(use->CopyWithType());
+  } else if ((from == kTagged) && (to == kUnboxedInt32)) {
+    const intptr_t deopt_id = (deopt_target != NULL) ?
+        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    converted = new UnboxInt32Instr(use->CopyWithType(), deopt_id);
+  } else if ((from == kUnboxedInt32) && (to == kTagged)) {
+    converted = new BoxInt32Instr(use->CopyWithType());
+  } else if ((from == kTagged) && (to == kUnboxedUint32)) {
+    const intptr_t deopt_id = (deopt_target != NULL) ?
+        deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
+    converted = new UnboxUint32Instr(use->CopyWithType(), deopt_id);
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
@@ -688,6 +712,10 @@
       boxed = new(I) BoxIntegerInstr(use->CopyWithType());
     } else if (from == kUnboxedFloat64x2) {
       boxed = new(I) BoxFloat64x2Instr(use->CopyWithType());
+    } else if (from == kUnboxedInt32) {
+      boxed = new(I) BoxInt32Instr(use->CopyWithType());
+    } else if (from == kUnboxedUint32) {
+      boxed = new(I) BoxUint32Instr(use->CopyWithType());
     } else {
       UNIMPLEMENTED();
     }
@@ -704,6 +732,10 @@
       converted = new(I) UnboxIntegerInstr(to_value, deopt_id);
     } else if (to == kUnboxedFloat64x2) {
       converted = new(I) UnboxFloat64x2Instr(to_value, deopt_id);
+    } else if (to == kUnboxedInt32) {
+      boxed = new(I) UnboxInt32Instr(use->CopyWithType(), deopt_id);
+    } else if (to == kUnboxedUint32) {
+      boxed = new(I) UnboxUint32Instr(use->CopyWithType(), deopt_id);
     } else {
       UNIMPLEMENTED();
     }
@@ -716,6 +748,12 @@
   } else {
     use->BindTo(converted);
   }
+
+  if ((to == kUnboxedInt32) && (phi != NULL)) {
+    // Int32 phis are unboxed optimistically. Ensure that unboxing
+    // has deoptimization target attached from the goto instruction.
+    flow_graph_->CopyDeoptTarget(converted, insert_before);
+  }
 }
 
 
@@ -762,10 +800,8 @@
 }
 
 
-// Returns true if phi's representation was changed.
-static bool UnboxPhi(PhiInstr* phi) {
-  Representation current = phi->representation();
-  Representation unboxed = current;
+static void UnboxPhi(PhiInstr* phi) {
+  Representation unboxed = phi->representation();
 
   switch (phi->Type()->ToCid()) {
     case kDoubleCid:
@@ -783,14 +819,14 @@
         unboxed = kUnboxedInt32x4;
       }
       break;
+    case kFloat64x2Cid:
+      if (ShouldInlineSimd()) {
+        unboxed = kUnboxedFloat64x2;
+      }
+      break;
   }
 
-  if (unboxed != current) {
-    phi->set_representation(unboxed);
-    return true;
-  }
-
-  return false;
+  phi->set_representation(unboxed);
 }
 
 
@@ -844,31 +880,10 @@
 }
 
 
-static bool ICDataHasReceiverArgumentClassIds(const ICData& ic_data,
-                                              intptr_t receiver_class_id,
-                                              intptr_t argument_class_id) {
-  ASSERT(receiver_class_id != kIllegalCid);
-  ASSERT(argument_class_id != kIllegalCid);
-  if (ic_data.NumArgsTested() != 2) return false;
-
-  Function& target = Function::Handle();
-  const intptr_t len = ic_data.NumberOfChecks();
-  for (intptr_t i = 0; i < len; i++) {
-    GrowableArray<intptr_t> class_ids;
-    ic_data.GetCheckAt(i, &class_ids, &target);
-    ASSERT(class_ids.length() == 2);
-    if ((class_ids[0] == receiver_class_id) &&
-        (class_ids[1] == argument_class_id)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-
 static bool ClassIdIsOneOf(intptr_t class_id,
                            const GrowableArray<intptr_t>& class_ids) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
+    ASSERT(class_ids[i] != kIllegalCid);
     if (class_ids[i] == class_id) {
       return true;
     }
@@ -883,51 +898,80 @@
     const ICData& ic_data,
     const GrowableArray<intptr_t>& receiver_class_ids,
     const GrowableArray<intptr_t>& argument_class_ids) {
-  if (ic_data.NumArgsTested() != 2) return false;
+  if (ic_data.NumArgsTested() != 2) {
+    return false;
+  }
   Function& target = Function::Handle();
   const intptr_t len = ic_data.NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
-    GrowableArray<intptr_t> class_ids;
-    ic_data.GetCheckAt(i, &class_ids, &target);
-    ASSERT(class_ids.length() == 2);
-    if (!ClassIdIsOneOf(class_ids[0], receiver_class_ids) ||
-        !ClassIdIsOneOf(class_ids[1], argument_class_ids)) {
-      return false;
+    if (ic_data.IsUsedAt(i)) {
+      GrowableArray<intptr_t> class_ids;
+      ic_data.GetCheckAt(i, &class_ids, &target);
+      ASSERT(class_ids.length() == 2);
+      if (!ClassIdIsOneOf(class_ids[0], receiver_class_ids) ||
+          !ClassIdIsOneOf(class_ids[1], argument_class_ids)) {
+        return false;
+      }
     }
   }
   return true;
 }
 
 
+static bool ICDataHasReceiverArgumentClassIds(const ICData& ic_data,
+                                              intptr_t receiver_class_id,
+                                              intptr_t argument_class_id) {
+  GrowableArray<intptr_t> receiver_cids(1);
+  receiver_cids.Add(receiver_class_id);
+  GrowableArray<intptr_t> argument_cids(1);
+  argument_cids.Add(argument_class_id);
+  return ICDataHasOnlyReceiverArgumentClassIds(
+      ic_data, receiver_cids, argument_cids);
+}
+
+
 static bool HasOnlyOneSmi(const ICData& ic_data) {
-  return (ic_data.NumberOfChecks() == 1)
+  return (ic_data.NumberOfUsedChecks() == 1)
       && ic_data.HasReceiverClassId(kSmiCid);
 }
 
 
 static bool HasOnlySmiOrMint(const ICData& ic_data) {
-  if (ic_data.NumberOfChecks() == 1) {
+  if (ic_data.NumberOfUsedChecks() == 1) {
     return ic_data.HasReceiverClassId(kSmiCid)
         || ic_data.HasReceiverClassId(kMintCid);
   }
-  return (ic_data.NumberOfChecks() == 2)
+  return (ic_data.NumberOfUsedChecks() == 2)
       && ic_data.HasReceiverClassId(kSmiCid)
       && ic_data.HasReceiverClassId(kMintCid);
 }
 
 
 static bool HasOnlyTwoOf(const ICData& ic_data, intptr_t cid) {
-  return (ic_data.NumberOfChecks() == 1) &&
-      ICDataHasReceiverArgumentClassIds(ic_data, cid, cid);
+  if (ic_data.NumberOfUsedChecks() != 1) {
+    return false;
+  }
+  GrowableArray<intptr_t> first;
+  GrowableArray<intptr_t> second;
+  ic_data.GetUsedCidsForTwoArgs(&first, &second);
+  return (first[0] == cid) && (second[0] == cid);
 }
 
 // Returns false if the ICData contains anything other than the 4 combinations
 // of Mint and Smi for the receiver and argument classes.
 static bool HasTwoMintOrSmi(const ICData& ic_data) {
-  GrowableArray<intptr_t> class_ids(2);
-  class_ids.Add(kSmiCid);
-  class_ids.Add(kMintCid);
-  return ICDataHasOnlyReceiverArgumentClassIds(ic_data, class_ids, class_ids);
+  GrowableArray<intptr_t> first;
+  GrowableArray<intptr_t> second;
+  ic_data.GetUsedCidsForTwoArgs(&first, &second);
+  for (intptr_t i = 0; i < first.length(); i++) {
+    if ((first[i] != kSmiCid) && (first[i] != kMintCid)) {
+      return false;
+    }
+    if ((second[i] != kSmiCid) && (second[i] != kMintCid)) {
+      return false;
+    }
+  }
+  return true;
 }
 
 
@@ -942,7 +986,7 @@
 
 
 static bool HasOnlyOneDouble(const ICData& ic_data) {
-  return (ic_data.NumberOfChecks() == 1)
+  return (ic_data.NumberOfUsedChecks() == 1)
       && ic_data.HasReceiverClassId(kDoubleCid);
 }
 
@@ -997,8 +1041,8 @@
                                                const ICData& unary_checks,
                                                intptr_t deopt_id,
                                                intptr_t token_pos) {
-  if ((unary_checks.NumberOfChecks() == 1) &&
-      (unary_checks.GetReceiverClassIdAt(0) == kSmiCid)) {
+  if ((unary_checks.NumberOfUsedChecks() == 1) &&
+      unary_checks.HasReceiverClassId(kSmiCid)) {
     return new(I) CheckSmiInstr(new(I) Value(to_check),
                                 deopt_id,
                                 token_pos);
@@ -1033,10 +1077,14 @@
                         const ICData& ic_data,
                         intptr_t arg_number) {
   ASSERT(ic_data.NumArgsTested() > arg_number);
+  if (ic_data.NumberOfUsedChecks() == 0) {
+    return false;
+  }
   const intptr_t num_checks = ic_data.NumberOfChecks();
-  if (num_checks == 0) return false;
   for (intptr_t i = 0; i < num_checks; i++) {
-    if (ic_data.GetClassIdAt(i, arg_number) != cid) return false;
+    if (ic_data.IsUsedAt(i) && ic_data.GetClassIdAt(i, arg_number) != cid) {
+      return false;
+    }
   }
   return true;
 }
@@ -1130,7 +1178,10 @@
   if (!call->HasICData()) return false;
   const ICData& ic_data =
       ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
-  if (ic_data.NumberOfChecks() != 1) return false;
+  if (ic_data.NumberOfChecks() != 1) {
+    return false;
+  }
+  ASSERT(ic_data.NumberOfUsedChecks() == 1);
   ASSERT(ic_data.HasOneTarget());
 
   const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
@@ -1556,6 +1607,14 @@
       return InlineStringCodeUnitAt(call, receiver_cid, entry, last);
     case MethodRecognizer::kStringBaseCharAt:
       return InlineStringBaseCharAt(call, receiver_cid, entry, last);
+    case MethodRecognizer::kDoubleAdd:
+      return InlineDoubleOp(Token::kADD, call, entry, last);
+    case MethodRecognizer::kDoubleSub:
+      return InlineDoubleOp(Token::kSUB, call, entry, last);
+    case MethodRecognizer::kDoubleMul:
+      return InlineDoubleOp(Token::kMUL, call, entry, last);
+    case MethodRecognizer::kDoubleDiv:
+      return InlineDoubleOp(Token::kDIV, call, entry, last);
     default:
       return false;
   }
@@ -1689,7 +1748,10 @@
   if (!call->HasICData()) return false;
   const ICData& ic_data =
       ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
-  if (ic_data.NumberOfChecks() != 1) return false;
+  if (ic_data.NumberOfChecks() != 1) {
+    return false;
+  }
+  ASSERT(ic_data.NumberOfUsedChecks() == 1);
   ASSERT(ic_data.HasOneTarget());
 
   const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
@@ -2267,7 +2329,7 @@
 // receiver is the same as the caller's receiver and there are no overriden
 // callee functions, then no class check is needed.
 bool FlowGraphOptimizer::InstanceCallNeedsClassCheck(
-    InstanceCallInstr* call) const {
+    InstanceCallInstr* call, RawFunction::Kind kind) const {
   if (!FLAG_use_cha) return true;
   Definition* callee_receiver = call->ArgumentAt(0);
   ASSERT(callee_receiver != NULL);
@@ -2275,26 +2337,11 @@
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
+    const String& name = (kind == RawFunction::kMethodExtractor)
+        ? String::Handle(I, Field::NameFromGetter(call->function_name()))
+        : call->function_name();
     return isolate()->cha()->HasOverride(Class::Handle(I, function.Owner()),
-                                         call->function_name());
-  }
-  return true;
-}
-
-
-bool FlowGraphOptimizer::MethodExtractorNeedsClassCheck(
-    InstanceCallInstr* call) const {
-  if (!FLAG_use_cha) return true;
-  Definition* callee_receiver = call->ArgumentAt(0);
-  ASSERT(callee_receiver != NULL);
-  const Function& function = flow_graph_->parsed_function().function();
-  if (function.IsDynamicFunction() &&
-      callee_receiver->IsParameter() &&
-      (callee_receiver->AsParameter()->index() == 0)) {
-    const String& field_name =
-      String::Handle(I, Field::NameFromGetter(call->function_name()));
-    return isolate()->cha()->HasOverride(
-        Class::Handle(I, function.Owner()), field_name);
+                                         name);
   }
   return true;
 }
@@ -2315,7 +2362,7 @@
       Field::ZoneHandle(I, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
-  if (InstanceCallNeedsClassCheck(call)) {
+  if (InstanceCallNeedsClassCheck(call, RawFunction::kImplicitGetter)) {
     AddReceiverCheck(call);
   }
   LoadFieldInstr* load = new(I) LoadFieldInstr(
@@ -2347,21 +2394,6 @@
 }
 
 
-LoadFieldInstr* FlowGraphOptimizer::BuildLoadStringLength(Definition* str) {
-  // Treat length loads as mutable (i.e. affected by side effects) to avoid
-  // hoisting them since we can't hoist the preceding class-check. This
-  // is because of externalization of strings that affects their class-id.
-  LoadFieldInstr* load = new(I) LoadFieldInstr(
-      new(I) Value(str),
-      String::length_offset(),
-      Type::ZoneHandle(I, Type::SmiType()),
-      str->token_pos());
-  load->set_result_cid(kSmiCid);
-  load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
-  return load;
-}
-
-
 bool FlowGraphOptimizer::InlineFloat32x4Getter(InstanceCallInstr* call,
                                                MethodRecognizer::Kind getter) {
   if (!ShouldInlineSimd()) {
@@ -2639,7 +2671,7 @@
 bool FlowGraphOptimizer::TryInlineInstanceGetter(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
-  if (ic_data.NumberOfChecks() == 0) {
+  if (ic_data.NumberOfUsedChecks() == 0) {
     // No type feedback collected.
     return false;
   }
@@ -2722,7 +2754,17 @@
                                   FlowGraph::kEffect);
 
   // Load the length of the string.
-  LoadFieldInstr* length = BuildLoadStringLength(str);
+  // Treat length loads as mutable (i.e. affected by side effects) to avoid
+  // hoisting them since we can't hoist the preceding class-check. This
+  // is because of externalization of strings that affects their class-id.
+  LoadFieldInstr* length = new(I) LoadFieldInstr(
+      new(I) Value(str),
+      String::length_offset(),
+      Type::ZoneHandle(I, Type::SmiType()),
+      str->token_pos());
+  length->set_result_cid(kSmiCid);
+  length->set_recognized_kind(MethodRecognizer::kStringBaseLength);
+
   cursor = flow_graph()->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
   cursor = flow_graph()->AppendTo(cursor,
@@ -2801,6 +2843,30 @@
 }
 
 
+bool FlowGraphOptimizer::InlineDoubleOp(
+    Token::Kind op_kind,
+    Instruction* call,
+    TargetEntryInstr** entry,
+    Definition** last) {
+  Definition* left = call->ArgumentAt(0);
+  Definition* right = call->ArgumentAt(1);
+
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
+  // Arguments are checked. No need for class check.
+  BinaryDoubleOpInstr* double_bin_op =
+      new(I) BinaryDoubleOpInstr(op_kind,
+                                 new(I) Value(left),
+                                 new(I) Value(right),
+                                 call->deopt_id(), call->token_pos());
+  flow_graph()->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue);
+  *last = double_bin_op;
+
+  return true;
+}
+
+
 void FlowGraphOptimizer::ReplaceWithMathCFunction(
     InstanceCallInstr* call,
     MethodRecognizer::Kind recognized_kind) {
@@ -2845,7 +2911,7 @@
 bool FlowGraphOptimizer::TryInlineInstanceMethod(InstanceCallInstr* call) {
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
-  if ((ic_data.NumberOfChecks() == 0) || !ic_data.HasOneTarget()) {
+  if ((ic_data.NumberOfUsedChecks() == 0) || !ic_data.HasOneTarget()) {
     // No type feedback collected or multiple targets found.
     return false;
   }
@@ -2971,6 +3037,11 @@
           ReplaceCall(call, d2d_instr);
         }
         return true;
+      case MethodRecognizer::kDoubleAdd:
+      case MethodRecognizer::kDoubleSub:
+      case MethodRecognizer::kDoubleMul:
+      case MethodRecognizer::kDoubleDiv:
+        return TryReplaceInstanceCallWithInline(call);
       default:
         // Unsupported method.
         return false;
@@ -3233,6 +3304,16 @@
             new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
+  } else if (recognized_kind == MethodRecognizer::kInt32x4Constructor) {
+    Int32x4ConstructorInstr* con =
+        new(I) Int32x4ConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
+            new(I) Value(call->ArgumentAt(3)),
+            new(I) Value(call->ArgumentAt(4)),
+            call->deopt_id());
+    ReplaceCall(call, con);
+    return true;
   }
   return false;
 }
@@ -3755,17 +3836,20 @@
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
 
-  ConstantInstr* length_adjustment =
-      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(
-          Instance::ElementSizeFor(view_cid) - 1)));
   // adjusted_length = len_in_bytes - (element_size - 1).
-  BinarySmiOpInstr* adjusted_length =
-      new(I) BinarySmiOpInstr(Token::kSUB,
-                              new(I) Value(len_in_bytes),
-                              new(I) Value(length_adjustment),
-                              call->deopt_id(), call->token_pos());
-  *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
-                                   FlowGraph::kValue);
+  Definition* adjusted_length = len_in_bytes;
+  intptr_t adjustment = Instance::ElementSizeFor(view_cid) - 1;
+  if (adjustment > 0) {
+    ConstantInstr* length_adjustment =
+        flow_graph()->GetConstant(Smi::Handle(I, Smi::New(adjustment)));
+    adjusted_length =
+        new(I) BinarySmiOpInstr(Token::kSUB,
+                                new(I) Value(len_in_bytes),
+                                new(I) Value(length_adjustment),
+                                call->deopt_id(), call->token_pos());
+    *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
+                                     FlowGraph::kValue);
+  }
 
   // Check adjusted_length > 0.
   ConstantInstr* zero =
@@ -4130,7 +4214,7 @@
 // Tries to optimize instance call by replacing it with a faster instruction
 // (e.g, binary op, field load, ..).
 void FlowGraphOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
-  if (!instr->HasICData() || (instr->ic_data()->NumberOfChecks() == 0)) {
+  if (!instr->HasICData() || (instr->ic_data()->NumberOfUsedChecks() == 0)) {
     return;
   }
 
@@ -4149,11 +4233,11 @@
   const ICData& unary_checks =
       ICData::ZoneHandle(I, instr->ic_data()->AsUnaryClassChecks());
 
-  intptr_t max_checks = (op_kind == Token::kEQ)
+  const intptr_t max_checks = (op_kind == Token::kEQ)
       ? FLAG_max_equality_polymorphic_checks
       : FLAG_max_polymorphic_checks;
   if ((unary_checks.NumberOfChecks() > max_checks) &&
-      InstanceCallNeedsClassCheck(instr)) {
+      InstanceCallNeedsClassCheck(instr, RawFunction::kRegularFunction)) {
     // Too many checks, it will be megamorphic which needs unary checks.
     instr->set_ic_data(&unary_checks);
     return;
@@ -4206,11 +4290,9 @@
   }
 
   if (has_one_target) {
-    const bool is_method_extraction =
-        Function::Handle(I, unary_checks.GetTargetAt(0)).IsMethodExtractor();
-
-    if ((is_method_extraction && !MethodExtractorNeedsClassCheck(instr)) ||
-        (!is_method_extraction && !InstanceCallNeedsClassCheck(instr))) {
+    RawFunction::Kind function_kind =
+        Function::Handle(I, unary_checks.GetTargetAt(0)).kind();
+    if (!InstanceCallNeedsClassCheck(instr, function_kind)) {
       const bool call_with_checks = false;
       PolymorphicInstanceCallInstr* call =
           new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
@@ -4275,7 +4357,8 @@
              (recognized_kind == MethodRecognizer::kFloat64x2Splat) ||
              (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4)) {
     TryInlineFloat64x2Constructor(call, recognized_kind);
-  } else if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
+  } else if ((recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) ||
+             (recognized_kind == MethodRecognizer::kInt32x4Constructor)) {
     TryInlineInt32x4Constructor(call, recognized_kind);
   } else if (recognized_kind == MethodRecognizer::kObjectConstructor) {
     // Remove the original push arguments.
@@ -4338,12 +4421,23 @@
                                         recognized_kind,
                                         call->token_pos());
     ReplaceCall(call, invoke);
-  } else if (recognized_kind == MethodRecognizer::kObjectArrayConstructor) {
-    Value* type = new(I) Value(call->ArgumentAt(0));
-    Value* num_elements = new(I) Value(call->ArgumentAt(1));
-    CreateArrayInstr* create_array =
-        new(I) CreateArrayInstr(call->token_pos(), type, num_elements);
-    ReplaceCall(call, create_array);
+  } else if (recognized_kind == MethodRecognizer::kDoubleFromInteger) {
+    if (call->HasICData() && (call->ic_data()->NumberOfChecks() == 1)) {
+      const ICData& ic_data = *call->ic_data();
+      if (CanUnboxDouble() && ArgIsAlways(kSmiCid, ic_data, 0)) {
+        Definition* arg = call->ArgumentAt(0);
+        InsertBefore(call,
+                     new(I) CheckSmiInstr(
+                         new(I) Value(arg),
+                         call->deopt_id(),
+                         call->token_pos()),
+                     call->env(),
+                     FlowGraph::kEffect);
+        ReplaceCall(call,
+                    new(I) SmiToDoubleInstr(new(I) Value(arg),
+                                            call->token_pos()));
+      }
+    }
   } else if (call->function().IsFactory()) {
     const Class& function_class =
         Class::Handle(I, call->function().Owner());
@@ -4384,7 +4478,7 @@
     // executed.
     const Field& field = Field::ZoneHandle(I, instr->field().raw());
     const String& field_name = String::Handle(I, field.name());
-    class Class& owner = Class::Handle(I, field.owner());
+    const Class& owner = Class::Handle(I, field.owner());
     const Function& getter =
         Function::Handle(I, owner.LookupGetterFunction(field_name));
     const Function& setter =
@@ -4407,6 +4501,37 @@
 }
 
 
+void FlowGraphOptimizer::VisitAllocateContext(AllocateContextInstr* instr) {
+  // Replace generic allocation with a sequence of inlined allocation and
+  // explicit initalizing stores.
+  AllocateUninitializedContextInstr* replacement =
+      new AllocateUninitializedContextInstr(instr->token_pos(),
+                                            instr->num_context_variables());
+  instr->ReplaceWith(replacement, current_iterator());
+
+  StoreInstanceFieldInstr* store =
+      new(I) StoreInstanceFieldInstr(Context::parent_offset(),
+                                     new Value(replacement),
+                                     new Value(flow_graph_->constant_null()),
+                                     kNoStoreBarrier,
+                                     instr->token_pos());
+  store->set_is_initialization(true);  // Won't be eliminated by DSE.
+  flow_graph_->InsertAfter(replacement, store, NULL, FlowGraph::kEffect);
+  Definition* cursor = store;
+  for (intptr_t i = 0; i < instr->num_context_variables(); ++i) {
+    store =
+        new(I) StoreInstanceFieldInstr(Context::variable_offset(i),
+                                       new Value(replacement),
+                                       new Value(flow_graph_->constant_null()),
+                                       kNoStoreBarrier,
+                                       instr->token_pos());
+    store->set_is_initialization(true);  // Won't be eliminated by DSE.
+    flow_graph_->InsertAfter(cursor, store, NULL, FlowGraph::kEffect);
+    cursor = store;
+  }
+}
+
+
 bool FlowGraphOptimizer::TryInlineInstanceSetter(InstanceCallInstr* instr,
                                                  const ICData& unary_ic_data) {
   ASSERT((unary_ic_data.NumberOfChecks() > 0) &&
@@ -4441,7 +4566,7 @@
       Field::ZoneHandle(I, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
-  if (InstanceCallNeedsClassCheck(instr)) {
+  if (InstanceCallNeedsClassCheck(instr, RawFunction::kImplicitSetter)) {
     AddReceiverCheck(instr);
   }
   StoreBarrierType needs_store_barrier = kEmitStoreBarrier;
@@ -4496,6 +4621,267 @@
 }
 
 
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_IA32)
+// Smi widening pass is only meaningful on platforms where Smi
+// is smaller than 32bit. For now only support it on ARM and ia32.
+
+class DefinitionWorklist {
+ public:
+  DefinitionWorklist(FlowGraph* flow_graph,
+                     intptr_t initial_capacity)
+      : defs_(initial_capacity),
+        contains_(new BitVector(flow_graph->current_ssa_temp_index())) {
+  }
+
+  void Add(Definition* defn) {
+    if (!Contains(defn)) {
+      defs_.Add(defn);
+      contains_->Add(defn->ssa_temp_index());
+    }
+  }
+
+  bool Contains(Definition* defn) const {
+    return (defn->ssa_temp_index() >= 0) &&
+        contains_->Contains(defn->ssa_temp_index());
+  }
+
+  const GrowableArray<Definition*>& definitions() const { return defs_; }
+  BitVector* contains() const { return contains_; }
+
+  void Clear() {
+    defs_.TruncateTo(0);
+    contains_->Clear();
+  }
+
+ private:
+  GrowableArray<Definition*> defs_;
+  BitVector* contains_;
+};
+
+
+static bool CanBeWidened(BinarySmiOpInstr* smi_op) {
+  return BinaryInt32OpInstr::IsSupported(smi_op->op_kind(),
+                                         smi_op->left(),
+                                         smi_op->right());
+}
+
+
+static bool BenefitsFromWidening(BinarySmiOpInstr* smi_op) {
+  // TODO(vegorov): when shifts with non-constants shift count are supported
+  // add them here as we save untagging for the count.
+  switch (smi_op->op_kind()) {
+    case Token::kMUL:
+    case Token::kSHR:
+      // For kMUL we save untagging of the argument for kSHR
+      // we save tagging of the result.
+      return true;
+
+    default:
+      return false;
+  }
+}
+
+
+void FlowGraphOptimizer::WidenSmiToInt32() {
+  GrowableArray<BinarySmiOpInstr*> candidates;
+
+  // Step 1. Collect all instructions that potentially benefit from widening of
+  // their operands (or their result) into int32 range.
+  for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
+       !block_it.Done();
+       block_it.Advance()) {
+    for (ForwardInstructionIterator instr_it(block_it.Current());
+         !instr_it.Done();
+         instr_it.Advance()) {
+      BinarySmiOpInstr* smi_op = instr_it.Current()->AsBinarySmiOp();
+      if (smi_op != NULL &&
+          BenefitsFromWidening(smi_op) &&
+          CanBeWidened(smi_op)) {
+        candidates.Add(smi_op);
+      }
+    }
+  }
+
+  if (candidates.length() == 0) {
+    return;
+  }
+
+  // Step 2. For each block in the graph compute which loop it belongs to.
+  // We will use this information later during computation of the widening's
+  // gain: we are going to assume that only conversion occuring inside the
+  // same loop should be counted against the gain, all other conversions
+  // can be hoisted and thus cost nothing compared to the loop cost itself.
+  const ZoneGrowableArray<BlockEntryInstr*>& loop_headers =
+    flow_graph()->loop_headers();
+
+  GrowableArray<intptr_t> loops(flow_graph_->preorder().length());
+  for (intptr_t i = 0; i < flow_graph_->preorder().length(); i++) {
+    loops.Add(-1);
+  }
+
+  for (intptr_t loop_id = 0; loop_id < loop_headers.length(); ++loop_id) {
+    for (BitVector::Iterator loop_it(loop_headers[loop_id]->loop_info());
+         !loop_it.Done();
+         loop_it.Advance()) {
+      loops[loop_it.Current()] = loop_id;
+    }
+  }
+
+  // Step 3. For each candidate transitively collect all other BinarySmiOpInstr
+  // and PhiInstr that depend on it and that it depends on and count amount of
+  // untagging operations that we save in assumption that this whole graph of
+  // values is using kUnboxedInt32 representation instead of kTagged.
+  // Convert those graphs that have positive gain to kUnboxedInt32.
+
+  // BitVector containing SSA indexes of all processed definitions. Used to skip
+  // those candidates that belong to dependency graph of another candidate.
+  BitVector* processed = new BitVector(flow_graph_->current_ssa_temp_index());
+
+  // Worklist used to collect dependency graph.
+  DefinitionWorklist worklist(flow_graph_, candidates.length());
+  for (intptr_t i = 0; i < candidates.length(); i++) {
+    BinarySmiOpInstr* op = candidates[i];
+    if (op->WasEliminated() || processed->Contains(op->ssa_temp_index())) {
+      continue;
+    }
+
+    if (FLAG_trace_smi_widening) {
+      OS::Print("analysing candidate: %s\n", op->ToCString());
+    }
+    worklist.Clear();
+    worklist.Add(op);
+
+    // Collect dependency graph. Note: more items are added to worklist
+    // inside this loop.
+    intptr_t gain = 0;
+    for (intptr_t j = 0; j < worklist.definitions().length(); j++) {
+      Definition* defn = worklist.definitions()[j];
+
+      if (FLAG_trace_smi_widening) {
+        OS::Print("> %s\n", defn->ToCString());
+      }
+
+      if (defn->IsBinarySmiOp() &&
+          BenefitsFromWidening(defn->AsBinarySmiOp())) {
+        gain++;
+        if (FLAG_trace_smi_widening) {
+          OS::Print("^ [%" Pd "] (o) %s\n", gain, defn->ToCString());
+        }
+      }
+
+      const intptr_t defn_loop = loops[defn->GetBlock()->preorder_number()];
+
+      // Process all inputs.
+      for (intptr_t k = 0; k < defn->InputCount(); k++) {
+        Definition* input = defn->InputAt(k)->definition();
+        if (input->IsBinarySmiOp() &&
+            CanBeWidened(input->AsBinarySmiOp())) {
+          worklist.Add(input);
+        } else if (input->IsPhi() && input->Type()->ToCid() == kSmiCid) {
+          worklist.Add(input);
+        } else if (input->IsBinaryMintOp()) {
+          // Mint operation produces untagged result. We avoid tagging.
+          gain++;
+          if (FLAG_trace_smi_widening) {
+            OS::Print("^ [%" Pd "] (i) %s\n", gain, input->ToCString());
+          }
+        } else if (defn_loop == loops[input->GetBlock()->preorder_number()] &&
+                   (input->Type()->ToCid() == kSmiCid)) {
+          // Input comes from the same loop, is known to be smi and requires
+          // untagging.
+          // TODO(vegorov) this heuristic assumes that values that are not
+          // known to be smi have to be checked and this check can be
+          // coalesced with untagging. Start coalescing them.
+          gain--;
+          if (FLAG_trace_smi_widening) {
+            OS::Print("v [%" Pd "] (i) %s\n", gain, input->ToCString());
+          }
+        }
+      }
+
+      // Process all uses.
+      for (Value* use = defn->input_use_list();
+           use != NULL;
+           use = use->next_use()) {
+        Instruction* instr = use->instruction();
+        Definition* use_defn = instr->AsDefinition();
+        if (use_defn == NULL) {
+          // We assume that tagging before returning or pushing argument costs
+          // very little compared to the cost of the return/call itself.
+          if (!instr->IsReturn() && !instr->IsPushArgument()) {
+            gain--;
+            if (FLAG_trace_smi_widening) {
+              OS::Print("v [%" Pd "] (u) %s\n",
+                        gain,
+                        use->instruction()->ToCString());
+            }
+          }
+          continue;
+        } else if (use_defn->IsBinarySmiOp() &&
+                   CanBeWidened(use_defn->AsBinarySmiOp())) {
+          worklist.Add(use_defn);
+        } else if (use_defn->IsPhi() &&
+                   use_defn->AsPhi()->Type()->ToCid() == kSmiCid) {
+          worklist.Add(use_defn);
+        } else if (use_defn->IsBinaryMintOp()) {
+          // BinaryMintOp requires untagging of its inputs.
+          // Converting kUnboxedInt32 to kUnboxedMint is essentially zero cost
+          // sign extension operation.
+          gain++;
+          if (FLAG_trace_smi_widening) {
+            OS::Print("^ [%" Pd "] (u) %s\n",
+                      gain,
+                      use->instruction()->ToCString());
+          }
+        } else if (defn_loop == loops[instr->GetBlock()->preorder_number()]) {
+          gain--;
+          if (FLAG_trace_smi_widening) {
+            OS::Print("v [%" Pd "] (u) %s\n",
+                      gain,
+                      use->instruction()->ToCString());
+          }
+        }
+      }
+    }
+
+    processed->AddAll(worklist.contains());
+
+    if (FLAG_trace_smi_widening) {
+      OS::Print("~ %s gain %" Pd "\n", op->ToCString(), gain);
+    }
+
+    if (gain > 0) {
+      // We have positive gain from widening. Convert all BinarySmiOpInstr into
+      // BinaryInt32OpInstr and set representation of all phis to kUnboxedInt32.
+      for (intptr_t j = 0; j < worklist.definitions().length(); j++) {
+        Definition* defn = worklist.definitions()[j];
+        ASSERT(defn->IsPhi() || defn->IsBinarySmiOp());
+
+        if (defn->IsBinarySmiOp()) {
+          BinarySmiOpInstr* smi_op = defn->AsBinarySmiOp();
+          BinaryInt32OpInstr* int32_op = new(I) BinaryInt32OpInstr(
+            smi_op->op_kind(),
+            smi_op->left()->CopyWithType(),
+            smi_op->right()->CopyWithType(),
+            smi_op->DeoptimizationTarget());
+
+          smi_op->ReplaceWith(int32_op, NULL);
+        } else if (defn->IsPhi()) {
+          defn->AsPhi()->set_representation(kUnboxedInt32);
+        }
+      }
+    }
+  }
+}
+#else
+void FlowGraphOptimizer::WidenSmiToInt32() {
+  // TODO(vegorov) ideally on 64-bit platforms we would like to narrow smi
+  // operations to 32-bit where it saves tagging and untagging and allows
+  // to use shorted (and faster) instructions. But we currently don't
+  // save enough range information in the ICData to drive this decision.
+}
+#endif
+
 void FlowGraphOptimizer::InferIntRanges() {
   RangeAnalysis range_analysis(flow_graph_);
   range_analysis.Analyze();
@@ -4603,7 +4989,11 @@
   }
   // Move the instruction out of the loop.
   current->RemoveEnvironment();
-  it->RemoveCurrentFromGraph();
+  if (it != NULL) {
+    it->RemoveCurrentFromGraph();
+  } else {
+    current->RemoveFromGraph();
+  }
   GotoInstr* last = pre_header->last_instruction()->AsGoto();
   // Using kind kEffect will not assign a fresh ssa temporary index.
   flow_graph()->InsertBefore(last, current, last->env(), FlowGraph::kEffect);
@@ -4611,17 +5001,10 @@
 }
 
 
-void LICM::TryHoistCheckSmiThroughPhi(ForwardInstructionIterator* it,
-                                      BlockEntryInstr* header,
-                                      BlockEntryInstr* pre_header,
-                                      CheckSmiInstr* current) {
-  PhiInstr* phi = current->value()->definition()->AsPhi();
-  if (!header->loop_info()->Contains(phi->block()->preorder_number())) {
-    return;
-  }
-
+void LICM::TrySpecializeSmiPhi(PhiInstr* phi,
+                               BlockEntryInstr* header,
+                               BlockEntryInstr* pre_header) {
   if (phi->Type()->ToCid() == kSmiCid) {
-    it->RemoveCurrentFromGraph();
     return;
   }
 
@@ -4648,11 +5031,22 @@
     return;
   }
 
+  CheckSmiInstr* check = NULL;
+  for (Value* use = phi->input_use_list();
+       (use != NULL) && (check == NULL);
+       use = use->next_use()) {
+    check = use->instruction()->AsCheckSmi();
+  }
+
+  if (check == NULL) {
+    return;
+  }
+
   // Host CheckSmi instruction and make this phi smi one.
-  Hoist(it, pre_header, current);
+  Hoist(NULL, pre_header, check);
 
   // Replace value we are checking with phi's input.
-  current->value()->BindTo(phi->InputAt(non_smi_input)->definition());
+  check->value()->BindTo(phi->InputAt(non_smi_input)->definition());
 
   phi->UpdateType(CompileType::FromCid(kSmiCid));
 }
@@ -4678,6 +5072,29 @@
 }
 
 
+void LICM::OptimisticallySpecializeSmiPhis() {
+  if (!flow_graph()->parsed_function().function().
+          allows_hoisting_check_class()) {
+    // Do not hoist any.
+    return;
+  }
+
+  const ZoneGrowableArray<BlockEntryInstr*>& loop_headers =
+      flow_graph()->loop_headers();
+
+  for (intptr_t i = 0; i < loop_headers.length(); ++i) {
+    JoinEntryInstr* header = loop_headers[i]->AsJoinEntry();
+    // Skip loop that don't have a pre-header block.
+    BlockEntryInstr* pre_header = FindPreHeader(header);
+    if (pre_header == NULL) continue;
+
+    for (PhiIterator it(header); !it.Done(); it.Advance()) {
+      TrySpecializeSmiPhi(it.Current(), header, pre_header);
+    }
+  }
+}
+
+
 void LICM::Optimize() {
   if (!flow_graph()->parsed_function().function().
           allows_hoisting_check_class()) {
@@ -4724,10 +5141,6 @@
             // TODO(fschneider): Enable hoisting of Assert-instructions
             // if it safe to do.
             Hoist(&it, pre_header, current);
-          } else if (current->IsCheckSmi() &&
-                     current->InputAt(0)->definition()->IsPhi()) {
-            TryHoistCheckSmiThroughPhi(
-                &it, header, pre_header, current->AsCheckSmi());
           }
         }
       }
@@ -7557,6 +7970,11 @@
 }
 
 
+void ConstantPropagator::VisitInitStaticField(InitStaticFieldInstr* instr) {
+  // Nothing to do.
+}
+
+
 void ConstantPropagator::VisitLoadStaticField(LoadStaticFieldInstr* instr) {
   const Field& field = instr->StaticField();
   ASSERT(field.is_static());
@@ -7733,6 +8151,12 @@
 }
 
 
+void ConstantPropagator::VisitAllocateUninitializedContext(
+    AllocateUninitializedContextInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitCloneContext(CloneContextInstr* instr) {
   SetValue(instr, non_constant_);
 }
@@ -7829,6 +8253,11 @@
 }
 
 
+void ConstantPropagator::VisitBinaryInt32Op(BinaryInt32OpInstr* instr) {
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+}
+
+
 void ConstantPropagator::VisitBoxInteger(BoxIntegerInstr* instr) {
   // TODO(kmillikin): Handle box operation.
   SetValue(instr, non_constant_);
@@ -7890,6 +8319,17 @@
 }
 
 
+void ConstantPropagator::VisitInt32ToDouble(Int32ToDoubleInstr* instr) {
+  const Object& value = instr->value()->definition()->constant_value();
+  if (IsConstant(value) && value.IsInteger()) {
+    SetValue(instr, Double::Handle(I,
+        Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
+  } else if (IsNonConstant(value)) {
+    SetValue(instr, non_constant_);
+  }
+}
+
+
 void ConstantPropagator::VisitDoubleToInteger(DoubleToIntegerInstr* instr) {
   // TODO(kmillikin): Handle conversion.
   SetValue(instr, non_constant_);
@@ -8061,6 +8501,12 @@
 }
 
 
+void ConstantPropagator::VisitInt32x4Constructor(
+    Int32x4ConstructorInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitInt32x4BoolConstructor(
     Int32x4BoolConstructorInstr* instr) {
   SetValue(instr, non_constant_);
@@ -8268,6 +8714,18 @@
 }
 
 
+void ConstantPropagator::VisitBoxInt32(BoxInt32Instr* instr) {
+  // TODO(kmillikin): Handle box operation.
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitUnboxInt32(UnboxInt32Instr* instr) {
+  // TODO(kmillikin): Handle unbox operation.
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitUnboxedIntConverter(
     UnboxedIntConverterInstr* instr) {
   SetValue(instr, non_constant_);
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index a4b12c8..8f6c260 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -41,6 +41,8 @@
 
   void SelectRepresentations();
 
+  void WidenSmiToInt32();
+
   void InferIntRanges();
 
   void SelectIntegerInstructions();
@@ -62,6 +64,7 @@
   virtual void VisitStaticCall(StaticCallInstr* instr);
   virtual void VisitInstanceCall(InstanceCallInstr* instr);
   virtual void VisitStoreInstanceField(StoreInstanceFieldInstr* instr);
+  virtual void VisitAllocateContext(AllocateContextInstr* instr);
 
   void InsertBefore(Instruction* next,
                     Instruction* instr,
@@ -130,8 +133,6 @@
 
   bool TryReplaceInstanceCallWithInline(InstanceCallInstr* call);
 
-  LoadFieldInstr* BuildLoadStringLength(Definition* str);
-
   Definition* PrepareInlineStringIndexOp(Instruction* call,
                                          intptr_t cid,
                                          Definition* str,
@@ -148,6 +149,11 @@
                               TargetEntryInstr** entry,
                               Definition** last);
 
+  bool InlineDoubleOp(Token::Kind op_kind,
+                      Instruction* call,
+                      TargetEntryInstr** entry,
+                      Definition** last);
+
   bool InlineByteArrayViewLoad(Instruction* call,
                                Definition* receiver,
                                intptr_t array_cid,
@@ -214,8 +220,8 @@
                         Value* use,
                         bool is_environment_use);
 
-  bool InstanceCallNeedsClassCheck(InstanceCallInstr* call) const;
-  bool MethodExtractorNeedsClassCheck(InstanceCallInstr* call) const;
+  bool InstanceCallNeedsClassCheck(InstanceCallInstr* call,
+                                   RawFunction::Kind kind) const;
 
   bool InlineFloat32x4Getter(InstanceCallInstr* call,
                              MethodRecognizer::Kind getter);
@@ -264,6 +270,8 @@
 
   void Optimize();
 
+  void OptimisticallySpecializeSmiPhis();
+
  private:
   FlowGraph* flow_graph() const { return flow_graph_; }
 
@@ -271,10 +279,9 @@
              BlockEntryInstr* pre_header,
              Instruction* current);
 
-  void TryHoistCheckSmiThroughPhi(ForwardInstructionIterator* it,
-                                  BlockEntryInstr* header,
-                                  BlockEntryInstr* pre_header,
-                                  CheckSmiInstr* current);
+  void TrySpecializeSmiPhi(PhiInstr* phi,
+                           BlockEntryInstr* header,
+                           BlockEntryInstr* pre_header);
 
   FlowGraph* const flow_graph_;
 };
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index ff95ed04..cad20f7 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -21,10 +21,21 @@
 
 void RangeAnalysis::Analyze() {
   CollectValues();
+
+  if (FLAG_trace_range_analysis) {
+    FlowGraphPrinter::PrintGraph("Range Analysis (BBB)", flow_graph_);
+  }
+
   InsertConstraints();
   InferRanges();
+  EliminateRedundantBoundsChecks();
+  MarkUnreachableBlocks();
+
+  NarrowMintToInt32();
+
   IntegerInstructionSelector iis(flow_graph_);
   iis.Select();
+
   RemoveConstraints();
 }
 
@@ -38,6 +49,8 @@
       values_.Add(current);
     } else if (current->IsMintDefinition()) {
       values_.Add(current);
+    } else if (current->IsInt32Definition()) {
+      values_.Add(current);
     }
   }
 
@@ -57,6 +70,8 @@
           values_.Add(current);
         } else if (current->IsMintDefinition()) {
           values_.Add(current);
+        } else if (current->IsInt32Definition()) {
+          values_.Add(current);
         }
       }
     }
@@ -67,6 +82,8 @@
         PhiInstr* current = phi_it.Current();
         if (current->Type()->ToCid() == kSmiCid) {
           values_.Add(current);
+        } else if (current->representation() == kUnboxedInt32) {
+          values_.Add(current);
         }
       }
     }
@@ -83,9 +100,16 @@
         } else if ((defn->IsMintDefinition()) &&
                    (defn->ssa_temp_index() != -1)) {
           values_.Add(defn);
+          if (defn->IsBinaryMintOp()) {
+            binary_mint_ops_.Add(defn->AsBinaryMintOp());
+          } else if (defn->IsShiftMintOp()) {
+            shift_mint_ops_.Add(defn->AsShiftMintOp());
+          }
+        } else if (defn->IsInt32Definition()) {
+          values_.Add(defn);
         }
-      } else if (current->IsCheckSmi()) {
-        smi_checks_.Add(current->AsCheckSmi());
+      } else if (current->IsCheckArrayBound()) {
+        bounds_checks_.Add(current->AsCheckArrayBound());
       }
     }
   }
@@ -160,13 +184,13 @@
 // that it evaluated to true.
 // For example for the comparison a < b symbol a is constrained with range
 // [Smi::kMinValue, b - 1].
-Range* RangeAnalysis::ConstraintRange(Token::Kind op, Definition* boundary) {
+Range* RangeAnalysis::ConstraintSmiRange(Token::Kind op, Definition* boundary) {
   switch (op) {
     case Token::kEQ:
       return new(I) Range(RangeBoundary::FromDefinition(boundary),
                           RangeBoundary::FromDefinition(boundary));
     case Token::kNE:
-      return Range::Unknown();
+      return new(I) Range(Range::Full(RangeBoundary::kRangeBoundarySmi));
     case Token::kLT:
       return new(I) Range(RangeBoundary::MinSmi(),
                           RangeBoundary::FromDefinition(boundary, -1));
@@ -181,19 +205,32 @@
                           RangeBoundary::MaxSmi());
     default:
       UNREACHABLE();
-      return Range::Unknown();
+      return NULL;
   }
 }
 
 
-ConstraintInstr* RangeAnalysis::InsertConstraintFor(Definition* defn,
+ConstraintInstr* RangeAnalysis::InsertConstraintFor(Value* use,
+                                                    Definition* defn,
                                                     Range* constraint_range,
                                                     Instruction* after) {
   // No need to constrain constants.
   if (defn->IsConstant()) return NULL;
 
-  ConstraintInstr* constraint = new(I) ConstraintInstr(
-      new(I) Value(defn), constraint_range);
+  // Check if the value is already constrained to avoid inserting duplicated
+  // constraints.
+  ConstraintInstr* constraint = after->next()->AsConstraint();
+  while (constraint != NULL) {
+    if ((constraint->value()->definition() == defn) &&
+        constraint->constraint()->Equals(constraint_range)) {
+      return NULL;
+    }
+    constraint = constraint->next()->AsConstraint();
+  }
+
+  constraint = new(I) ConstraintInstr(
+      use->CopyWithType(), constraint_range);
+
   flow_graph_->InsertAfter(after, constraint, NULL, FlowGraph::kValue);
   RenameDominatedUses(defn, constraint, constraint);
   constraints_.Add(constraint);
@@ -201,7 +238,7 @@
 }
 
 
-void RangeAnalysis::ConstrainValueAfterBranch(Definition* defn, Value* use) {
+void RangeAnalysis::ConstrainValueAfterBranch(Value* use, Definition* defn) {
   BranchInstr* branch = use->instruction()->AsBranch();
   RelationalOpInstr* rel_op = branch->comparison()->AsRelationalOp();
   if ((rel_op != NULL) && (rel_op->operation_cid() == kSmiCid)) {
@@ -222,8 +259,9 @@
 
     // Constrain definition at the true successor.
     ConstraintInstr* true_constraint =
-        InsertConstraintFor(defn,
-                            ConstraintRange(op_kind, boundary),
+        InsertConstraintFor(use,
+                            defn,
+                            ConstraintSmiRange(op_kind, boundary),
                             branch->true_successor());
     // Mark true_constraint an artificial use of boundary. This ensures
     // that constraint's range is recalculated if boundary's range changes.
@@ -235,8 +273,9 @@
     // Constrain definition with a negated condition at the false successor.
     ConstraintInstr* false_constraint =
         InsertConstraintFor(
+            use,
             defn,
-            ConstraintRange(Token::NegateComparison(op_kind), boundary),
+            ConstraintSmiRange(Token::NegateComparison(op_kind), boundary),
             branch->false_successor());
     // Mark false_constraint an artificial use of boundary. This ensures
     // that constraint's range is recalculated if boundary's range changes.
@@ -253,19 +292,20 @@
        use != NULL;
        use = use->next_use()) {
     if (use->instruction()->IsBranch()) {
-      ConstrainValueAfterBranch(defn, use);
+      ConstrainValueAfterBranch(use, defn);
     } else if (use->instruction()->IsCheckArrayBound()) {
-      ConstrainValueAfterCheckArrayBound(
-          defn,
-          use->instruction()->AsCheckArrayBound(),
-          use->use_index());
+      ConstrainValueAfterCheckArrayBound(use, defn);
     }
   }
 }
 
 
 void RangeAnalysis::ConstrainValueAfterCheckArrayBound(
-    Definition* defn, CheckArrayBoundInstr* check, intptr_t use_index) {
+    Value* use,
+    Definition* defn) {
+  CheckArrayBoundInstr* check = use->instruction()->AsCheckArrayBound();
+  intptr_t use_index = use->use_index();
+
   Range* constraint_range = NULL;
   if (use_index == CheckArrayBoundInstr::kIndexPos) {
     Definition* length = check->length()->definition();
@@ -279,27 +319,11 @@
         RangeBoundary::FromDefinition(index, 1),
         RangeBoundary::MaxSmi());
   }
-  InsertConstraintFor(defn, constraint_range, check);
+  InsertConstraintFor(use, defn, constraint_range, check);
 }
 
 
 void RangeAnalysis::InsertConstraints() {
-  for (intptr_t i = 0; i < smi_checks_.length(); i++) {
-    CheckSmiInstr* check = smi_checks_[i];
-    ConstraintInstr* constraint =
-        InsertConstraintFor(check->value()->definition(),
-                            Range::UnknownSmi(),
-                            check);
-    if (constraint == NULL) {
-      // No constraint was needed.
-      continue;
-    }
-    // Mark the constraint's value's reaching type as smi.
-    CompileType* smi_compile_type =
-        ZoneCompileType::Wrap(CompileType::FromCid(kSmiCid));
-    constraint->value()->SetReachingType(smi_compile_type);
-  }
-
   for (intptr_t i = 0; i < values_.length(); i++) {
     InsertConstraintsFor(values_[i]);
   }
@@ -310,220 +334,340 @@
 }
 
 
-void RangeAnalysis::ResetWorklist() {
-  if (marked_defns_ == NULL) {
-    marked_defns_ = new(I) BitVector(flow_graph_->current_ssa_temp_index());
-  } else {
-    marked_defns_->Clear();
+const Range* RangeAnalysis::GetSmiRange(Value* value) const {
+  Definition* defn = value->definition();
+  const Range* range = defn->range();
+
+  if ((range == NULL) && (defn->Type()->ToCid() != kSmiCid)) {
+    // Type propagator determined that reaching type for this use is Smi.
+    // However the definition itself is not a smi-definition and
+    // thus it will never have range assigned to it. Just return the widest
+    // range possible for this value.
+    // We don't need to handle kMintCid here because all external mints
+    // (e.g. results of loads or function call) can be used only after they
+    // pass through UnboxIntegerInstr which is considered as mint-definition
+    // and will have a range assigned to it.
+    // Note: that we can't return NULL here because it is used as lattice's
+    // bottom element to indicate that the range was not computed *yet*.
+    return &smi_range_;
   }
-  worklist_.Clear();
+
+  return range;
 }
 
 
-void RangeAnalysis::MarkDefinition(Definition* defn) {
-  // Unwrap constrained value.
+static Definition* UnwrapConstraint(Definition* defn) {
   while (defn->IsConstraint()) {
     defn = defn->AsConstraint()->value()->definition();
   }
-
-  if (!marked_defns_->Contains(defn->ssa_temp_index())) {
-    worklist_.Add(defn);
-    marked_defns_->Add(defn->ssa_temp_index());
-  }
+  return defn;
 }
 
 
-RangeAnalysis::Direction RangeAnalysis::ToDirection(Value* val) {
-  if (val->BindsToConstant()) {
-    return (Smi::Cast(val->BoundConstant()).Value() >= 0) ? kPositive
-                                                          : kNegative;
-  } else if (val->definition()->range() != NULL) {
-    Range* range = val->definition()->range();
-    if (Range::ConstantMin(range).ConstantValue() >= 0) {
-      return kPositive;
-    } else if (Range::ConstantMax(range).ConstantValue() <= 0) {
-      return kNegative;
-    }
-  }
-  return kUnknown;
+static bool AreEqualDefinitions(Definition* a, Definition* b) {
+  a = UnwrapConstraint(a);
+  b = UnwrapConstraint(b);
+  return (a == b) ||
+      (a->AllowsCSE() &&
+       a->Dependencies().IsNone() &&
+       b->AllowsCSE() &&
+       b->Dependencies().IsNone() &&
+       a->Equals(b));
 }
 
 
-Range* RangeAnalysis::InferInductionVariableRange(JoinEntryInstr* loop_header,
-                                                  PhiInstr* var) {
-  BitVector* loop_info = loop_header->loop_info();
+static bool DependOnSameSymbol(const RangeBoundary& a, const RangeBoundary& b) {
+  return a.IsSymbol() && b.IsSymbol() &&
+      AreEqualDefinitions(a.symbol(), b.symbol());
+}
 
-  Definition* initial_value = NULL;
-  Direction direction = kUnknown;
 
-  ResetWorklist();
-  MarkDefinition(var);
-  while (!worklist_.is_empty()) {
-    Definition* defn = worklist_.RemoveLast();
+// Given the current range of a phi and a newly computed range check
+// if it is growing towards negative infinity, if it does widen it to
+// MinSmi.
+static RangeBoundary WidenMin(const Range* range,
+                              const Range* new_range,
+                              RangeBoundary::RangeSize size) {
+  RangeBoundary min = range->min();
+  RangeBoundary new_min = new_range->min();
 
-    if (defn->IsPhi()) {
-      PhiInstr* phi = defn->AsPhi();
-      for (intptr_t i = 0; i < phi->InputCount(); i++) {
-        Definition* defn = phi->InputAt(i)->definition();
-
-        if (!loop_info->Contains(defn->GetBlock()->preorder_number())) {
-          // The value is coming from outside of the loop.
-          if (initial_value == NULL) {
-            initial_value = defn;
-            continue;
-          } else if (initial_value == defn) {
-            continue;
-          } else {
-            return NULL;
-          }
-        }
-
-        MarkDefinition(defn);
-      }
-    } else if (defn->IsBinarySmiOp()) {
-      BinarySmiOpInstr* binary_op = defn->AsBinarySmiOp();
-
-      switch (binary_op->op_kind()) {
-        case Token::kADD: {
-          const Direction growth_right =
-              ToDirection(binary_op->right());
-          if (growth_right != kUnknown) {
-            UpdateDirection(&direction, growth_right);
-            MarkDefinition(binary_op->left()->definition());
-            break;
-          }
-
-          const Direction growth_left =
-              ToDirection(binary_op->left());
-          if (growth_left != kUnknown) {
-            UpdateDirection(&direction, growth_left);
-            MarkDefinition(binary_op->right()->definition());
-            break;
-          }
-
-          return NULL;
-        }
-
-        case Token::kSUB: {
-          const Direction growth_right =
-              ToDirection(binary_op->right());
-          if (growth_right != kUnknown) {
-            UpdateDirection(&direction, Invert(growth_right));
-            MarkDefinition(binary_op->left()->definition());
-            break;
-          }
-          return NULL;
-        }
-
-        default:
-          return NULL;
-      }
-    } else {
-      return NULL;
+  if (min.IsSymbol()) {
+    if (min.LowerBound().Overflowed(size)) {
+      return RangeBoundary::MinConstant(size);
+    } else if (DependOnSameSymbol(min, new_min)) {
+      return min.offset() <= new_min.offset() ?
+          min : RangeBoundary::MinConstant(size);
+    } else if (min.UpperBound(size) <= new_min.LowerBound(size)) {
+      return min;
     }
   }
 
+  min = Range::ConstantMin(range, size);
+  new_min = Range::ConstantMin(new_range, size);
 
-  // We transitively discovered all dependencies of the given phi
-  // and confirmed that it depends on a single value coming from outside of
-  // the loop and some linear combinations of itself.
-  // Compute the range based on initial value and the direction of the growth.
-  switch (direction) {
-    case kPositive:
-      return new(I) Range(RangeBoundary::FromDefinition(initial_value),
-                          RangeBoundary::MaxSmi());
+  return (min.ConstantValue() <= new_min.ConstantValue()) ?
+      min : RangeBoundary::MinConstant(size);
+}
 
-    case kNegative:
-      return new(I) Range(RangeBoundary::MinSmi(),
-                          RangeBoundary::FromDefinition(initial_value));
+// Given the current range of a phi and a newly computed range check
+// if it is growing towards positive infinity, if it does widen it to
+// MaxSmi.
+static RangeBoundary WidenMax(const Range* range,
+                              const Range* new_range,
+                              RangeBoundary::RangeSize size) {
+  RangeBoundary max = range->max();
+  RangeBoundary new_max = new_range->max();
 
-    case kUnknown:
-    case kBoth:
-      return Range::UnknownSmi();
+  if (max.IsSymbol()) {
+    if (max.UpperBound().Overflowed(size)) {
+      return RangeBoundary::MaxConstant(size);
+    } else if (DependOnSameSymbol(max, new_max)) {
+      return max.offset() >= new_max.offset() ?
+          max : RangeBoundary::MaxConstant(size);
+    } else if (max.LowerBound(size) >= new_max.UpperBound(size)) {
+      return max;
+    }
   }
 
+  max = Range::ConstantMax(range, size);
+  new_max = Range::ConstantMax(new_range, size);
+
+  return (max.ConstantValue() >= new_max.ConstantValue()) ?
+      max : RangeBoundary::MaxConstant(size);
+}
+
+
+// Given the current range of a phi and a newly computed range check
+// if we can perform narrowing: use newly computed minimum to improve precision
+// of the computed range. We do it only if current minimum was widened and is
+// equal to MinSmi.
+// Newly computed minimum is expected to be greater of equal then old one as
+// we are running after widening phase.
+static RangeBoundary NarrowMin(const Range* range,
+                               const Range* new_range,
+                               RangeBoundary::RangeSize size) {
+#ifdef DEBUG
+  const RangeBoundary min = Range::ConstantMin(range, size);
+  const RangeBoundary new_min = Range::ConstantMin(new_range, size);
+  ASSERT(min.ConstantValue() <= new_min.ConstantValue());
+#endif
+  // TODO(vegorov): consider using negative infinity to indicate widened bound.
+  return range->min().IsMinimumOrBelow(size) ? new_range->min() : range->min();
+}
+
+
+// Given the current range of a phi and a newly computed range check
+// if we can perform narrowing: use newly computed maximum to improve precision
+// of the computed range. We do it only if current maximum was widened and is
+// equal to MaxSmi.
+// Newly computed minimum is expected to be greater of equal then old one as
+// we are running after widening phase.
+static RangeBoundary NarrowMax(const Range* range,
+                               const Range* new_range,
+                               RangeBoundary::RangeSize size) {
+#ifdef DEBUG
+  const RangeBoundary max = Range::ConstantMax(range, size);
+  const RangeBoundary new_max = Range::ConstantMax(new_range, size);
+  ASSERT(max.ConstantValue() >= new_max.ConstantValue());
+#endif
+  // TODO(vegorov): consider using positive infinity to indicate widened bound.
+  return range->max().IsMaximumOrAbove(size) ? new_range->max() : range->max();
+}
+
+
+char RangeAnalysis::OpPrefix(JoinOperator op) {
+  switch (op) {
+    case WIDEN: return 'W';
+    case NARROW: return 'N';
+    case NONE: return 'I';
+  }
   UNREACHABLE();
-  return NULL;
+  return ' ';
 }
 
 
-void RangeAnalysis::InferRangesRecursive(BlockEntryInstr* block) {
-  JoinEntryInstr* join = block->AsJoinEntry();
-  if (join != NULL) {
-    const bool is_loop_header = (join->loop_info() != NULL);
-    for (PhiIterator it(join); !it.Done(); it.Advance()) {
-      PhiInstr* phi = it.Current();
-      if (definitions_->Contains(phi->ssa_temp_index())) {
-        if (is_loop_header) {
-          // Try recognizing simple induction variables.
-          Range* range = InferInductionVariableRange(join, phi);
-          if (range != NULL) {
-            phi->range_ = range;
-            continue;
-          }
+bool RangeAnalysis::InferRange(JoinOperator op,
+                               Definition* defn,
+                               intptr_t iteration) {
+  Range range;
+  defn->InferRange(this, &range);
+
+  if (!Range::IsUnknown(&range)) {
+    if (!Range::IsUnknown(defn->range()) && defn->IsPhi()) {
+      // TODO(vegorov): we are currently supporting only smi/int32 phis.
+      ASSERT((defn->Type()->ToCid() == kSmiCid) ||
+             (defn->representation() == kUnboxedInt32));
+      const RangeBoundary::RangeSize size = (defn->Type()->ToCid() == kSmiCid) ?
+          RangeBoundary::kRangeBoundarySmi : RangeBoundary::kRangeBoundaryInt32;
+      if (op == WIDEN) {
+        range = Range(WidenMin(defn->range(), &range, size),
+                      WidenMax(defn->range(), &range, size));
+      } else if (op == NARROW) {
+        range = Range(NarrowMin(defn->range(), &range, size),
+                      NarrowMax(defn->range(), &range, size));
+      }
+    }
+
+    if (!range.Equals(defn->range())) {
+      if (FLAG_trace_range_analysis) {
+        OS::Print("%c [%" Pd "] %s:  %s => %s\n",
+                  OpPrefix(op),
+                  iteration,
+                  defn->ToCString(),
+                  Range::ToCString(defn->range()),
+                  Range::ToCString(&range));
+      }
+      defn->set_range(range);
+      return true;
+    }
+  }
+
+  return false;
+}
+
+
+void RangeAnalysis::CollectDefinitions(BlockEntryInstr* block, BitVector* set) {
+  for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
+       !block_it.Done();
+       block_it.Advance()) {
+    BlockEntryInstr* block = block_it.Current();
+
+    JoinEntryInstr* join = block->AsJoinEntry();
+    if (join != NULL) {
+      for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        PhiInstr* phi = it.Current();
+        if (set->Contains(phi->ssa_temp_index())) {
+          definitions_.Add(phi);
         }
+      }
+    }
 
-        phi->InferRange();
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+      Definition* defn = it.Current()->AsDefinition();
+      if ((defn != NULL) &&
+          (defn->ssa_temp_index() != -1) &&
+          set->Contains(defn->ssa_temp_index())) {
+        definitions_.Add(defn);
       }
     }
   }
+}
 
-  for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
-    Instruction* current = it.Current();
 
-    Definition* defn = current->AsDefinition();
-    if ((defn != NULL) &&
-        (defn->ssa_temp_index() != -1) &&
-        definitions_->Contains(defn->ssa_temp_index())) {
-      defn->InferRange();
-    } else if (FLAG_array_bounds_check_elimination &&
-               current->IsCheckArrayBound()) {
-      CheckArrayBoundInstr* check = current->AsCheckArrayBound();
-      RangeBoundary array_length =
-          RangeBoundary::FromDefinition(check->length()->definition());
-      if (check->IsRedundant(array_length)) {
-        it.RemoveCurrentFromGraph();
+void RangeAnalysis::Iterate(JoinOperator op, intptr_t max_iterations) {
+  // TODO(vegorov): switch to worklist if this becomes performance bottleneck.
+  intptr_t iteration = 0;
+  bool changed;
+  do {
+    changed = false;
+    for (intptr_t i = 0; i < definitions_.length(); i++) {
+      Definition* defn = definitions_[i];
+      if (InferRange(op, defn, iteration)) {
+        changed = true;
       }
     }
-  }
 
-  for (intptr_t i = 0; i < block->dominated_blocks().length(); ++i) {
-    InferRangesRecursive(block->dominated_blocks()[i]);
-  }
+    iteration++;
+  } while (changed && (iteration < max_iterations));
 }
 
 
 void RangeAnalysis::InferRanges() {
   if (FLAG_trace_range_analysis) {
-    OS::Print("---- before range analysis -------\n");
-    FlowGraphPrinter printer(*flow_graph_);
-    printer.PrintBlocks();
-  }
-  // Initialize bitvector for quick filtering of int values.
-  definitions_ =
-      new(I) BitVector(flow_graph_->current_ssa_temp_index());
-  for (intptr_t i = 0; i < values_.length(); i++) {
-    definitions_->Add(values_[i]->ssa_temp_index());
-  }
-  for (intptr_t i = 0; i < constraints_.length(); i++) {
-    definitions_->Add(constraints_[i]->ssa_temp_index());
+    FlowGraphPrinter::PrintGraph("Range Analysis (BEFORE)", flow_graph_);
   }
 
-  // Infer initial values of ranges.
+  // Initialize bitvector for quick filtering of int values.
+  BitVector* set = new(I) BitVector(flow_graph_->current_ssa_temp_index());
+  for (intptr_t i = 0; i < values_.length(); i++) {
+    set->Add(values_[i]->ssa_temp_index());
+  }
+  for (intptr_t i = 0; i < constraints_.length(); i++) {
+    set->Add(constraints_[i]->ssa_temp_index());
+  }
+
+  // Collect integer definitions (including constraints) in the reverse
+  // postorder. This improves convergence speed compared to iterating
+  // values_ and constraints_ array separately.
   const GrowableArray<Definition*>& initial =
       *flow_graph_->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < initial.length(); ++i) {
     Definition* definition = initial[i];
-    if (definitions_->Contains(definition->ssa_temp_index())) {
-      definition->InferRange();
+    if (set->Contains(definition->ssa_temp_index())) {
+      definitions_.Add(definition);
     }
   }
-  InferRangesRecursive(flow_graph_->graph_entry());
+  CollectDefinitions(flow_graph_->graph_entry(), set);
+
+  // Perform an iteration of range inference just propagating ranges
+  // through the graph as-is without applying widening or narrowing.
+  // This helps to improve precision of initial bounds.
+  Iterate(NONE, 1);
+
+  // Perform fix-point iteration of range inference applying widening
+  // operator to phis to ensure fast convergence.
+  // Widening simply maps growing bounds to the respective range bound.
+  Iterate(WIDEN, kMaxInt32);
 
   if (FLAG_trace_range_analysis) {
-    OS::Print("---- after range analysis -------\n");
-    FlowGraphPrinter printer(*flow_graph_);
-    printer.PrintBlocks();
+    FlowGraphPrinter::PrintGraph("Range Analysis (WIDEN)", flow_graph_);
+  }
+
+  // Perform fix-point iteration of range inference applying narrowing
+  // to phis to compute more accurate range.
+  // Narrowing only improves those boundaries that were widened up to
+  // range boundary and leaves other boundaries intact.
+  Iterate(NARROW, kMaxInt32);
+
+  if (FLAG_trace_range_analysis) {
+    FlowGraphPrinter::PrintGraph("Range Analysis (AFTER)", flow_graph_);
+  }
+}
+
+
+void RangeAnalysis::EliminateRedundantBoundsChecks() {
+  if (FLAG_array_bounds_check_elimination) {
+    for (intptr_t i = 0; i < bounds_checks_.length(); i++) {
+      CheckArrayBoundInstr* check = bounds_checks_[i];
+      RangeBoundary array_length =
+          RangeBoundary::FromDefinition(check->length()->definition());
+      if (check->IsRedundant(array_length)) {
+        check->RemoveFromGraph();
+      }
+    }
+  }
+}
+
+
+void RangeAnalysis::MarkUnreachableBlocks() {
+  for (intptr_t i = 0; i < constraints_.length(); i++) {
+    if (Range::IsUnknown(constraints_[i]->range())) {
+      TargetEntryInstr* target = constraints_[i]->target();
+      if (target == NULL) {
+        // TODO(vegorov): replace Constraint with an uncoditional
+        // deoptimization and kill all dominated dead code.
+        continue;
+      }
+
+      BranchInstr* branch =
+          target->PredecessorAt(0)->last_instruction()->AsBranch();
+      if (target == branch->true_successor()) {
+        // True unreachable.
+        if (FLAG_trace_constant_propagation) {
+          OS::Print("Range analysis: True unreachable (B%" Pd ")\n",
+                    branch->true_successor()->block_id());
+        }
+        branch->set_constant_target(branch->false_successor());
+      } else {
+        ASSERT(target == branch->false_successor());
+        // False unreachable.
+        if (FLAG_trace_constant_propagation) {
+          OS::Print("Range analysis: False unreachable (B%" Pd ")\n",
+                    branch->false_successor()->block_id());
+        }
+        branch->set_constant_target(branch->true_successor());
+      }
+    }
   }
 }
 
@@ -542,6 +686,59 @@
 }
 
 
+static void NarrowBinaryMintOp(BinaryMintOpInstr* mint_op) {
+  if (Range::Fits(mint_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
+      Range::Fits(mint_op->left()->definition()->range(),
+                  RangeBoundary::kRangeBoundaryInt32) &&
+      Range::Fits(mint_op->right()->definition()->range(),
+                  RangeBoundary::kRangeBoundaryInt32) &&
+      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(),
+                                      mint_op->left(),
+                                      mint_op->right())) {
+    BinaryInt32OpInstr* int32_op =
+        new BinaryInt32OpInstr(mint_op->op_kind(),
+                               mint_op->left()->CopyWithType(),
+                               mint_op->right()->CopyWithType(),
+                               mint_op->DeoptimizationTarget());
+    int32_op->set_range(*mint_op->range());
+    int32_op->set_overflow(false);
+    mint_op->ReplaceWith(int32_op, NULL);
+  }
+}
+
+
+static void NarrowShiftMintOp(ShiftMintOpInstr* mint_op) {
+  if (Range::Fits(mint_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
+      Range::Fits(mint_op->left()->definition()->range(),
+                  RangeBoundary::kRangeBoundaryInt32) &&
+      Range::Fits(mint_op->right()->definition()->range(),
+                  RangeBoundary::kRangeBoundaryInt32) &&
+      BinaryInt32OpInstr::IsSupported(mint_op->op_kind(),
+                                      mint_op->left(),
+                                      mint_op->right())) {
+    BinaryInt32OpInstr* int32_op =
+        new BinaryInt32OpInstr(mint_op->op_kind(),
+                               mint_op->left()->CopyWithType(),
+                               mint_op->right()->CopyWithType(),
+                               mint_op->DeoptimizationTarget());
+    int32_op->set_range(*mint_op->range());
+    int32_op->set_overflow(false);
+    mint_op->ReplaceWith(int32_op, NULL);
+  }
+}
+
+
+void RangeAnalysis::NarrowMintToInt32() {
+  for (intptr_t i = 0; i < binary_mint_ops_.length(); i++) {
+    NarrowBinaryMintOp(binary_mint_ops_[i]);
+  }
+
+  for (intptr_t i = 0; i < shift_mint_ops_.length(); i++) {
+    NarrowShiftMintOp(shift_mint_ops_[i]);
+  }
+}
+
+
 IntegerInstructionSelector::IntegerInstructionSelector(FlowGraph* flow_graph)
     : flow_graph_(flow_graph),
       isolate_(NULL) {
@@ -788,6 +985,9 @@
       OS::Print("Replacing %s with %s\n", defn->ToCString(),
                                           replacement->ToCString());
     }
+    if (!Range::IsUnknown(defn->range())) {
+      replacement->set_range(*defn->range());
+    }
     defn->ReplaceWith(replacement, NULL);
     ASSERT(flow_graph_->VerifyUseLists());
   }
@@ -807,7 +1007,7 @@
     return NegativeInfinity();
   }
   if (IsConstant()) return *this;
-  return Add(Range::ConstantMin(symbol()->range()),
+  return Add(Range::ConstantMinSmi(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
              NegativeInfinity());
 }
@@ -818,7 +1018,8 @@
     return PositiveInfinity();
   }
   if (IsConstant()) return *this;
-  return Add(Range::ConstantMax(symbol()->range()),
+
+  return Add(Range::ConstantMaxSmi(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
              PositiveInfinity());
 }
@@ -891,33 +1092,6 @@
 }
 
 
-static Definition* UnwrapConstraint(Definition* defn) {
-  while (defn->IsConstraint()) {
-    defn = defn->AsConstraint()->value()->definition();
-  }
-  return defn;
-}
-
-
-static bool AreEqualDefinitions(Definition* a, Definition* b) {
-  a = UnwrapConstraint(a);
-  b = UnwrapConstraint(b);
-  return (a == b) ||
-      (a->AllowsCSE() &&
-       a->Dependencies().IsNone() &&
-       b->AllowsCSE() &&
-       b->Dependencies().IsNone() &&
-       a->Equals(b));
-}
-
-
-// Returns true if two range boundaries refer to the same symbol.
-static bool DependOnSameSymbol(const RangeBoundary& a, const RangeBoundary& b) {
-  return a.IsSymbol() && b.IsSymbol() &&
-      AreEqualDefinitions(a.symbol(), b.symbol());
-}
-
-
 bool RangeBoundary::Equals(const RangeBoundary& other) const {
   if (IsConstant() && other.IsConstant()) {
     return ConstantValue() == other.ConstantValue();
@@ -1057,118 +1231,147 @@
   return true;
 }
 
+typedef bool (*BoundaryOp)(RangeBoundary*);
 
-RangeBoundary RangeBoundary::Min(RangeBoundary a, RangeBoundary b,
-                                 RangeSize size) {
-  ASSERT(!(a.IsNegativeInfinity() || b.IsNegativeInfinity()));
-  ASSERT(!a.IsUnknown() || !b.IsUnknown());
-  if (a.IsUnknown() && !b.IsUnknown()) {
-    return b;
+static bool CanonicalizeForComparison(RangeBoundary* a,
+                                      RangeBoundary* b,
+                                      BoundaryOp op,
+                                      const RangeBoundary& overflow) {
+  if (!a->IsSymbol() || !b->IsSymbol()) {
+    return false;
   }
-  if (!a.IsUnknown() && b.IsUnknown()) {
-    return a;
+
+  if (DependOnSameSymbol(*a, *b)) {
+    return true;
   }
-  if (size == kRangeBoundarySmi) {
-    if (a.IsSmiMaximumOrAbove() && !b.IsSmiMaximumOrAbove()) {
-      return b;
+
+
+  RangeBoundary canonical_a = CanonicalizeBoundary(*a, overflow);
+  RangeBoundary canonical_b = CanonicalizeBoundary(*b, overflow);
+
+  do {
+    if (DependOnSameSymbol(canonical_a, canonical_b)) {
+      *a = canonical_a;
+      *b = canonical_b;
+      return true;
     }
-    if (!a.IsSmiMaximumOrAbove() && b.IsSmiMaximumOrAbove()) {
-      return a;
-    }
-  } else {
-    ASSERT(size == kRangeBoundaryInt64);
-    if (a.IsMaximumOrAbove() && !b.IsMaximumOrAbove()) {
-      return b;
-    }
-    if (!a.IsMaximumOrAbove() && b.IsMaximumOrAbove()) {
-      return a;
-    }
-  }
+  } while (op(&canonical_a) || op(&canonical_b));
 
-  if (a.Equals(b)) {
-    return b;
-  }
-
-  {
-    RangeBoundary canonical_a =
-        CanonicalizeBoundary(a, RangeBoundary::PositiveInfinity());
-    RangeBoundary canonical_b =
-        CanonicalizeBoundary(b, RangeBoundary::PositiveInfinity());
-    do {
-      if (DependOnSameSymbol(canonical_a, canonical_b)) {
-        a = canonical_a;
-        b = canonical_b;
-        break;
-      }
-    } while (CanonicalizeMaxBoundary(&canonical_a) ||
-             CanonicalizeMaxBoundary(&canonical_b));
-  }
-
-  if (DependOnSameSymbol(a, b)) {
-    return (a.offset() <= b.offset()) ? a : b;
-  }
-
-  const int64_t min_a = a.UpperBound().Clamp(size).ConstantValue();
-  const int64_t min_b = b.UpperBound().Clamp(size).ConstantValue();
-
-  return RangeBoundary::FromConstant(Utils::Minimum(min_a, min_b));
+  return false;
 }
 
 
-RangeBoundary RangeBoundary::Max(RangeBoundary a, RangeBoundary b,
-                                 RangeSize size) {
-  ASSERT(!(a.IsPositiveInfinity() || b.IsPositiveInfinity()));
-  ASSERT(!a.IsUnknown() || !b.IsUnknown());
-  if (a.IsUnknown() && !b.IsUnknown()) {
-    return b;
-  }
-  if (!a.IsUnknown() && b.IsUnknown()) {
-    return a;
-  }
-  if (size == kRangeBoundarySmi) {
-    if (a.IsSmiMinimumOrBelow() && !b.IsSmiMinimumOrBelow()) {
-      return b;
-    }
-    if (!a.IsSmiMinimumOrBelow() && b.IsSmiMinimumOrBelow()) {
-      return a;
-    }
-  } else {
-     ASSERT(size == kRangeBoundaryInt64);
-    if (a.IsMinimumOrBelow() && !b.IsMinimumOrBelow()) {
-      return b;
-    }
-    if (!a.IsMinimumOrBelow() && b.IsMinimumOrBelow()) {
-      return a;
-    }
-  }
+RangeBoundary RangeBoundary::JoinMin(RangeBoundary a,
+                                     RangeBoundary b,
+                                     RangeBoundary::RangeSize size) {
   if (a.Equals(b)) {
     return b;
   }
 
-  {
-    RangeBoundary canonical_a =
-        CanonicalizeBoundary(a, RangeBoundary::NegativeInfinity());
-    RangeBoundary canonical_b =
-        CanonicalizeBoundary(b, RangeBoundary::NegativeInfinity());
-
-    do {
-      if (DependOnSameSymbol(canonical_a, canonical_b)) {
-        a = canonical_a;
-        b = canonical_b;
-        break;
-      }
-    } while (CanonicalizeMinBoundary(&canonical_a) ||
-             CanonicalizeMinBoundary(&canonical_b));
+  if (CanonicalizeForComparison(&a,
+                                &b,
+                                &CanonicalizeMinBoundary,
+                                RangeBoundary::NegativeInfinity())) {
+    return (a.offset() <= b.offset()) ? a : b;
   }
 
-  if (DependOnSameSymbol(a, b)) {
-    return (a.offset() <= b.offset()) ? b : a;
+  const int64_t inf_a = a.LowerBound(size);
+  const int64_t inf_b = b.LowerBound(size);
+  const int64_t sup_a = a.UpperBound(size);
+  const int64_t sup_b = b.UpperBound(size);
+
+  if ((sup_a <= inf_b) && !a.LowerBound().Overflowed(size)) {
+    return a;
+  } else if ((sup_b <= inf_a) && !b.LowerBound().Overflowed(size)) {
+    return b;
+  } else {
+    return RangeBoundary::FromConstant(Utils::Minimum(inf_a, inf_b));
+  }
+}
+
+
+RangeBoundary RangeBoundary::JoinMax(RangeBoundary a,
+                                     RangeBoundary b,
+                                     RangeBoundary::RangeSize size) {
+  if (a.Equals(b)) {
+    return b;
   }
 
-  const int64_t max_a = a.LowerBound().Clamp(size).ConstantValue();
-  const int64_t max_b = b.LowerBound().Clamp(size).ConstantValue();
+  if (CanonicalizeForComparison(&a,
+                                &b,
+                                &CanonicalizeMaxBoundary,
+                                RangeBoundary::PositiveInfinity())) {
+    return (a.offset() >= b.offset()) ? a : b;
+  }
 
-  return RangeBoundary::FromConstant(Utils::Maximum(max_a, max_b));
+  const int64_t inf_a = a.LowerBound(size);
+  const int64_t inf_b = b.LowerBound(size);
+  const int64_t sup_a = a.UpperBound(size);
+  const int64_t sup_b = b.UpperBound(size);
+
+  if ((sup_a <= inf_b) && !b.UpperBound().Overflowed(size)) {
+    return b;
+  } else if ((sup_b <= inf_a) && !a.UpperBound().Overflowed(size)) {
+    return a;
+  } else {
+    return RangeBoundary::FromConstant(Utils::Maximum(sup_a, sup_b));
+  }
+}
+
+
+RangeBoundary RangeBoundary::IntersectionMin(RangeBoundary a, RangeBoundary b) {
+  ASSERT(!a.IsPositiveInfinity() && !b.IsPositiveInfinity());
+  ASSERT(!a.IsUnknown() && !b.IsUnknown());
+
+  if (a.Equals(b)) {
+    return a;
+  }
+
+  if (a.IsMinimumOrBelow(RangeBoundary::kRangeBoundarySmi)) {
+    return b;
+  } else if (b.IsMinimumOrBelow(RangeBoundary::kRangeBoundarySmi)) {
+    return a;
+  }
+
+  if (CanonicalizeForComparison(&a,
+                                &b,
+                                &CanonicalizeMinBoundary,
+                                RangeBoundary::NegativeInfinity())) {
+    return (a.offset() >= b.offset()) ? a : b;
+  }
+
+  const int64_t inf_a = a.SmiLowerBound();
+  const int64_t inf_b = b.SmiLowerBound();
+
+  return (inf_a >= inf_b) ? a : b;
+}
+
+
+RangeBoundary RangeBoundary::IntersectionMax(RangeBoundary a, RangeBoundary b) {
+  ASSERT(!a.IsNegativeInfinity() && !b.IsNegativeInfinity());
+  ASSERT(!a.IsUnknown() && !b.IsUnknown());
+
+  if (a.Equals(b)) {
+    return a;
+  }
+
+  if (a.IsMaximumOrAbove(RangeBoundary::kRangeBoundarySmi)) {
+    return b;
+  } else if (b.IsMaximumOrAbove(RangeBoundary::kRangeBoundarySmi)) {
+    return a;
+  }
+
+  if (CanonicalizeForComparison(&a,
+                                &b,
+                                &CanonicalizeMaxBoundary,
+                                RangeBoundary::PositiveInfinity())) {
+    return (a.offset() <= b.offset()) ? a : b;
+  }
+
+  const int64_t sup_a = a.SmiUpperBound();
+  const int64_t sup_b = b.SmiUpperBound();
+
+  return (sup_a <= sup_b) ? a : b;
 }
 
 
@@ -1353,7 +1556,7 @@
   if (defn == NULL) {
     return false;
   }
-  LoadFieldInstr* load = defn->AsLoadField();
+  LoadFieldInstr* load = UnwrapConstraint(defn)->AsLoadField();
   return (load != NULL) && load->IsImmutableLengthLoad();
 }
 
@@ -1435,16 +1638,23 @@
       ((left_max == 0) || (right_max <= kMaxInt64 / left_max))) {
     // Product of left and right max values stays in 64 bit range.
     const int64_t mul_max = left_max * right_max;
-    if (Smi::IsValid(mul_max) && Smi::IsValid(-mul_max)) {
-      const int64_t r_min =
-          OnlyPositiveOrZero(*left_range, *right_range) ? 0 : -mul_max;
-      *result_min = RangeBoundary::FromConstant(r_min);
-      const int64_t r_max =
-          OnlyNegativeOrZero(*left_range, *right_range) ? 0 : mul_max;
-      *result_max = RangeBoundary::FromConstant(r_max);
-      return true;
-    }
+    const int64_t r_min =
+        OnlyPositiveOrZero(*left_range, *right_range) ? 0 : -mul_max;
+    *result_min = RangeBoundary::FromConstant(r_min);
+    const int64_t r_max =
+        OnlyNegativeOrZero(*left_range, *right_range) ? 0 : mul_max;
+    *result_max = RangeBoundary::FromConstant(r_max);
+    return true;
   }
+
+  // TODO(vegorov): handle mixed sign case that leads to (-Infinity, 0] range.
+  if (OnlyPositiveOrZero(*left_range, *right_range) ||
+      OnlyNegativeOrZero(*left_range, *right_range)) {
+    *result_min = RangeBoundary::FromConstant(0);
+    *result_max = RangeBoundary::PositiveInfinity();
+    return true;
+  }
+
   return false;
 }
 
@@ -1472,10 +1682,11 @@
 }
 
 
-Range* Range::BinaryOp(const Token::Kind op,
-                       const Range* left_range,
-                       const Range* right_range,
-                       Definition* left_defn) {
+void Range::BinaryOp(const Token::Kind op,
+                     const Range* left_range,
+                     const Range* right_range,
+                     Definition* left_defn,
+                     Range* result) {
   ASSERT(left_range != NULL);
   ASSERT(right_range != NULL);
 
@@ -1496,7 +1707,8 @@
       break;
     case Token::kMUL: {
       if (!Range::Mul(left_range, right_range, &min, &max)) {
-        return NULL;
+        *result = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+        return;
       }
       break;
     }
@@ -1510,383 +1722,452 @@
     }
     case Token::kBIT_AND:
       if (!Range::And(left_range, right_range, &min, &max)) {
-        return NULL;
+        *result = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+        return;
       }
       break;
     default:
-      return NULL;
-      break;
+      *result = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+      return;
   }
 
   ASSERT(!min.IsUnknown() && !max.IsUnknown());
 
-  return new Range(min, max);
+  *result = Range(min, max);
 }
 
 
-void Definition::InferRange() {
-  if (Type()->ToCid() == kSmiCid) {
-    if (range_ == NULL) {
-      range_ = Range::UnknownSmi();
-    }
-  } else if (IsMintDefinition()) {
-    if (range_ == NULL) {
-      range_ = Range::Unknown();
-    }
-  } else {
-    // Only Smi and Mint supported.
-    UNREACHABLE();
-  }
-}
-
-
-void PhiInstr::InferRange() {
-  RangeBoundary new_min;
-  RangeBoundary new_max;
-
-  ASSERT(Type()->ToCid() == kSmiCid);
-
-  for (intptr_t i = 0; i < InputCount(); i++) {
-    Range* input_range = InputAt(i)->definition()->range();
-    if (input_range == NULL) {
-      range_ = Range::UnknownSmi();
-      return;
-    }
-
-    if (new_min.IsUnknown()) {
-      new_min = Range::ConstantMin(input_range);
-    } else {
-      new_min = RangeBoundary::Min(new_min,
-                                   Range::ConstantMinSmi(input_range),
-                                   RangeBoundary::kRangeBoundarySmi);
-    }
-
-    if (new_max.IsUnknown()) {
-      new_max = Range::ConstantMax(input_range);
-    } else {
-      new_max = RangeBoundary::Max(new_max,
-                                   Range::ConstantMaxSmi(input_range),
-                                   RangeBoundary::kRangeBoundarySmi);
-    }
-  }
-
-  ASSERT(new_min.IsUnknown() == new_max.IsUnknown());
-  if (new_min.IsUnknown()) {
-    range_ = Range::UnknownSmi();
-    return;
-  }
-
-  range_ = new Range(new_min, new_max);
-}
-
-
-void ConstantInstr::InferRange() {
-  if (value_.IsSmi()) {
-    if (range_ == NULL) {
-      int64_t value = Smi::Cast(value_).Value();
-      range_ = new Range(RangeBoundary::FromConstant(value),
-                         RangeBoundary::FromConstant(value));
-    }
-  } else if (value_.IsMint()) {
-    if (range_ == NULL) {
-      int64_t value = Mint::Cast(value_).value();
-      range_ = new Range(RangeBoundary::FromConstant(value),
-                         RangeBoundary::FromConstant(value));
-    }
-  } else {
-    // Only Smi and Mint supported.
-    UNREACHABLE();
-  }
-}
-
-
-void UnboxIntegerInstr::InferRange() {
+void Definition::set_range(const Range& range) {
   if (range_ == NULL) {
-    Definition* unboxed = value()->definition();
-    ASSERT(unboxed != NULL);
-    Range* range = unboxed->range();
-    if (range == NULL) {
-      range_ = Range::Unknown();
-      return;
-    }
-    range_ = new Range(range->min(), range->max());
+    range_ = new Range();
+  }
+  *range_ = range;
+}
+
+
+void Definition::InferRange(RangeAnalysis* analysis, Range* range) {
+  if (Type()->ToCid() == kSmiCid) {
+    *range = Range::Full(RangeBoundary::kRangeBoundarySmi);
+  } else if (IsMintDefinition()) {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+  } else if (IsInt32Definition()) {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt32);
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
   }
 }
 
 
-void ConstraintInstr::InferRange() {
-  Range* value_range = value()->definition()->range();
+static bool DependsOnSymbol(const RangeBoundary& a, Definition* symbol) {
+  return a.IsSymbol() && (UnwrapConstraint(a.symbol()) == symbol);
+}
 
-  // Only constraining smi values.
-  ASSERT(value()->IsSmiValue());
 
-  RangeBoundary min;
-  RangeBoundary max;
-
-  {
-    RangeBoundary value_min = (value_range == NULL) ?
-        RangeBoundary() : value_range->min();
-    RangeBoundary constraint_min = constraint()->min();
-    min = RangeBoundary::Max(value_min, constraint_min,
-                             RangeBoundary::kRangeBoundarySmi);
+// Given the range and definition update the range so that
+// it covers both original range and defintions range.
+//
+// The following should also hold:
+//
+//     [_|_, _|_] U a = a U [_|_, _|_] = a
+//
+static void Join(Range* range,
+                 Definition* defn,
+                 const Range* defn_range,
+                 RangeBoundary::RangeSize size) {
+  if (Range::IsUnknown(defn_range)) {
+    return;
   }
 
-  ASSERT(!min.IsUnknown());
-
-  {
-    RangeBoundary value_max = (value_range == NULL) ?
-        RangeBoundary() : value_range->max();
-    RangeBoundary constraint_max = constraint()->max();
-    max = RangeBoundary::Min(value_max, constraint_max,
-                             RangeBoundary::kRangeBoundarySmi);
+  if (Range::IsUnknown(range)) {
+    *range = *defn_range;
+    return;
   }
 
-  ASSERT(!max.IsUnknown());
+  Range other = *defn_range;
 
-  range_ = new Range(min, max);
+  // Handle patterns where range already depends on defn as a symbol:
+  //
+  //    (..., S+o] U range(S) and [S+o, ...) U range(S)
+  //
+  // To improve precision of the computed join use [S, S] instead of
+  // using range(S). It will be canonicalized away by JoinMin/JoinMax
+  // functions.
+  Definition* unwrapped = UnwrapConstraint(defn);
+  if (DependsOnSymbol(range->min(), unwrapped) ||
+      DependsOnSymbol(range->max(), unwrapped)) {
+    other = Range(RangeBoundary::FromDefinition(defn, 0),
+                  RangeBoundary::FromDefinition(defn, 0));
+  }
 
-  // Mark branches that generate unsatisfiable constraints as constant.
-  if (target() != NULL && range_->IsUnsatisfiable()) {
-    BranchInstr* branch =
-        target()->PredecessorAt(0)->last_instruction()->AsBranch();
-    if (target() == branch->true_successor()) {
-      // True unreachable.
-      if (FLAG_trace_constant_propagation) {
-        OS::Print("Range analysis: True unreachable (B%" Pd ")\n",
-                  branch->true_successor()->block_id());
-      }
-      branch->set_constant_target(branch->false_successor());
-    } else {
-      ASSERT(target() == branch->false_successor());
-      // False unreachable.
-      if (FLAG_trace_constant_propagation) {
-        OS::Print("Range analysis: False unreachable (B%" Pd ")\n",
-                  branch->false_successor()->block_id());
-      }
-      branch->set_constant_target(branch->true_successor());
-    }
+  // First try to compare ranges based on their upper and lower bounds.
+  const int64_t inf_range = range->min().LowerBound(size);
+  const int64_t inf_other = other.min().LowerBound(size);
+  const int64_t sup_range = range->max().UpperBound(size);
+  const int64_t sup_other = other.max().UpperBound(size);
+
+  if (sup_range <= inf_other) {
+    // The range is fully below defn's range. Keep the minimum and
+    // expand the maximum.
+    range->set_max(other.max());
+  } else if (sup_other <= inf_range) {
+    // The range is fully above defn's range. Keep the maximum and
+    // expand the minimum.
+    range->set_min(other.min());
+  } else {
+    // Can't compare ranges as whole. Join minimum and maximum separately.
+    *range = Range(RangeBoundary::JoinMin(range->min(), other.min(), size),
+                   RangeBoundary::JoinMax(range->max(), other.max(), size));
   }
 }
 
 
-void LoadFieldInstr::InferRange() {
-  if ((range_ == NULL) &&
-      ((recognized_kind() == MethodRecognizer::kObjectArrayLength) ||
-       (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) {
-    range_ = new Range(RangeBoundary::FromConstant(0),
-                       RangeBoundary::FromConstant(Array::kMaxElements));
+// When assigning range to a phi we must take care to avoid self-reference
+// cycles when phi's range depends on the phi itself.
+// To prevent such cases we impose additional restriction on symbols that
+// can be used as boundaries for phi's range: they must dominate
+// phi's definition.
+static RangeBoundary EnsureAcyclicSymbol(BlockEntryInstr* phi_block,
+                                         const RangeBoundary& a,
+                                         const RangeBoundary& limit) {
+  if (!a.IsSymbol() || a.symbol()->GetBlock()->Dominates(phi_block)) {
+    return a;
+  }
+
+  // Symbol does not dominate phi. Try unwrapping constraint and check again.
+  Definition* unwrapped = UnwrapConstraint(a.symbol());
+  if ((unwrapped != a.symbol()) &&
+      unwrapped->GetBlock()->Dominates(phi_block)) {
+    return RangeBoundary::FromDefinition(unwrapped, a.offset());
+  }
+
+  return limit;
+}
+
+
+void PhiInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  ASSERT((Type()->ToCid() == kSmiCid) || (representation() == kUnboxedInt32));
+  const RangeBoundary::RangeSize size = (Type()->ToCid() == kSmiCid) ?
+      RangeBoundary::kRangeBoundarySmi : RangeBoundary::kRangeBoundaryInt32;
+  for (intptr_t i = 0; i < InputCount(); i++) {
+    Value* input = InputAt(i);
+    const Range* input_range = (size == RangeBoundary::kRangeBoundarySmi) ?
+        analysis->GetSmiRange(input) : input->definition()->range();
+    Join(range,
+         input->definition(), input_range, size);
+  }
+
+  BlockEntryInstr* phi_block = GetBlock();
+  range->set_min(EnsureAcyclicSymbol(
+      phi_block, range->min(), RangeBoundary::MinSmi()));
+  range->set_max(EnsureAcyclicSymbol(
+      phi_block, range->max(), RangeBoundary::MaxSmi()));
+}
+
+
+void ConstantInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  if (value_.IsSmi()) {
+    int64_t value = Smi::Cast(value_).Value();
+    *range = Range(RangeBoundary::FromConstant(value),
+                   RangeBoundary::FromConstant(value));
+  } else if (value_.IsMint()) {
+    int64_t value = Mint::Cast(value_).value();
+    *range = Range(RangeBoundary::FromConstant(value),
+                   RangeBoundary::FromConstant(value));
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
+  }
+}
+
+
+void ConstraintInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = analysis->GetSmiRange(value());
+  if (Range::IsUnknown(value_range)) {
     return;
   }
-  if ((range_ == NULL) &&
-      (recognized_kind() == MethodRecognizer::kTypedDataLength)) {
-    range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
+
+  // TODO(vegorov) check if precision of the analysis can be improved by
+  // recognizing intersections of the form:
+  //
+  //       (..., S+x] ^ [S+x, ...) = [S+x, S+x]
+  //
+  Range result = value_range->Intersect(constraint());
+
+  if (result.IsUnsatisfiable()) {
     return;
   }
-  if ((range_ == NULL) &&
-      (recognized_kind() == MethodRecognizer::kStringBaseLength)) {
-    range_ = new Range(RangeBoundary::FromConstant(0),
-                       RangeBoundary::FromConstant(String::kMaxElements));
-    return;
+
+  *range = result;
+}
+
+
+void LoadFieldInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  switch (recognized_kind()) {
+    case MethodRecognizer::kObjectArrayLength:
+    case MethodRecognizer::kImmutableArrayLength:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(Array::kMaxElements));
+      break;
+
+    case MethodRecognizer::kTypedDataLength:
+      *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
+      break;
+
+    case MethodRecognizer::kStringBaseLength:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(String::kMaxElements));
+      break;
+
+    default:
+      Definition::InferRange(analysis, range);
   }
-  Definition::InferRange();
 }
 
 
 
-void LoadIndexedInstr::InferRange() {
+void LoadIndexedInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   switch (class_id()) {
     case kTypedDataInt8ArrayCid:
-      range_ = new Range(RangeBoundary::FromConstant(-128),
-                         RangeBoundary::FromConstant(127));
+      *range = Range(RangeBoundary::FromConstant(-128),
+                     RangeBoundary::FromConstant(127));
       break;
     case kTypedDataUint8ArrayCid:
     case kTypedDataUint8ClampedArrayCid:
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
-      range_ = new Range(RangeBoundary::FromConstant(0),
-                         RangeBoundary::FromConstant(255));
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(255));
       break;
     case kTypedDataInt16ArrayCid:
-      range_ = new Range(RangeBoundary::FromConstant(-32768),
-                         RangeBoundary::FromConstant(32767));
+      *range = Range(RangeBoundary::FromConstant(-32768),
+                     RangeBoundary::FromConstant(32767));
       break;
     case kTypedDataUint16ArrayCid:
-      range_ = new Range(RangeBoundary::FromConstant(0),
-                         RangeBoundary::FromConstant(65535));
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(65535));
       break;
     case kTypedDataInt32ArrayCid:
       if (Typed32BitIsSmi()) {
-        range_ = Range::UnknownSmi();
+        *range = Range::Full(RangeBoundary::kRangeBoundarySmi);
       } else {
-        range_ = new Range(RangeBoundary::FromConstant(kMinInt32),
-                           RangeBoundary::FromConstant(kMaxInt32));
+        *range = Range(RangeBoundary::FromConstant(kMinInt32),
+                       RangeBoundary::FromConstant(kMaxInt32));
       }
       break;
     case kTypedDataUint32ArrayCid:
       if (Typed32BitIsSmi()) {
-        range_ = Range::UnknownSmi();
+        *range = Range::Full(RangeBoundary::kRangeBoundarySmi);
       } else {
-        range_ = new Range(RangeBoundary::FromConstant(0),
-                           RangeBoundary::FromConstant(kMaxUint32));
+        *range = Range(RangeBoundary::FromConstant(0),
+                       RangeBoundary::FromConstant(kMaxUint32));
       }
       break;
     case kOneByteStringCid:
-      range_ = new Range(RangeBoundary::FromConstant(0),
-                         RangeBoundary::FromConstant(0xFF));
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(0xFF));
       break;
     case kTwoByteStringCid:
-      range_ = new Range(RangeBoundary::FromConstant(0),
-                         RangeBoundary::FromConstant(0xFFFF));
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(0xFFFF));
       break;
     default:
-      Definition::InferRange();
+      Definition::InferRange(analysis, range);
       break;
   }
 }
 
 
-void IfThenElseInstr::InferRange() {
+void IfThenElseInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   const intptr_t min = Utils::Minimum(if_true_, if_false_);
   const intptr_t max = Utils::Maximum(if_true_, if_false_);
-  range_ = new Range(RangeBoundary::FromConstant(min),
-                     RangeBoundary::FromConstant(max));
+  *range = Range(RangeBoundary::FromConstant(min),
+                 RangeBoundary::FromConstant(max));
 }
 
 
-void BinarySmiOpInstr::InferRange() {
+void BinarySmiOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
   // right and a non-constant on the left.
   Definition* left_defn = left()->definition();
 
-  Range* left_range = left_defn->range();
-  Range* right_range = right()->definition()->range();
+  const Range* left_range = analysis->GetSmiRange(left());
+  const Range* right_range = analysis->GetSmiRange(right());
 
-  if ((left_range == NULL) || (right_range == NULL)) {
-    range_ = Range::UnknownSmi();
+  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
     return;
   }
 
-  Range* possible_range = Range::BinaryOp(op_kind(),
-                                          left_range,
-                                          right_range,
-                                          left_defn);
+  Range::BinaryOp(op_kind(),
+                  left_range,
+                  right_range,
+                  left_defn,
+                  range);
+  ASSERT(!Range::IsUnknown(range));
 
-  if ((range_ == NULL) && (possible_range == NULL)) {
-    // Initialize.
-    range_ = Range::UnknownSmi();
-    return;
-  }
-
-  if (possible_range == NULL) {
-    // Nothing new.
-    return;
-  }
-
-  range_ = possible_range;
-
-  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
   // Calculate overflowed status before clamping.
-  const bool overflowed = range_->min().LowerBound().OverflowedSmi() ||
-                          range_->max().UpperBound().OverflowedSmi();
+  const bool overflowed = range->min().LowerBound().OverflowedSmi() ||
+                          range->max().UpperBound().OverflowedSmi();
   set_overflow(overflowed);
 
   // Clamp value to be within smi range.
-  range_->Clamp(RangeBoundary::kRangeBoundarySmi);
+  range->Clamp(RangeBoundary::kRangeBoundarySmi);
 }
 
 
-void BinaryMintOpInstr::InferRange() {
+void BoxInt32Instr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = value()->definition()->range();
+  if (!Range::IsUnknown(value_range)) {
+    *range = *value_range;
+  }
+}
+
+
+void UnboxInt32Instr::InferRange(RangeAnalysis* analysis, Range* range) {
+  if (value()->definition()->Type()->ToCid() == kSmiCid) {
+    const Range* value_range = analysis->GetSmiRange(value());
+    if (!Range::IsUnknown(value_range)) {
+      *range = *value_range;
+    }
+  } else if (value()->definition()->IsMintDefinition() ||
+             value()->definition()->IsInt32Definition()) {
+    const Range* value_range = value()->definition()->range();
+    if (!Range::IsUnknown(value_range)) {
+      *range = *value_range;
+    }
+  } else if (value()->Type()->ToCid() == kSmiCid) {
+    *range = Range::Full(RangeBoundary::kRangeBoundarySmi);
+  } else {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt32);
+  }
+}
+
+
+void UnboxedIntConverterInstr::InferRange(RangeAnalysis* analysis,
+                                          Range* range) {
+  ASSERT((from() == kUnboxedInt32) ||
+         (from() == kUnboxedMint) ||
+         (from() == kUnboxedUint32));
+  ASSERT((to() == kUnboxedInt32) ||
+         (to() == kUnboxedMint) ||
+         (to() == kUnboxedUint32));
+  const Range* value_range = value()->definition()->range();
+  if (Range::IsUnknown(value_range)) {
+    return;
+  }
+
+  if (to() == kUnboxedUint32) {
+    // TODO(vegorov): improve range information for unboxing to Uint32.
+    *range = Range(
+        RangeBoundary::FromConstant(0),
+        RangeBoundary::FromConstant(static_cast<int64_t>(kMaxUint32)));
+  } else {
+    *range = *value_range;
+    if (to() == kUnboxedInt32) {
+      range->Clamp(RangeBoundary::kRangeBoundaryInt32);
+    }
+  }
+}
+
+
+void BinaryInt32OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
+  // right and a non-constant on the left.
+  Definition* left_defn = left()->definition();
+
+  const Range* left_range = analysis->GetSmiRange(left());
+  const Range* right_range = analysis->GetSmiRange(right());
+
+  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
+    return;
+  }
+
+  Range::BinaryOp(op_kind(),
+                  left_range,
+                  right_range,
+                  left_defn,
+                  range);
+  ASSERT(!Range::IsUnknown(range));
+
+  // Calculate overflowed status before clamping.
+  set_overflow(!range->Fits(RangeBoundary::kRangeBoundaryInt32));
+
+  // Clamp value to be within smi range.
+  range->Clamp(RangeBoundary::kRangeBoundaryInt32);
+}
+
+void BinaryMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   // TODO(vegorov): canonicalize BinaryMintOpInstr to always have constant on
   // the right and a non-constant on the left.
   Definition* left_defn = left()->definition();
 
-  Range* left_range = left_defn->range();
-  Range* right_range = right()->definition()->range();
+  const Range* left_range = left_defn->range();
+  const Range* right_range = right()->definition()->range();
 
-  if ((left_range == NULL) || (right_range == NULL)) {
-    range_ = Range::Unknown();
+  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
     return;
   }
 
-  Range* possible_range = Range::BinaryOp(op_kind(),
-                                          left_range,
-                                          right_range,
-                                          left_defn);
-
-  if ((range_ == NULL) && (possible_range == NULL)) {
-    // Initialize.
-    range_ = Range::Unknown();
-    return;
-  }
-
-  if (possible_range == NULL) {
-    // Nothing new.
-    return;
-  }
-
-  range_ = possible_range;
-
-  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+  Range::BinaryOp(op_kind(),
+                  left_range,
+                  right_range,
+                  left_defn,
+                  range);
+  ASSERT(!Range::IsUnknown(range));
 
   // Calculate overflowed status before clamping.
-  const bool overflowed = range_->min().LowerBound().OverflowedMint() ||
-                          range_->max().UpperBound().OverflowedMint();
-  set_can_overflow(overflowed);
+  set_can_overflow(!range->Fits(RangeBoundary::kRangeBoundaryInt64));
 
   // Clamp value to be within mint range.
-  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  range->Clamp(RangeBoundary::kRangeBoundaryInt64);
 }
 
 
-void ShiftMintOpInstr::InferRange() {
+void ShiftMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   Definition* left_defn = left()->definition();
 
-  Range* left_range = left_defn->range();
-  Range* right_range = right()->definition()->range();
+  const Range* left_range = left_defn->range();
+  const Range* right_range = right()->definition()->range();
 
-  if ((left_range == NULL) || (right_range == NULL)) {
-    range_ = Range::Unknown();
+  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
     return;
   }
 
-  Range* possible_range = Range::BinaryOp(op_kind(),
-                                          left_range,
-                                          right_range,
-                                          left_defn);
-
-  if ((range_ == NULL) && (possible_range == NULL)) {
-    // Initialize.
-    range_ = Range::Unknown();
-    return;
-  }
-
-  if (possible_range == NULL) {
-    // Nothing new.
-    return;
-  }
-
-  range_ = possible_range;
-
-  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+  Range::BinaryOp(op_kind(),
+                  left_range,
+                  right_range,
+                  left_defn,
+                  range);
+  ASSERT(!Range::IsUnknown(range));
 
   // Calculate overflowed status before clamping.
-  const bool overflowed = range_->min().LowerBound().OverflowedMint() ||
-                          range_->max().UpperBound().OverflowedMint();
+  const bool overflowed = range->min().LowerBound().OverflowedMint() ||
+                          range->max().UpperBound().OverflowedMint();
   set_can_overflow(overflowed);
 
   // Clamp value to be within mint range.
-  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  range->Clamp(RangeBoundary::kRangeBoundaryInt64);
 }
 
 
-void BoxIntegerInstr::InferRange() {
-  Range* input_range = value()->definition()->range();
+void BoxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* input_range = value()->definition()->range();
   if (input_range != NULL) {
-    bool is_smi = !input_range->min().LowerBound().OverflowedSmi() &&
-                  !input_range->max().UpperBound().OverflowedSmi();
+    bool is_smi = input_range->Fits(RangeBoundary::kRangeBoundarySmi);
     set_is_smi(is_smi);
     // The output range is the same as the input range.
-    range_ = input_range;
+    *range = *input_range;
+  }
+}
+
+
+void UnboxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = value()->definition()->range();
+  if (value_range != NULL) {
+    *range = *value_range;
+  } else if (!value()->definition()->IsMintDefinition() &&
+             (value()->definition()->Type()->ToCid() != kSmiCid)) {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
   }
 }
 
diff --git a/runtime/vm/flow_graph_range_analysis.h b/runtime/vm/flow_graph_range_analysis.h
index f9ae036..d815385 100644
--- a/runtime/vm/flow_graph_range_analysis.h
+++ b/runtime/vm/flow_graph_range_analysis.h
@@ -22,6 +22,7 @@
 
   enum RangeSize {
     kRangeBoundarySmi,
+    kRangeBoundaryInt32,
     kRangeBoundaryInt64,
   };
 
@@ -74,7 +75,7 @@
     return FromConstant(Smi::kMaxValue);
   }
 
-    // Construct a RangeBoundary for the constant kMin value.
+  // Construct a RangeBoundary for the constant kMin value.
   static RangeBoundary MinConstant() {
     return FromConstant(kMin);
   }
@@ -84,15 +85,76 @@
     return FromConstant(kMax);
   }
 
-  // Calculate the minimum of a and b within the given range.
-  static RangeBoundary Min(RangeBoundary a, RangeBoundary b, RangeSize size);
-  static RangeBoundary Max(RangeBoundary a, RangeBoundary b, RangeSize size);
+  // Construct a RangeBoundary for the constant kMin value.
+  static RangeBoundary MinConstant(RangeSize size) {
+    switch (size) {
+      case kRangeBoundarySmi:
+        return FromConstant(Smi::kMinValue);
+      case kRangeBoundaryInt32:
+        return FromConstant(kMinInt32);
+      case kRangeBoundaryInt64:
+        return FromConstant(kMinInt64);
+    }
+    UNREACHABLE();
+    return FromConstant(kMinInt64);
+  }
+
+  static RangeBoundary MaxConstant(RangeSize size) {
+    switch (size) {
+      case kRangeBoundarySmi:
+        return FromConstant(Smi::kMaxValue);
+      case kRangeBoundaryInt32:
+        return FromConstant(kMaxInt32);
+      case kRangeBoundaryInt64:
+        return FromConstant(kMaxInt64);
+    }
+    UNREACHABLE();
+    return FromConstant(kMaxInt64);
+  }
+
+
+  // Given two boundaries a and b, select one of them as c so that
+  //
+  //   inf {[a, ...) ^ [b, ...)} >= inf {c}
+  //
+  static RangeBoundary IntersectionMin(RangeBoundary a, RangeBoundary b);
+
+  // Given two boundaries a and b, select one of them as c so that
+  //
+  //   sup {(..., a] ^ (..., b]} <= sup {c}
+  //
+  static RangeBoundary IntersectionMax(RangeBoundary a, RangeBoundary b);
+
+  // Given two boundaries a and b compute boundary c such that
+  //
+  //   inf {[a, ...) U  [b, ...)} >= inf {c}
+  //
+  // Try to select c such that it is as close to inf {[a, ...) U [b, ...)}
+  // as possible.
+  static RangeBoundary JoinMin(RangeBoundary a,
+                               RangeBoundary b,
+                               RangeBoundary::RangeSize size);
+
+  // Given two boundaries a and b compute boundary c such that
+  //
+  //   sup {(..., a] U (..., b]} <= sup {c}
+  //
+  // Try to select c such that it is as close to sup {(..., a] U (..., b]}
+  // as possible.
+  static RangeBoundary JoinMax(RangeBoundary a,
+                               RangeBoundary b,
+                               RangeBoundary::RangeSize size);
 
   // Returns true when this is a constant that is outside of Smi range.
   bool OverflowedSmi() const {
     return (IsConstant() && !Smi::IsValid(ConstantValue())) || IsInfinity();
   }
 
+  bool Overflowed(RangeBoundary::RangeSize size) const {
+    ASSERT(IsConstantOrInfinity());
+    return !Equals(Clamp(size));
+  }
+
   // Returns true if this outside mint range.
   bool OverflowedMint() const {
     return IsInfinity();
@@ -101,41 +163,40 @@
   // -/+ infinity are clamped to MinConstant/MaxConstant of the given type.
   RangeBoundary Clamp(RangeSize size) const {
     if (IsNegativeInfinity()) {
-      return (size == kRangeBoundaryInt64) ? MinConstant() : MinSmi();
+      return RangeBoundary::MinConstant(size);
     }
+
     if (IsPositiveInfinity()) {
-      return (size == kRangeBoundaryInt64) ? MaxConstant() : MaxSmi();
+      return RangeBoundary::MaxConstant(size);
     }
-    if ((size == kRangeBoundarySmi) && IsConstant()) {
-      if (ConstantValue() <= Smi::kMinValue) {
-        return MinSmi();
+
+    if (IsConstant()) {
+      const RangeBoundary range_min = RangeBoundary::MinConstant(size);
+      const RangeBoundary range_max = RangeBoundary::MaxConstant(size);
+
+      if (ConstantValue() <= range_min.ConstantValue()) {
+        return range_min;
       }
-      if (ConstantValue() >= Smi::kMaxValue) {
-        return MaxSmi();
+      if (ConstantValue() >= range_max.ConstantValue()) {
+        return range_max;
       }
     }
+
     // If this range is a symbolic range, we do not clamp it.
     // This could lead to some imprecision later on.
     return *this;
   }
 
-
-  bool IsSmiMinimumOrBelow() const {
+  bool IsMinimumOrBelow(RangeSize size) const {
     return IsNegativeInfinity() ||
-           (IsConstant() && (ConstantValue() <= Smi::kMinValue));
+        (IsConstant() &&
+         (ConstantValue() <= RangeBoundary::MinConstant(size).ConstantValue()));
   }
 
-  bool IsSmiMaximumOrAbove() const {
+  bool IsMaximumOrAbove(RangeSize size) const {
     return IsPositiveInfinity() ||
-           (IsConstant() && (ConstantValue() >= Smi::kMaxValue));
-  }
-
-  bool IsMinimumOrBelow() const {
-    return IsNegativeInfinity() || (IsConstant() && (ConstantValue() == kMin));
-  }
-
-  bool IsMaximumOrAbove() const {
-    return IsPositiveInfinity() || (IsConstant() && (ConstantValue() == kMax));
+        (IsConstant() &&
+         (ConstantValue() >= RangeBoundary::MaxConstant(size).ConstantValue()));
   }
 
   intptr_t kind() const {
@@ -222,6 +283,22 @@
 
   bool Equals(const RangeBoundary& other) const;
 
+  int64_t UpperBound(RangeSize size) const {
+    return UpperBound().Clamp(size).ConstantValue();
+  }
+
+  int64_t LowerBound(RangeSize size) const {
+    return LowerBound().Clamp(size).ConstantValue();
+  }
+
+  int64_t SmiUpperBound() const {
+    return UpperBound(kRangeBoundarySmi);
+  }
+
+  int64_t SmiLowerBound() const {
+    return LowerBound(kRangeBoundarySmi);
+  }
+
  private:
   RangeBoundary(Kind kind, int64_t value, int64_t offset)
       : kind_(kind), value_(value), offset_(offset) { }
@@ -234,52 +311,89 @@
 
 class Range : public ZoneAllocated {
  public:
-  Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) { }
-
-  static Range* Unknown() {
-    return new Range(RangeBoundary::MinConstant(),
-                     RangeBoundary::MaxConstant());
+  Range() : min_(), max_() { }
+  Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) {
+    ASSERT(min_.IsUnknown() == max_.IsUnknown());
   }
 
-  static Range* UnknownSmi() {
-    return new Range(RangeBoundary::MinSmi(),
-                     RangeBoundary::MaxSmi());
+  Range(const Range& other)
+      : ZoneAllocated(),
+        min_(other.min_),
+        max_(other.max_) {
+  }
+
+  Range& operator=(const Range& other) {
+    min_ = other.min_;
+    max_ = other.max_;
+    return *this;
+  }
+
+  static bool IsUnknown(const Range* other) {
+    if (other == NULL) {
+      return true;
+    }
+    return other->min().IsUnknown();
+  }
+
+  static Range Full(RangeBoundary::RangeSize size) {
+    return Range(RangeBoundary::MinConstant(size),
+                 RangeBoundary::MaxConstant(size));
   }
 
   void PrintTo(BufferFormatter* f) const;
   static const char* ToCString(const Range* range);
 
+  bool Equals(const Range* other) {
+    ASSERT(min_.IsUnknown() == max_.IsUnknown());
+    if (other == NULL) {
+      return min_.IsUnknown();
+    }
+    return min_.Equals(other->min_) &&
+        max_.Equals(other->max_);
+  }
+
   const RangeBoundary& min() const { return min_; }
   const RangeBoundary& max() const { return max_; }
+  void set_min(const RangeBoundary& value) {
+    min_ = value;
+  }
+  void set_max(const RangeBoundary& value) {
+    max_ = value;
+  }
 
   static RangeBoundary ConstantMinSmi(const Range* range) {
-    if (range == NULL) {
-      return RangeBoundary::MinSmi();
-    }
-    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundarySmi);
+    return ConstantMin(range, RangeBoundary::kRangeBoundarySmi);
   }
 
   static RangeBoundary ConstantMaxSmi(const Range* range) {
-    if (range == NULL) {
-      return RangeBoundary::MaxSmi();
-    }
-    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundarySmi);
+    return ConstantMax(range, RangeBoundary::kRangeBoundarySmi);
   }
 
   static RangeBoundary ConstantMin(const Range* range) {
-    if (range == NULL) {
-      return RangeBoundary::MinConstant();
-    }
-    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
+    return ConstantMin(range, RangeBoundary::kRangeBoundaryInt64);
   }
 
   static RangeBoundary ConstantMax(const Range* range) {
-    if (range == NULL) {
-      return RangeBoundary::MaxConstant();
-    }
-    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
+    return ConstantMax(range, RangeBoundary::kRangeBoundaryInt64);
   }
 
+  static RangeBoundary ConstantMin(const Range* range,
+                                   RangeBoundary::RangeSize size) {
+    if (range == NULL) {
+      return RangeBoundary::MinConstant(size);
+    }
+    return range->min().LowerBound().Clamp(size);
+  }
+
+  static RangeBoundary ConstantMax(const Range* range,
+                                   RangeBoundary::RangeSize size) {
+    if (range == NULL) {
+      return RangeBoundary::MaxConstant(size);
+    }
+    return range->max().UpperBound().Clamp(size);
+  }
+
+
   // [0, +inf]
   bool IsPositive() const;
 
@@ -301,6 +415,20 @@
     return !min_.IsInfinity() && !max_.IsInfinity();
   }
 
+  Range Intersect(const Range* other) const {
+    return Range(RangeBoundary::IntersectionMin(min(), other->min()),
+                 RangeBoundary::IntersectionMax(max(), other->max()));
+  }
+
+  bool Fits(RangeBoundary::RangeSize size) const {
+    return !min().LowerBound().Overflowed(size) &&
+           !max().UpperBound().Overflowed(size);
+  }
+
+  static bool Fits(Range* range, RangeBoundary::RangeSize size) {
+    return !IsUnknown(range) && range->Fits(size);
+  }
+
   // Clamp this to be within size.
   void Clamp(RangeBoundary::RangeSize size);
 
@@ -345,10 +473,11 @@
   // Return the maximum absolute value included in range.
   static int64_t ConstantAbsMax(const Range* range);
 
-  static Range* BinaryOp(const Token::Kind op,
-                         const Range* left_range,
-                         const Range* right_range,
-                         Definition* left_defn);
+  static void BinaryOp(const Token::Kind op,
+                       const Range* left_range,
+                       const Range* right_range,
+                       Definition* left_defn,
+                       Range* result);
 
  private:
   RangeBoundary min_;
@@ -361,13 +490,26 @@
  public:
   explicit RangeAnalysis(FlowGraph* flow_graph)
       : flow_graph_(flow_graph),
-        marked_defns_(NULL) { }
+        smi_range_(Range::Full(RangeBoundary::kRangeBoundarySmi)) { }
 
   // Infer ranges for all values and remove overflow checks from binary smi
   // operations when proven redundant.
   void Analyze();
 
+  // Helper that should be used to access ranges of inputs during range
+  // inference.
+  // Returns meaningful results for uses of non-smi definitions that have smi
+  // as a reaching type.
+  const Range* GetSmiRange(Value* value) const;
+
  private:
+  enum JoinOperator {
+    NONE,
+    WIDEN,
+    NARROW
+  };
+  static char OpPrefix(JoinOperator op);
+
   // Collect all values that were proven to be smi in smi_values_ array and all
   // CheckSmi instructions in smi_check_ array.
   void CollectValues();
@@ -384,14 +526,13 @@
 
   // Create a constraint for defn, insert it after given instruction and
   // rename all uses that are dominated by it.
-  ConstraintInstr* InsertConstraintFor(Definition* defn,
+  ConstraintInstr* InsertConstraintFor(Value* use,
+                                       Definition* defn,
                                        Range* constraint,
                                        Instruction* after);
 
-  void ConstrainValueAfterBranch(Definition* defn, Value* use);
-  void ConstrainValueAfterCheckArrayBound(Definition* defn,
-                                          CheckArrayBoundInstr* check,
-                                          intptr_t use_index);
+  void ConstrainValueAfterBranch(Value* use, Definition* defn);
+  void ConstrainValueAfterCheckArrayBound(Value* use, Definition* defn);
 
   // Replace uses of the definition def that are dominated by instruction dom
   // with uses of other definition.
@@ -400,62 +541,57 @@
                            Definition* other);
 
 
-  // Walk the dominator tree and infer ranges for smi values.
+  // Infer ranges for integer (smi or mint) definitions.
   void InferRanges();
-  void InferRangesRecursive(BlockEntryInstr* block);
 
-  enum Direction {
-    kUnknown,
-    kPositive,
-    kNegative,
-    kBoth
-  };
+  // Collect integer definition in the reverse postorder.
+  void CollectDefinitions(BlockEntryInstr* block, BitVector* set);
 
-  Range* InferInductionVariableRange(JoinEntryInstr* loop_header,
-                                     PhiInstr* var);
+  // Recompute ranges of all definitions until they stop changing.
+  // Apply the given JoinOperator when computing Phi ranges.
+  void Iterate(JoinOperator op, intptr_t max_iterations);
+  bool InferRange(JoinOperator op, Definition* defn, intptr_t iteration);
 
-  void ResetWorklist();
-  void MarkDefinition(Definition* defn);
+  // Based on computed ranges find and eliminate redundant CheckArrayBound
+  // instructions.
+  void EliminateRedundantBoundsChecks();
 
-  static Direction ToDirection(Value* val);
+  // Find unsatisfiable constraints and mark corresponding blocks unreachable.
+  void MarkUnreachableBlocks();
 
-  static Direction Invert(Direction direction) {
-    return (direction == kPositive) ? kNegative : kPositive;
-  }
-
-  static void UpdateDirection(Direction* direction,
-                              Direction new_direction) {
-    if (*direction != new_direction) {
-      if (*direction != kUnknown) new_direction = kBoth;
-      *direction = new_direction;
-    }
-  }
+  // Convert mint operations that stay within int32 range into Int32 operations.
+  void NarrowMintToInt32();
 
   // Remove artificial Constraint instructions and replace them with actual
   // unconstrained definitions.
   void RemoveConstraints();
 
-  Range* ConstraintRange(Token::Kind op, Definition* boundary);
+  Range* ConstraintSmiRange(Token::Kind op, Definition* boundary);
 
   Isolate* isolate() const { return flow_graph_->isolate(); }
 
   FlowGraph* flow_graph_;
 
+  // Range object representing full Smi range.
+  Range smi_range_;
+
   // Value that are known to be smi or mint.
   GrowableArray<Definition*> values_;
-  // All CheckSmi instructions.
-  GrowableArray<CheckSmiInstr*> smi_checks_;
+
+  GrowableArray<BinaryMintOpInstr*> binary_mint_ops_;
+
+  GrowableArray<ShiftMintOpInstr*> shift_mint_ops_;
+
+  // All CheckArrayBound instructions.
+  GrowableArray<CheckArrayBoundInstr*> bounds_checks_;
 
   // All Constraints inserted during InsertConstraints phase. They are treated
   // as smi values.
   GrowableArray<ConstraintInstr*> constraints_;
 
-  // Bitvector for a quick filtering of known smi or mint values.
-  BitVector* definitions_;
-
-  // Worklist for induction variables analysis.
-  GrowableArray<Definition*> worklist_;
-  BitVector* marked_defns_;
+  // List of integer (smi or mint) definitions including constraints sorted
+  // in the reverse postorder.
+  GrowableArray<Definition*> definitions_;
 
   DISALLOW_COPY_AND_ASSIGN(RangeAnalysis);
 };
diff --git a/runtime/vm/flow_graph_range_analysis_test.cc b/runtime/vm/flow_graph_range_analysis_test.cc
index 0471748..781aae2 100644
--- a/runtime/vm/flow_graph_range_analysis_test.cc
+++ b/runtime/vm/flow_graph_range_analysis_test.cc
@@ -261,40 +261,53 @@
   range_b->Clamp(RangeBoundary::kRangeBoundaryInt64);
   EXPECT(range_b->min().ConstantValue() == RangeBoundary::kMin);
   EXPECT(range_b->max().ConstantValue() == 1);
-  Range* result = Range::BinaryOp(Token::kADD,
-                                  range_a,
-                                  range_b,
-                                  NULL);
-  ASSERT(result != NULL);
-  EXPECT(result->min().IsNegativeInfinity());
-  EXPECT(result->max().IsPositiveInfinity());
+
+  {
+    Range result;
+    Range::BinaryOp(Token::kADD,
+                    range_a,
+                    range_b,
+                    NULL,
+                    &result);
+    ASSERT(!Range::IsUnknown(&result));
+    EXPECT(result.min().IsNegativeInfinity());
+    EXPECT(result.max().IsPositiveInfinity());
+  }
 
   // Test that [5, 10] + [0, 5] = [5, 15].
   Range* range_c = new Range(RangeBoundary::FromConstant(5),
                              RangeBoundary::FromConstant(10));
   Range* range_d = new Range(RangeBoundary::FromConstant(0),
                              RangeBoundary::FromConstant(5));
-  result = Range::BinaryOp(Token::kADD,
-                           range_c,
-                           range_d,
-                           NULL);
-  ASSERT(result != NULL);
-  EXPECT(result->min().ConstantValue() == 5);
-  EXPECT(result->max().ConstantValue() == 15);
 
+  {
+    Range result;
+    Range::BinaryOp(Token::kADD,
+                    range_c,
+                    range_d,
+                    NULL,
+                    &result);
+    ASSERT(!Range::IsUnknown(&result));
+    EXPECT(result.min().ConstantValue() == 5);
+    EXPECT(result.max().ConstantValue() == 15);
+  }
 
   // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
   Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
                              RangeBoundary::FromConstant(0xfff));
   Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
                              RangeBoundary::FromConstant(0xf));
-  result = Range::BinaryOp(Token::kBIT_AND,
-                           range_e,
-                           range_f,
-                           NULL);
-  ASSERT(result != NULL);
-  EXPECT(result->min().ConstantValue() == 0x0);
-  EXPECT(result->max().ConstantValue() == 0xf);
+  {
+    Range result;
+    Range::BinaryOp(Token::kBIT_AND,
+                    range_e,
+                    range_f,
+                    NULL,
+                    &result);
+    ASSERT(!Range::IsUnknown(&result));
+    EXPECT(result.min().ConstantValue() == 0x0);
+    EXPECT(result.max().ConstantValue() == 0xf);
+  }
 }
 
 
@@ -525,118 +538,168 @@
 }
 
 
-TEST_CASE(RangeMinMax) {
+TEST_CASE(RangeIntersectionMinMax) {
+  // Test IntersectionMin and IntersectionMax methods which for constants are
+  // simply defined as Max/Min respectively.
+
   // Constants.
   // MIN(0, 1) == 0
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+      RangeBoundary::FromConstant(1)).ConstantValue() == 0);
   // MIN(0, -1) == -1
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
 
   // MIN(1, 0) == 0
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+      RangeBoundary::FromConstant(0)).ConstantValue() == 0);
   // MIN(-1, 0) == -1
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+      RangeBoundary::FromConstant(0)).ConstantValue() == -1);
 
   // MAX(0, 1) == 1
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
 
   // MAX(0, -1) == 0
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       RangeBoundary::FromConstant(0),
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+      RangeBoundary::FromConstant(-1)).ConstantValue() == 0);
 
   // MAX(1, 0) == 1
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       RangeBoundary::FromConstant(1),
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+      RangeBoundary::FromConstant(0)).ConstantValue() == 1);
   // MAX(-1, 0) == 0
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       RangeBoundary::FromConstant(-1),
-      RangeBoundary::FromConstant(0),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+      RangeBoundary::FromConstant(0)).ConstantValue() == 0);
 
   RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
   RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
 
   // Constants vs. infinity.
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       n_infinity,
-      RangeBoundary::FromConstant(-1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::Max(
+  EXPECT(RangeBoundary::IntersectionMin(
       RangeBoundary::FromConstant(-1),
+      n_infinity).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::IntersectionMin(
+      RangeBoundary::FromConstant(1),
+      n_infinity).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::IntersectionMin(
       n_infinity,
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
 
-  EXPECT(RangeBoundary::Max(
-      RangeBoundary::FromConstant(1),
-      n_infinity,
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
-
-  EXPECT(RangeBoundary::Max(
-      n_infinity,
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
-
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       p_infinity,
+      RangeBoundary::FromConstant(-1)).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(-1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+      p_infinity).ConstantValue() == -1);
 
-  EXPECT(RangeBoundary::Min(
-      RangeBoundary::FromConstant(-1),
-      p_infinity,
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
-
-  EXPECT(RangeBoundary::Min(
+  EXPECT(RangeBoundary::IntersectionMax(
       RangeBoundary::FromConstant(1),
+      p_infinity).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::IntersectionMax(
       p_infinity,
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
-
-  EXPECT(RangeBoundary::Min(
-      p_infinity,
-      RangeBoundary::FromConstant(1),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
-
-  // 64-bit values.
-  EXPECT(RangeBoundary::Min(
-      RangeBoundary(static_cast<int64_t>(kMinInt64)),
-      RangeBoundary(static_cast<int64_t>(kMinInt32)),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt64);
-
-  EXPECT(RangeBoundary::Max(
-      RangeBoundary(static_cast<int64_t>(kMinInt64)),
-      RangeBoundary(static_cast<int64_t>(kMinInt32)),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt32);
-
-  EXPECT(RangeBoundary::Min(
-      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
-      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt32);
-
-  EXPECT(RangeBoundary::Max(
-      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
-      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
-      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt64);
+      RangeBoundary::FromConstant(1)).ConstantValue() == 1);
 }
 
 
+TEST_CASE(RangeJoinMinMax) {
+  // Test IntersectionMin and IntersectionMax methods which for constants are
+  // simply defined as Min/Max respectively.
+  const RangeBoundary::RangeSize size = RangeBoundary::kRangeBoundarySmi;
+
+  // Constants.
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      size).ConstantValue() == 1);
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      size).ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      size).ConstantValue() == 1);
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      size).ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      size).ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      size).ConstantValue() == -1);
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      size).ConstantValue() == 0);
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      size).ConstantValue() == -1);
+
+  RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
+  RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
+
+  // Constants vs. infinity.
+  EXPECT(RangeBoundary::JoinMin(
+      n_infinity,
+      RangeBoundary::FromConstant(-1),
+      size).IsMinimumOrBelow(size));
+
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(-1),
+      n_infinity,
+      size).IsMinimumOrBelow(size));
+
+  EXPECT(RangeBoundary::JoinMin(
+      RangeBoundary::FromConstant(1),
+      n_infinity,
+      size).IsMinimumOrBelow(size));
+
+  EXPECT(RangeBoundary::JoinMin(
+      n_infinity,
+      RangeBoundary::FromConstant(1),
+      size).IsMinimumOrBelow(size));
+
+  EXPECT(RangeBoundary::JoinMax(
+      p_infinity,
+      RangeBoundary::FromConstant(-1),
+      size).IsMaximumOrAbove(size));
+
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(-1),
+      p_infinity,
+      size).IsMaximumOrAbove(size));
+
+  EXPECT(RangeBoundary::JoinMax(
+      RangeBoundary::FromConstant(1),
+      p_infinity,
+      size).IsMaximumOrAbove(size));
+
+  EXPECT(RangeBoundary::JoinMax(
+      p_infinity,
+      RangeBoundary::FromConstant(1),
+      size).IsMaximumOrAbove(size));
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index d7e6396..f702ed5 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -855,6 +855,13 @@
 }
 
 
+CompileType AllocateUninitializedContextInstr::ComputeType() const {
+  return CompileType(CompileType::kNonNullable,
+                     kContextCid,
+                     &AbstractType::ZoneHandle(Type::DynamicType()));
+}
+
+
 CompileType StaticCallInstr::ComputeType() const {
   if (result_cid_ != kDynamicCid) {
     return CompileType::FromCid(result_cid_);
@@ -1002,6 +1009,12 @@
 }
 
 
+CompileType BinaryInt32OpInstr::ComputeType() const {
+  // TODO(vegorov): range analysis information shall be used here.
+  return CompileType::Int();
+}
+
+
 CompileType BinarySmiOpInstr::ComputeType() const {
   return CompileType::FromCid(kSmiCid);
 }
@@ -1056,6 +1069,21 @@
 }
 
 
+CompileType BoxIntNInstr::ComputeType() const {
+  return ValueFitsSmi() ? CompileType::FromCid(kSmiCid) : CompileType::Int();
+}
+
+
+CompileType UnboxIntNInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+bool BoxIntNInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
+
 CompileType UnboxIntegerInstr::ComputeType() const {
   return CompileType::Int();
 }
@@ -1208,6 +1236,11 @@
 }
 
 
+CompileType Int32x4ConstructorInstr::ComputeType() const {
+  return CompileType::FromCid(kInt32x4Cid);
+}
+
+
 CompileType Int32x4BoolConstructorInstr::ComputeType() const {
   return CompileType::FromCid(kInt32x4Cid);
 }
@@ -1293,6 +1326,11 @@
 }
 
 
+CompileType Int32ToDoubleInstr::ComputeType() const {
+  return CompileType::FromCid(kDoubleCid);
+}
+
+
 CompileType SmiToDoubleInstr::ComputeType() const {
   return CompileType::FromCid(kDoubleCid);
 }
diff --git a/runtime/vm/freelist.cc b/runtime/vm/freelist.cc
index 7a9c930..eb1ce0a 100644
--- a/runtime/vm/freelist.cc
+++ b/runtime/vm/freelist.cc
@@ -5,11 +5,12 @@
 #include "vm/freelist.h"
 
 #include <map>
-#include <utility>
 
 #include "vm/bit_set.h"
+#include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
+#include "vm/thread.h"
 
 namespace dart {
 
@@ -49,17 +50,24 @@
 }
 
 
-FreeList::FreeList() {
+FreeList::FreeList() : mutex_(new Mutex()) {
   Reset();
 }
 
 
 FreeList::~FreeList() {
-  // Nothing to release.
+  delete mutex_;
 }
 
 
 uword FreeList::TryAllocate(intptr_t size, bool is_protected) {
+  MutexLocker ml(mutex_);
+  return TryAllocateLocked(size, is_protected);
+}
+
+
+uword FreeList::TryAllocateLocked(intptr_t size, bool is_protected) {
+  DEBUG_ASSERT(mutex_->Owner() == Isolate::Current());
   // Precondition: is_protected is false or else all free list elements are
   // in non-writable pages.
 
@@ -166,6 +174,13 @@
 
 
 void FreeList::Free(uword addr, intptr_t size) {
+  MutexLocker ml(mutex_);
+  FreeLocked(addr, size);
+}
+
+
+void FreeList::FreeLocked(uword addr, intptr_t size) {
+  DEBUG_ASSERT(mutex_->Owner() == Isolate::Current());
   // Precondition required by AsElement and EnqueueElement: the (page
   // containing the) header of the freed block should be writable.  This is
   // the case when called for newly allocated pages because they are
@@ -179,6 +194,7 @@
 
 
 void FreeList::Reset() {
+  MutexLocker ml(mutex_);
   free_map_.Reset();
   for (int i = 0; i < (kNumLists + 1); i++) {
     free_lists_[i] = NULL;
@@ -220,6 +236,7 @@
 
 
 intptr_t FreeList::Length(int index) const {
+  MutexLocker ml(mutex_);
   ASSERT(index >= 0);
   ASSERT(index < kNumLists);
   intptr_t result = 0;
@@ -290,6 +307,7 @@
 
 
 void FreeList::Print() const {
+  MutexLocker ml(mutex_);
   PrintSmall();
   PrintLarge();
 }
diff --git a/runtime/vm/freelist.h b/runtime/vm/freelist.h
index adfeb63..0216e07 100644
--- a/runtime/vm/freelist.h
+++ b/runtime/vm/freelist.h
@@ -9,6 +9,7 @@
 #include "vm/allocation.h"
 #include "vm/bit_set.h"
 #include "vm/raw_object.h"
+#include "vm/thread.h"
 
 namespace dart {
 
@@ -85,15 +86,19 @@
 
   void Reset();
 
-  intptr_t Length(int index) const;
-
   void Print() const;
 
+  Mutex* mutex() { return mutex_; }
+  uword TryAllocateLocked(intptr_t size, bool is_protected);
+  void FreeLocked(uword addr, intptr_t size);
+
  private:
   static const int kNumLists = 128;
 
   static intptr_t IndexForSize(intptr_t size);
 
+  intptr_t Length(int index) const;
+
   void EnqueueElement(FreeListElement* element, intptr_t index);
   FreeListElement* DequeueElement(intptr_t index);
 
@@ -104,6 +109,9 @@
   void PrintSmall() const;
   void PrintLarge() const;
 
+  // Lock protecting the free list data structures.
+  Mutex* mutex_;
+
   BitSet<kNumLists> free_map_;
 
   FreeListElement* free_lists_[kNumLists + 1];
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 7bf9e35..aad3ebe6 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -187,7 +187,6 @@
 
     // Mark the object and push it on the marking stack.
     ASSERT(!raw_obj->IsMarked());
-    RawClass* raw_class = isolate()->class_table()->At(raw_obj->GetClassId());
     raw_obj->SetMarkBit();
     raw_obj->ClearRememberedBit();
     if (raw_obj->IsWatched()) {
@@ -205,9 +204,6 @@
       raw_obj->ClearWatchedBit();
     }
     marking_stack_->Push(raw_obj);
-
-    // TODO(iposva): Should we mark the classes early?
-    MarkObject(raw_class, NULL);
   }
 
   void MarkObject(RawObject* raw_obj, RawObject** p) {
@@ -418,7 +414,11 @@
   while (!visitor->marking_stack()->IsEmpty()) {
     RawObject* raw_obj = visitor->marking_stack()->Pop();
     visitor->VisitingOldObject(raw_obj);
-    if (raw_obj->GetClassId() != kWeakPropertyCid) {
+    const intptr_t class_id = raw_obj->GetClassId();
+    // Currently, classes are considered roots (see issue 18284), so at this
+    // point, they should all be marked.
+    ASSERT(isolate->class_table()->At(class_id)->IsMarked());
+    if (class_id != kWeakPropertyCid) {
       marked_bytes_ += raw_obj->VisitPointers(visitor);
     } else {
       RawWeakProperty* raw_weak = reinterpret_cast<RawWeakProperty*>(raw_obj);
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index a9ba021..2428f62 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -7,7 +7,9 @@
 #include "vm/freelist.h"
 #include "vm/globals.h"
 #include "vm/heap.h"
+#include "vm/lockers.h"
 #include "vm/pages.h"
+#include "vm/thread_pool.h"
 
 namespace dart {
 
@@ -45,7 +47,7 @@
       }
       if ((current != start) || (free_end != end)) {
         // Only add to the free list if not covering the whole page.
-        freelist->Free(current, obj_size);
+        freelist->FreeLocked(current, obj_size);
       }
     }
     current += obj_size;
@@ -77,4 +79,88 @@
   return words_to_end;
 }
 
+
+class SweeperTask : public ThreadPool::Task {
+ public:
+  SweeperTask(Isolate* isolate,
+              PageSpace* old_space,
+              HeapPage* first,
+              HeapPage* last,
+              FreeList* freelist)
+      : task_isolate_(isolate),
+        old_space_(old_space),
+        first_(first),
+        last_(last),
+        freelist_(freelist) {
+    ASSERT(task_isolate_ != NULL);
+    ASSERT(first_ != NULL);
+    ASSERT(old_space_ != NULL);
+    ASSERT(last_ != NULL);
+    ASSERT(freelist_ != NULL);
+    MonitorLocker ml(old_space_->tasks_lock());
+    old_space_->set_tasks(old_space_->tasks() + 1);
+    ml.Notify();
+  }
+
+  virtual void Run() {
+    Isolate::SetCurrent(task_isolate_);
+    GCSweeper sweeper(NULL);
+
+    HeapPage* page = first_;
+    HeapPage* prev_page = NULL;
+
+    while (page != NULL) {
+      HeapPage* next_page = page->next();
+      ASSERT(page->type() == HeapPage::kData);
+      bool page_in_use = true;
+      {
+        MutexLocker ml(freelist_->mutex());
+        page_in_use = sweeper.SweepPage(page, freelist_);
+      }
+      if (page_in_use) {
+        prev_page = page;
+      } else {
+        old_space_->FreePage(page, prev_page);
+      }
+      {
+        // Notify the mutator thread that we have added elements to the free
+        // list or that more capacity is available.
+        MonitorLocker ml(old_space_->tasks_lock());
+        ml.Notify();
+      }
+      if (page == last_) break;
+      page = next_page;
+    }
+    // This sweeper task is done. Notify the original isolate.
+    {
+      MonitorLocker ml(old_space_->tasks_lock());
+      old_space_->set_tasks(old_space_->tasks() - 1);
+      ml.Notify();
+    }
+    Isolate::SetCurrent(NULL);
+    delete task_isolate_;
+  }
+
+ private:
+  Isolate* task_isolate_;
+  PageSpace* old_space_;
+  HeapPage* first_;
+  HeapPage* last_;
+  FreeList* freelist_;
+};
+
+
+void GCSweeper::SweepConcurrent(Isolate* isolate,
+                                HeapPage* first,
+                                HeapPage* last,
+                                FreeList* freelist) {
+  SweeperTask* task =
+      new SweeperTask(isolate->ShallowCopy(),
+                      isolate->heap()->old_space(),
+                      first, last,
+                      freelist);
+  ThreadPool* pool = Dart::thread_pool();
+  pool->Run(task);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/gc_sweeper.h b/runtime/vm/gc_sweeper.h
index 7f2007c..13bbb55 100644
--- a/runtime/vm/gc_sweeper.h
+++ b/runtime/vm/gc_sweeper.h
@@ -13,6 +13,8 @@
 class FreeList;
 class Heap;
 class HeapPage;
+class Isolate;
+class PageSpace;
 
 // The class GCSweeper is used to visit the heap after marking to reclaim unused
 // memory.
@@ -22,7 +24,7 @@
   ~GCSweeper() {}
 
   // Sweep the memory area for the page while clearing the mark bits and adding
-  // all the unmarked objects to the freelist.
+  // all the unmarked objects to the pre-locked freelist.
   // Returns true if the page is in use.
   bool SweepPage(HeapPage* page, FreeList* freelist);
 
@@ -30,6 +32,12 @@
   // last marked object.
   intptr_t SweepLargePage(HeapPage* page);
 
+  // Sweep the regular sized data pages between first and last inclusive.
+  static void SweepConcurrent(Isolate* isolate,
+                              HeapPage* first,
+                              HeapPage* last,
+                              FreeList* freelist);
+
  private:
   Heap* heap_;
 
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 8e6369f9d..c8eae14 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -87,10 +87,16 @@
   // Uses 'isolate' for handle allocation. 'Release' must be called at the end
   // to obtain the final table after potential growth/shrinkage.
   HashTable(Isolate* isolate, RawArray* data)
-      : isolate_(isolate), data_(&Array::Handle(isolate_, data)) {}
+      : isolate_(isolate),
+        key_handle_(Object::Handle(isolate_)),
+        smi_handle_(Smi::Handle(isolate_)),
+        data_(&Array::Handle(isolate_, data)) {}
   // Like above, except uses current isolate.
   explicit HashTable(RawArray* data)
-      : isolate_(Isolate::Current()), data_(&Array::Handle(isolate_, data)) {}
+      : isolate_(Isolate::Current()),
+        key_handle_(Object::Handle(isolate_)),
+        smi_handle_(Smi::Handle(isolate_)),
+        data_(&Array::Handle(isolate_, data)) {}
 
   Array& Release() {
     ASSERT(data_ != NULL);
@@ -117,9 +123,9 @@
   // Initializes an empty table.
   void Initialize() const {
     ASSERT(data_->Length() >= ArrayLengthForNumOccupied(0));
-    Smi& zero = Smi::Handle(isolate(), Smi::New(0));
-    data_->SetAt(kOccupiedEntriesIndex, zero);
-    data_->SetAt(kDeletedEntriesIndex, zero);
+    smi_handle_ = Smi::New(0);
+    data_->SetAt(kOccupiedEntriesIndex, smi_handle_);
+    data_->SetAt(kDeletedEntriesIndex, smi_handle_);
     for (intptr_t i = kHeaderSize; i < data_->Length(); ++i) {
       data_->SetAt(i, Object::sentinel());
     }
@@ -137,7 +143,6 @@
     ASSERT(NumOccupied() < NumEntries());
     // TODO(koda): Add salt.
     intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
-    Object& obj = Object::Handle(isolate());
     // TODO(koda): Consider quadratic probing.
     for (; ; probe = (probe + 1) % NumEntries()) {
       if (IsUnused(probe)) {
@@ -145,8 +150,8 @@
       } else if (IsDeleted(probe)) {
         continue;
       } else {
-        obj = GetKey(probe);
-        if (KeyTraits::IsMatch(key, obj)) {
+        key_handle_ = GetKey(probe);
+        if (KeyTraits::IsMatch(key, key_handle_)) {
           return probe;
         }
       }
@@ -164,7 +169,6 @@
     ASSERT(entry != NULL);
     ASSERT(NumOccupied() < NumEntries());
     intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
-    Object& obj = Object::Handle(isolate());
     intptr_t deleted = -1;
     // TODO(koda): Consider quadratic probing.
     for (; ; probe = (probe + 1) % NumEntries()) {
@@ -176,8 +180,8 @@
           deleted = probe;
         }
       } else {
-        obj = GetKey(probe);
-        if (KeyTraits::IsMatch(key, obj)) {
+        key_handle_ = GetKey(probe);
+        if (KeyTraits::IsMatch(key, key_handle_)) {
           *entry = probe;
           return true;
         }
@@ -249,6 +253,12 @@
   intptr_t NumDeleted() const {
     return GetSmiValueAt(kDeletedEntriesIndex);
   }
+  Object& KeyHandle() const {
+    return key_handle_;
+  }
+  Smi& SmiHandle() const {
+    return smi_handle_;
+  }
 
  protected:
   static const intptr_t kOccupiedEntriesIndex = 0;
@@ -282,8 +292,8 @@
   }
 
   void SetSmiValueAt(intptr_t index, intptr_t value) const {
-    const Smi& smi = Smi::Handle(isolate(), Smi::New(value));
-    data_->SetAt(index, smi);
+    smi_handle_ = Smi::New(value);
+    data_->SetAt(index, smi_handle_);
   }
 
   void AdjustSmiValueAt(intptr_t index, intptr_t delta) const {
@@ -293,6 +303,8 @@
   Isolate* isolate() const { return isolate_; }
 
   Isolate* isolate_;
+  Object& key_handle_;
+  Smi& smi_handle_;
   // This is a pointer rather than a reference, to enable Release nulling it,
   // preventing post-Release modification.
   Array* data_;
@@ -391,9 +403,9 @@
 
   void InsertKey(intptr_t entry, const Object& key) const {
     BaseTable::InsertKey(entry, key);
-    const Smi& next_enum_index = Smi::Handle(BaseTable::isolate(),
-        Smi::New(BaseTable::GetSmiValueAt(kNextEnumIndex)));
-    BaseTable::UpdatePayload(entry, kPayloadSize, next_enum_index);
+    BaseTable::SmiHandle() =
+        Smi::New(BaseTable::GetSmiValueAt(kNextEnumIndex));
+    BaseTable::UpdatePayload(entry, kPayloadSize, BaseTable::SmiHandle());
     // TODO(koda): Handle possible Smi overflow from repeated insert/delete.
     BaseTable::AdjustSmiValueAt(kNextEnumIndex, 1);
   }
@@ -529,9 +541,9 @@
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
-      Object& new_key = Object::Handle(BaseIterTable::isolate(),
-          BaseIterTable::BaseTable::Traits::NewKey(key));
-      BaseIterTable::InsertKey(entry, new_key);
+      BaseIterTable::KeyHandle() =
+          BaseIterTable::BaseTable::Traits::NewKey(key);
+      BaseIterTable::InsertKey(entry, BaseIterTable::KeyHandle());
       BaseIterTable::UpdatePayload(entry, 0, value_if_absent);
       return value_if_absent.raw();
     } else {
@@ -610,10 +622,10 @@
     EnsureCapacity();
     intptr_t entry = -1;
     if (!BaseIterTable::FindKeyOrDeletedOrUnused(key, &entry)) {
-      Object& new_key = Object::Handle(BaseIterTable::isolate(),
-          BaseIterTable::BaseTable::Traits::NewKey(key));
-      BaseIterTable::InsertKey(entry, new_key);
-      return new_key.raw();
+      BaseIterTable::KeyHandle() =
+          BaseIterTable::BaseTable::Traits::NewKey(key);
+      BaseIterTable::InsertKey(entry, BaseIterTable::KeyHandle());
+      return BaseIterTable::KeyHandle().raw();
     } else {
       return BaseIterTable::GetKey(entry);
     }
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 92b6bad..08ea60a 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -8,6 +8,7 @@
 #include "platform/utils.h"
 #include "vm/flags.h"
 #include "vm/isolate.h"
+#include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/object_set.h"
 #include "vm/os.h"
@@ -80,16 +81,61 @@
 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
   ASSERT(isolate()->no_gc_scope_depth() == 0);
   uword addr = old_space_->TryAllocate(size, type);
-  if (addr == 0) {
-    CollectAllGarbage();
-    addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
-    if (addr == 0) {
-      OS::PrintErr("Exhausted heap space, trying to allocate %" Pd " bytes.\n",
-                   size);
-      return 0;
+  if (addr != 0) {
+    return addr;
+  }
+  // If we are in the process of running a sweep wait for the sweeper to free
+  // memory.
+  {
+    MonitorLocker ml(old_space_->tasks_lock());
+    addr = old_space_->TryAllocate(size, type);
+    while ((addr == 0) && (old_space_->tasks() > 0)) {
+      ml.Wait();
+      addr = old_space_->TryAllocate(size, type);
     }
   }
-  return addr;
+  if (addr != 0) {
+    return addr;
+  }
+  // All GC tasks finished without allocating successfully. Run a full GC.
+  CollectAllGarbage();
+  addr = old_space_->TryAllocate(size, type);
+  if (addr != 0) {
+    return addr;
+  }
+  // Wait for all of the concurrent tasks to finish before giving up.
+  {
+    MonitorLocker ml(old_space_->tasks_lock());
+    addr = old_space_->TryAllocate(size, type);
+    while ((addr == 0) && (old_space_->tasks() > 0)) {
+      ml.Wait();
+      addr = old_space_->TryAllocate(size, type);
+    }
+  }
+  if (addr != 0) {
+    return addr;
+  }
+  // Force growth before attempting a synchronous GC.
+  addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+  if (addr != 0) {
+    return addr;
+  }
+  // Before throwing an out-of-memory error try a synchronous GC.
+  CollectAllGarbage();
+  {
+    MonitorLocker ml(old_space_->tasks_lock());
+    while (old_space_->tasks() > 0) {
+      ml.Wait();
+    }
+  }
+  addr = old_space_->TryAllocate(size, type, PageSpace::kForceGrowth);
+  if (addr != 0) {
+    return addr;
+  }
+  // Give up allocating this object.
+  OS::PrintErr(
+      "Exhausted heap space, trying to allocate %" Pd " bytes.\n", size);
+  return 0;
 }
 
 void Heap::AllocateExternal(intptr_t size, Space space) {
@@ -222,6 +268,7 @@
       RecordBeforeGC(kNew, reason);
       UpdateClassHeapStatsBeforeGC(kNew);
       new_space_->Scavenge(invoke_api_callbacks);
+      isolate()->class_table()->UpdatePromoted();
       RecordAfterGC();
       PrintStats();
       if (old_space_->NeedsGarbageCollection()) {
@@ -273,6 +320,7 @@
     RecordBeforeGC(kNew, kFull);
     UpdateClassHeapStatsBeforeGC(kNew);
     new_space_->Scavenge(kInvokeApiCallbacks);
+    isolate()->class_table()->UpdatePromoted();
     RecordAfterGC();
     PrintStats();
   }
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 58e8333..1d508c4 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -62,6 +62,9 @@
 
   ~Heap();
 
+  Scavenger* new_space() const { return new_space_; }
+  PageSpace* old_space() const { return old_space_; }
+
   uword Allocate(intptr_t size, Space space) {
     ASSERT(!read_only_);
     switch (space) {
@@ -81,28 +84,6 @@
     return 0;
   }
 
-  uword TryAllocate(
-      intptr_t size,
-      Space space,
-      PageSpace::GrowthPolicy growth_policy = PageSpace::kControlGrowth) {
-    ASSERT(!read_only_);
-    switch (space) {
-      case kNew:
-        return new_space_->TryAllocate(size);
-      case kOld:
-        return old_space_->TryAllocate(size,
-                                       HeapPage::kData,
-                                       growth_policy);
-      case kCode:
-        return old_space_->TryAllocate(size,
-                                       HeapPage::kExecutable,
-                                       growth_policy);
-      default:
-        UNREACHABLE();
-    }
-    return 0;
-  }
-
   // Track external data.
   void AllocateExternal(intptr_t size, Space space);
   void FreeExternal(intptr_t size, Space space);
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 3030d3a..99d7ce8 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -128,6 +128,8 @@
   // Verify postconditions:
   EXPECT_EQ(0, class_stats->pre_gc.old_count);
   EXPECT_EQ(0, class_stats->post_gc.old_count);
+  // One promoted instance.
+  EXPECT_EQ(1, class_stats->promoted_count);
   // Promotion counted as an allocation from old space.
   EXPECT_EQ(1, class_stats->recent.old_count);
   // There was one instance allocated before GC.
@@ -144,6 +146,8 @@
   EXPECT_EQ(0, class_stats->post_gc.new_count);
   // No new allocations.
   EXPECT_EQ(0, class_stats->recent.new_count);
+  // Nothing was promoted.
+  EXPECT_EQ(0, class_stats->promoted_count);
   heap->CollectGarbage(Heap::kOld);
   // Verify postconditions:
   EXPECT_EQ(1, class_stats->pre_gc.old_count);
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 5e3261e..2616814 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -151,10 +151,7 @@
           Class::Handle(Isolate::Current()->class_table()->At(class_ids[k]));
       f->Print("%s", String::Handle(cls.Name()).ToCString());
     }
-    if (count > 0) {
-      f->Print(" #%" Pd, count);
-    }
-    f->Print(" <%p>", static_cast<void*>(target.raw()));
+    f->Print(" cnt:%" Pd " trgt:'%s'", count, target.ToQualifiedCString());
   }
   f->Print("]");
 }
@@ -245,6 +242,7 @@
 
 void Value::PrintTo(BufferFormatter* f) const {
   PrintUse(f, *definition());
+
   if ((reaching_type_ != NULL) &&
       (reaching_type_ != definition()->type_)) {
     f->Print(" ");
@@ -525,16 +523,6 @@
 }
 
 
-void CreateArrayInstr::PrintOperandsTo(BufferFormatter* f) const {
-  for (int i = 0; i < ArgumentCount(); ++i) {
-    if (i != 0) f->Print(", ");
-    PushArgumentAt(i)->value()->PrintTo(f);
-  }
-  if (ArgumentCount() > 0) f->Print(", ");
-  element_type()->PrintTo(f);
-}
-
-
 void LoadFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
   instance()->PrintTo(f);
   f->Print(", %" Pd, offset_in_bytes());
@@ -576,6 +564,12 @@
 }
 
 
+void AllocateUninitializedContextInstr::PrintOperandsTo(
+    BufferFormatter* f) const {
+  f->Print("%" Pd "", num_context_variables());
+}
+
+
 void MathUnaryInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("'%s', ", MathUnaryInstr::KindToCString(kind()));
   value()->PrintTo(f);
@@ -609,6 +603,21 @@
 }
 
 
+void BinaryInt32OpInstr::PrintTo(BufferFormatter* f) const {
+  Definition::PrintTo(f);
+  f->Print(" %co", overflow_ ? '+' : '-');
+  f->Print(" %ct", IsTruncating() ? '+' : '-');
+}
+
+
+void BinaryInt32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+}
+
+
 void BinaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s, ", Token::Str(op_kind()));
   left()->PrintTo(f);
@@ -794,6 +803,19 @@
 }
 
 
+void Int32x4ConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Int32x4(");
+  value0()->PrintTo(f);
+  f->Print(", ");
+  value1()->PrintTo(f);
+  f->Print(", ");
+  value2()->PrintTo(f);
+  f->Print(", ");
+  value3()->PrintTo(f);
+  f->Print(")");
+}
+
+
 void Int32x4BoolConstructorInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("Int32x4.bool(");
   value0()->PrintTo(f);
@@ -959,6 +981,39 @@
 }
 
 
+static const char *RepresentationToCString(Representation rep) {
+  switch (rep) {
+    case kTagged:
+      return "tagged";
+    case kUntagged:
+      return "untagged";
+    case kUnboxedDouble:
+      return "double";
+    case kUnboxedInt32:
+      return "int32";
+    case kUnboxedUint32:
+      return "uint32";
+    case kUnboxedMint:
+      return "mint";
+    case kUnboxedFloat32x4:
+      return "float32x4";
+    case kUnboxedInt32x4:
+      return "int32x4";
+    case kUnboxedFloat64x2:
+      return "float64x2";
+    case kPairOfTagged:
+      return "tagged-pair";
+    case kPairOfUnboxedDouble:
+      return "double-pair";
+    case kNoRepresentation:
+      return "none";
+    case kNumRepresentations:
+      UNREACHABLE();
+  }
+  return "?";
+}
+
+
 void PhiInstr::PrintTo(BufferFormatter* f) const {
   f->Print("v%" Pd " <- phi(", ssa_temp_index());
   for (intptr_t i = 0; i < inputs_.length(); ++i) {
@@ -975,6 +1030,12 @@
     f->Print(" ");
     range_->PrintTo(f);
   }
+
+  if (representation() != kNoRepresentation &&
+      representation() != kTagged) {
+    f->Print(" %s", RepresentationToCString(representation()));
+  }
+
   if (type_ != NULL) {
     f->Print(" ");
     type_->PrintTo(f);
@@ -982,6 +1043,14 @@
 }
 
 
+void UnboxedIntConverterInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s->%s, ",
+           RepresentationToCString(from()),
+           RepresentationToCString(to()));
+  Definition::PrintOperandsTo(f);
+}
+
+
 void ParameterInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%" Pd, index());
 }
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 118e652..ed4036a 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -14,6 +14,7 @@
 #include "vm/flow_graph_optimizer.h"
 #include "vm/flow_graph_range_analysis.h"
 #include "vm/locations.h"
+#include "vm/method_recognizer.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
@@ -28,6 +29,8 @@
 
 DEFINE_FLAG(bool, propagate_ic_data, true,
     "Propagate IC data from unoptimized to optimized IC calls.");
+DEFINE_FLAG(bool, two_args_smi_icd, true,
+    "Generate special IC stubs for two args Smi operations");
 DEFINE_FLAG(bool, unbox_numeric_fields, true,
     "Support unboxed double and float32x4 fields.");
 DECLARE_FLAG(bool, enable_type_checks);
@@ -309,6 +312,15 @@
 }
 
 
+bool BinaryInt32OpInstr::AttributesEqual(Instruction* other) const {
+  BinaryInt32OpInstr* other_op = other->AsBinaryInt32Op();
+  ASSERT(other_op != NULL);
+  return (op_kind() == other_op->op_kind()) &&
+      (overflow_ == other_op->overflow_) &&
+      (is_truncating_ == other_op->is_truncating_);
+}
+
+
 EffectSet LoadFieldInstr::Dependencies() const {
   return immutable_ ? EffectSet::None() : EffectSet::All();
 }
@@ -326,6 +338,14 @@
 }
 
 
+Instruction* InitStaticFieldInstr::Canonicalize(FlowGraph* flow_graph) {
+  const bool is_initialized =
+      (field_.value() != Object::sentinel().raw()) &&
+      (field_.value() != Object::transition_sentinel().raw());
+  return is_initialized ? NULL : this;
+}
+
+
 EffectSet LoadStaticFieldInstr::Dependencies() const {
   return StaticField().is_final() ? EffectSet::None() : EffectSet::All();
 }
@@ -377,12 +397,16 @@
 }
 
 
-UnboxedConstantInstr::UnboxedConstantInstr(const Object& value)
-    : ConstantInstr(value), constant_address_(0) {
-  // Only doubles supported for now.
-  ASSERT(value.IsDouble());
-  constant_address_ =
-      FlowGraphBuilder::FindDoubleConstant(Double::Cast(value).value());
+UnboxedConstantInstr::UnboxedConstantInstr(const Object& value,
+                                           Representation representation)
+    : ConstantInstr(value),
+      representation_(representation),
+      constant_address_(0) {
+  if (representation_ == kUnboxedDouble) {
+    ASSERT(value.IsDouble());
+    constant_address_ =
+        FlowGraphBuilder::FindDoubleConstant(Double::Cast(value).value());
+  }
 }
 
 
@@ -477,174 +501,6 @@
 }
 
 
-static bool StartsWith(const String& name, const char* prefix, intptr_t n) {
-  ASSERT(name.IsOneByteString());
-
-  if (name.Length() < n) {
-    return false;
-  }
-
-  for (intptr_t i = 0; i < n; i++) {
-    if (name.CharAt(i) != prefix[i]) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-
-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] == Library::kPrivateIdentifierStart) {
-    if (name.CharAt(0) != Library::kPrivateIdentifierStart) {
-      return false;
-    }
-  } else if (strncmp(test_name,
-                     kPrivateGetterPrefix,
-                     strlen(kPrivateGetterPrefix)) == 0) {
-    if (!StartsWith(name, kPrivateGetterPrefix, strlen(kPrivateGetterPrefix))) {
-      return false;
-    }
-  } else if (strncmp(test_name,
-                     kPrivateSetterPrefix,
-                     strlen(kPrivateSetterPrefix)) == 0) {
-    if (!StartsWith(name, kPrivateSetterPrefix, strlen(kPrivateSetterPrefix))) {
-      return false;
-    }
-  } else {
-    // Compare without mangling.
-    return name.Equals(test_name);
-  }
-
-  // Both names are private. Mangle test_name before comparison.
-  // 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);
-}
-
-
-static bool IsRecognizedLibrary(const Library& library) {
-  // List of libraries where methods can be recognized.
-  return (library.raw() == Library::CoreLibrary())
-      || (library.raw() == Library::MathLibrary())
-      || (library.raw() == Library::TypedDataLibrary())
-      || (library.raw() == Library::InternalLibrary());
-}
-
-
-MethodRecognizer::Kind MethodRecognizer::RecognizeKind(
-    const Function& function) {
-  if (!function.is_recognized()) {
-    return kUnknown;
-  }
-
-  const Class& function_class = Class::Handle(function.Owner());
-  const Library& lib = Library::Handle(function_class.library());
-  const String& function_name = String::Handle(function.name());
-  const String& class_name = String::Handle(function_class.Name());
-
-#define RECOGNIZE_FUNCTION(test_class_name, test_function_name, enum_name, fp) \
-  if (CompareNames(lib, #test_function_name, function_name) &&                 \
-      CompareNames(lib, #test_class_name, class_name)) {                       \
-    ASSERT(function.CheckSourceFingerprint(fp));                               \
-    return k##enum_name;                                                       \
-  }
-RECOGNIZED_LIST(RECOGNIZE_FUNCTION)
-#undef RECOGNIZE_FUNCTION
-  UNREACHABLE();
-  return kUnknown;
-}
-
-
-bool MethodRecognizer::AlwaysInline(const Function& function) {
-  const Class& function_class = Class::Handle(function.Owner());
-  const Library& lib = Library::Handle(function_class.library());
-  if (!IsRecognizedLibrary(lib)) {
-    return false;
-  }
-
-  const String& function_name = String::Handle(function.name());
-  const String& class_name = String::Handle(function_class.Name());
-
-#define RECOGNIZE_FUNCTION(test_class_name, test_function_name, enum_name, fp) \
-  if (CompareNames(lib, #test_function_name, function_name) &&                 \
-      CompareNames(lib, #test_class_name, class_name)) {                       \
-    ASSERT(function.CheckSourceFingerprint(fp));                               \
-    return true;                                                               \
-  }
-INLINE_WHITE_LIST(RECOGNIZE_FUNCTION)
-#undef RECOGNIZE_FUNCTION
-  return false;
-}
-
-
-bool MethodRecognizer::PolymorphicTarget(const Function& function) {
-  const Class& function_class = Class::Handle(function.Owner());
-  const Library& lib = Library::Handle(function_class.library());
-  if (!IsRecognizedLibrary(lib)) {
-    return false;
-  }
-
-  const String& function_name = String::Handle(function.name());
-  const String& class_name = String::Handle(function_class.Name());
-
-#define RECOGNIZE_FUNCTION(test_class_name, test_function_name, enum_name, fp) \
-  if (CompareNames(lib, #test_function_name, function_name) &&                 \
-      CompareNames(lib, #test_class_name, class_name)) {                       \
-    ASSERT(function.CheckSourceFingerprint(fp));                               \
-    return true;                                                               \
-  }
-POLYMORPHIC_TARGET_LIST(RECOGNIZE_FUNCTION)
-#undef RECOGNIZE_FUNCTION
-  return false;
-}
-
-
-const char* MethodRecognizer::KindToCString(Kind kind) {
-#define KIND_TO_STRING(class_name, function_name, enum_name, fp)               \
-  if (kind == k##enum_name) return #enum_name;
-RECOGNIZED_LIST(KIND_TO_STRING)
-#undef KIND_TO_STRING
-  return "?";
-}
-
-
-void MethodRecognizer::InitializeState() {
-  GrowableArray<Library*> libs(3);
-  libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
-  libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
-  libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
-  Function& func = Function::Handle();
-
-#define SET_IS_RECOGNIZED(class_name, function_name, dest, fp)                 \
-  func = Library::GetFunction(libs, #class_name, #function_name);              \
-  if (func.IsNull()) {                                                         \
-    OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
-    UNREACHABLE();                                                             \
-  }                                                                            \
-  ASSERT(func.CheckSourceFingerprint(fp));                                     \
-  func.set_is_recognized(true);                                                \
-
-  RECOGNIZED_LIST(SET_IS_RECOGNIZED);
-
-#undef SET_IS_RECOGNIZED
-}
-
 // ==== Support for visiting flow graphs.
 
 #define DEFINE_ACCEPT(ShortName)                                               \
@@ -835,7 +691,9 @@
 // True if the definition has a single input use and is used only in
 // environments at the same instruction as that input use.
 bool Definition::HasOnlyUse(Value* use) const {
-  if ((input_use_list() != use) || (use->next_use() != NULL)) return false;
+  if (!HasOnlyInputUse(use)) {
+    return false;
+  }
 
   Instruction* target = use->instruction();
   for (Value::Iterator it(env_use_list()); !it.Done(); it.Advance()) {
@@ -845,6 +703,11 @@
 }
 
 
+bool Definition::HasOnlyInputUse(Value* use) const {
+  return (input_use_list() == use) && (use->next_use() == NULL);
+}
+
+
 void Definition::ReplaceUsesWith(Definition* other) {
   ASSERT(other != NULL);
   ASSERT(this != other);
@@ -1306,6 +1169,49 @@
 }
 
 
+bool UnboxedIntConverterInstr::CanDeoptimize() const {
+  return (to() == kUnboxedInt32) &&
+      !Range::Fits(value()->definition()->range(),
+                   RangeBoundary::kRangeBoundaryInt32);
+}
+
+
+bool UnboxInt32Instr::CanDeoptimize() const {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  if (value_cid == kSmiCid) {
+    return false;
+  } else if (value_cid == kMintCid) {
+    return !Range::Fits(value()->definition()->range(),
+                        RangeBoundary::kRangeBoundaryInt32);
+  } else {
+    return true;
+  }
+}
+
+
+bool BinaryInt32OpInstr::CanDeoptimize() const {
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+      return false;
+
+    case Token::kSHR:
+      return false;
+
+    case Token::kSHL:
+      return true;
+
+    case Token::kMOD: {
+      UNREACHABLE();
+    }
+
+    default:
+      return overflow_;
+  }
+}
+
+
 bool BinarySmiOpInstr::CanDeoptimize() const {
   if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits > 32)) {
     // If Smi's are bigger than 32-bits, then the instruction could deoptimize
@@ -1582,6 +1488,29 @@
 }
 
 
+Definition* BinaryInt32OpInstr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* result = NULL;
+
+  result = CanonicalizeCommutativeArithmetic(op_kind(),
+                                             kSmiCid,
+                                             left(),
+                                             right());
+  if (result != NULL) {
+    return result;
+  }
+
+  result = CanonicalizeCommutativeArithmetic(op_kind(),
+                                             kSmiCid,
+                                             right(),
+                                             left());
+  if (result != NULL) {
+    return result;
+  }
+
+  return this;
+}
+
+
 // Optimizations that eliminate or simplify individual instructions.
 Instruction* Instruction::Canonicalize(FlowGraph* flow_graph) {
   return this;
@@ -1780,6 +1709,103 @@
 }
 
 
+bool BoxIntNInstr::ValueFitsSmi() const {
+  Range* range = value()->definition()->range();
+  return Range::Fits(range, RangeBoundary::kRangeBoundarySmi);
+}
+
+
+Definition* BoxIntNInstr::Canonicalize(FlowGraph* flow_graph) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
+    // Environments can accomodate any representation. No need to box.
+    return value()->definition();
+  }
+
+  return this;
+}
+
+
+Definition* UnboxIntNInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
+
+  // Fold away UnboxInt<N>Instr(BoxInt<N>Instr(v)).
+  BoxIntNInstr* box_defn = value()->definition()->AsBoxIntN();
+  if (box_defn != NULL) {
+    if (box_defn->value()->definition()->representation() == representation()) {
+      return box_defn->value()->definition();
+    } else {
+      UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
+          box_defn->value()->definition()->representation(),
+          representation(),
+          box_defn->value()->CopyWithType(),
+          representation() == kUnboxedInt32 ? deopt_id_ : Isolate::kNoDeoptId);
+      flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
+      return converter;
+    }
+  }
+
+  return this;
+}
+
+
+Definition* UnboxedIntConverterInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
+
+  UnboxedIntConverterInstr* box_defn =
+      value()->definition()->AsUnboxedIntConverter();
+  if ((box_defn != NULL) && (box_defn->representation() == from())) {
+    if (box_defn->from() == to()) {
+      return box_defn->value()->definition();
+    }
+
+    UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
+        box_defn->from(),
+        representation(),
+        box_defn->value()->CopyWithType(),
+        to() == kUnboxedInt32 ? deopt_id_ : NULL);
+    flow_graph->InsertBefore(this, converter, env(), FlowGraph::kValue);
+    return converter;
+  }
+
+  UnboxIntegerInstr* unbox_defn = value()->definition()->AsUnboxInteger();
+  if (unbox_defn != NULL &&
+      (from() == kUnboxedMint) &&
+      (to() == kUnboxedInt32) &&
+      unbox_defn->HasOnlyInputUse(value())) {
+    // TODO(vegorov): there is a duplication of code between UnboxedIntCoverter
+    // and code path that unboxes Mint into Int32. We should just schedule
+    // these instructions close to each other instead of fusing them.
+    Definition* replacement =
+        new UnboxInt32Instr(unbox_defn->value()->CopyWithType(), deopt_id_);
+    flow_graph->InsertBefore(this,
+                             replacement,
+                             env(),
+                             FlowGraph::kValue);
+    return replacement;
+  }
+
+  return this;
+}
+
+
+Definition* UnboxInt32Instr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* replacement = UnboxIntNInstr::Canonicalize(flow_graph);
+  if (replacement != this) {
+    return replacement;
+  }
+
+  ConstantInstr* c = value()->definition()->AsConstant();
+  if ((c != NULL) && c->value().IsSmi()) {
+    UnboxedConstantInstr* uc =
+        new UnboxedConstantInstr(c->value(), kUnboxedInt32);
+    flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
+    return uc;
+  }
+
+  return this;
+}
+
+
 Definition* UnboxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
   if (!HasUses()) return NULL;
   // Fold away UnboxDouble(BoxDouble(v)).
@@ -1790,7 +1816,8 @@
 
   ConstantInstr* c = value()->definition()->AsConstant();
   if ((c != NULL) && c->value().IsDouble()) {
-    UnboxedConstantInstr* uc = new UnboxedConstantInstr(c->value());
+    UnboxedConstantInstr* uc =
+        new UnboxedConstantInstr(c->value(), kUnboxedDouble);
     flow_graph->InsertBefore(this, uc, NULL, FlowGraph::kValue);
     return uc;
   }
@@ -1799,6 +1826,49 @@
 }
 
 
+Definition* BoxIntegerInstr::Canonicalize(FlowGraph* flow_graph) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
+    // Environments can accomodate any representation. No need to box.
+    return value()->definition();
+  }
+
+  UnboxedIntConverterInstr* conv =
+      value()->definition()->AsUnboxedIntConverter();
+  if (conv != NULL) {
+    Definition* replacement = this;
+
+    switch (conv->from()) {
+      case kUnboxedInt32:
+        replacement = new BoxInt32Instr(conv->value()->CopyWithType());
+        break;
+      case kUnboxedUint32:
+        replacement = new BoxUint32Instr(conv->value()->CopyWithType());
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+
+    if (replacement != this) {
+      flow_graph->InsertBefore(this,
+                               replacement,
+                               NULL,
+                               FlowGraph::kValue);
+    }
+
+    return replacement;
+  }
+
+  return this;
+}
+
+
+Definition* UnboxIntegerInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (!HasUses()) return NULL;
+  return this;
+}
+
+
 Definition* BoxFloat32x4Instr::Canonicalize(FlowGraph* flow_graph) {
   if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
@@ -2391,23 +2461,38 @@
 }
 
 
+static uword TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
+  if (!FLAG_two_args_smi_icd) {
+    return 0;
+  }
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  switch (kind) {
+    case Token::kADD: return stub_code->SmiAddInlineCacheEntryPoint();
+    case Token::kSUB: return stub_code->SmiSubInlineCacheEntryPoint();
+    case Token::kEQ:  return stub_code->SmiEqualInlineCacheEntryPoint();
+    default:          return 0;
+  }
+}
+
+
 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Isolate* isolate = compiler->isolate();
   const ICData* call_ic_data = NULL;
   if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
     const Array& arguments_descriptor =
-        Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
-                                               argument_names()));
+        Array::Handle(isolate, ArgumentsDescriptor::New(ArgumentCount(),
+                                                        argument_names()));
     call_ic_data = compiler->GetOrAddInstanceCallICData(
         deopt_id(), function_name(), arguments_descriptor,
         checked_argument_count());
   } else {
-    call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
+    call_ic_data = &ICData::ZoneHandle(isolate, ic_data()->raw());
   }
   if (compiler->is_optimizing()) {
     ASSERT(HasICData());
-    if (ic_data()->NumberOfChecks() > 0) {
+    if (ic_data()->NumberOfUsedChecks() > 0) {
       const ICData& unary_ic_data =
-          ICData::ZoneHandle(ic_data()->AsUnaryClassChecks());
+          ICData::ZoneHandle(isolate, ic_data()->AsUnaryClassChecks());
       compiler->GenerateInstanceCall(deopt_id(),
                                      token_pos(),
                                      ArgumentCount(),
@@ -2427,11 +2512,46 @@
     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
                                    deopt_id(),
                                    token_pos());
-    compiler->GenerateInstanceCall(deopt_id(),
-                                   token_pos(),
-                                   ArgumentCount(),
-                                   locs(),
-                                   *call_ic_data);
+    bool is_smi_two_args_op = false;
+    const uword label_address = TwoArgsSmiOpInlineCacheEntry(token_kind());
+    if (label_address != 0) {
+      // We have a dedicated inline cache stub for this operation, add an
+      // an initial Smi/Smi check with count 0.
+      ASSERT(call_ic_data->NumArgsTested() == 2);
+      const String& name = String::Handle(isolate, call_ic_data->target_name());
+      const Class& smi_class = Class::Handle(isolate, Smi::Class());
+      const Function& smi_op_target =
+          Function::Handle(Resolver::ResolveDynamicAnyArgs(smi_class, name));
+      if (call_ic_data->NumberOfChecks() == 0) {
+        GrowableArray<intptr_t> class_ids(2);
+        class_ids.Add(kSmiCid);
+        class_ids.Add(kSmiCid);
+        call_ic_data->AddCheck(class_ids, smi_op_target);
+        // 'AddCheck' sets the initial count to 1.
+        call_ic_data->SetCountAt(0, 0);
+        is_smi_two_args_op = true;
+      } else if (call_ic_data->NumberOfChecks() == 1) {
+        GrowableArray<intptr_t> class_ids(2);
+        Function& target = Function::Handle(isolate);
+        call_ic_data->GetCheckAt(0, &class_ids, &target);
+        if ((target.raw() == smi_op_target.raw()) &&
+            (class_ids[0] == kSmiCid) && (class_ids[1] == kSmiCid)) {
+          is_smi_two_args_op = true;
+        }
+      }
+    }
+    if (is_smi_two_args_op) {
+      ASSERT(ArgumentCount() == 2);
+      ExternalLabel target_label(label_address);
+      compiler->EmitInstanceCall(&target_label, *call_ic_data, ArgumentCount(),
+                                 deopt_id(), token_pos(), locs());
+    } else {
+      compiler->GenerateInstanceCall(deopt_id(),
+                                     token_pos(),
+                                     ArgumentCount(),
+                                     locs(),
+                                     *call_ic_data);
+    }
   }
 }
 
@@ -2468,13 +2588,19 @@
     const Array& arguments_descriptor =
         Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
                                                argument_names()));
-    // TODO(srdjan): Improve performance of function recognition.
     MethodRecognizer::Kind recognized_kind =
         MethodRecognizer::RecognizeKind(function());
     int num_args_checked = 0;
-    if ((recognized_kind == MethodRecognizer::kMathMin) ||
-        (recognized_kind == MethodRecognizer::kMathMax)) {
-      num_args_checked = 2;
+    switch (recognized_kind) {
+      case MethodRecognizer::kDoubleFromInteger:
+        num_args_checked = 1;
+        break;
+      case MethodRecognizer::kMathMin:
+      case MethodRecognizer::kMathMax:
+        num_args_checked = 2;
+        break;
+      default:
+        break;
     }
     call_ic_data = compiler->GetOrAddStaticCallICData(deopt_id(),
                                                       function(),
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index ade4498..52f2c53 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -10,6 +10,7 @@
 #include "vm/growable_array.h"
 #include "vm/handles_impl.h"
 #include "vm/locations.h"
+#include "vm/method_recognizer.h"
 #include "vm/object.h"
 #include "vm/parser.h"
 
@@ -19,6 +20,7 @@
 
 class BitVector;
 class BlockEntryInstr;
+class BoxIntNInstr;
 class BufferFormatter;
 class CatchBlockEntryInstr;
 class ComparisonInstr;
@@ -32,261 +34,9 @@
 class LocalVariable;
 class ParsedFunction;
 class Range;
+class RangeAnalysis;
 class RangeBoundary;
-
-
-// TODO(srdjan): Unify with INTRINSIC_LIST.
-// (class-name, function-name, recognized enum, fingerprint).
-// See intrinsifier for fingerprint computation.
-#define RECOGNIZED_LIST(V)                                                     \
-  V(::, identical, ObjectIdentical, 496869842)                                 \
-  V(ClassID, getID, ClassIDgetID, 1322490980)                                  \
-  V(Object, ==, ObjectEquals, 1068471689)                                      \
-  V(Object, Object., ObjectConstructor, 1066669787)                            \
-  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
-  V(_List, _List., ObjectArrayConstructor, 1595327584)                         \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
-  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 149406583)                   \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 888580944)                 \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
-  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
-  V(_GrowableList, _setData, GrowableArraySetData, 2126927509)                 \
-  V(_GrowableList, _setLength, GrowableArraySetLength, 89389299)               \
-  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871)                     \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
-  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
-  V(_StringBase, _interpolate, StringBaseInterpolate, 1758627989)              \
-  V(_OneByteString, _setAt, OneByteStringSetAt, 468605749)                     \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 1084977108)             \
-  V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32,  \
-      597111055)                                                               \
-  V(_Double, toInt, DoubleToInteger, 1547535151)                               \
-  V(_Double, truncateToDouble, DoubleTruncate, 2117801967)                     \
-  V(_Double, roundToDouble, DoubleRound, 2124216110)                           \
-  V(_Double, floorToDouble, DoubleFloor, 968600699)                            \
-  V(_Double, ceilToDouble, DoubleCeil, 1779929274)                             \
-  V(_Double, _modulo, DoubleMod, 1473971007)                                   \
-  V(::, sqrt, MathSqrt, 101545548)                                             \
-  V(::, sin, MathSin, 1741396147)                                              \
-  V(::, cos, MathCos, 1951197905)                                              \
-  V(::, min, MathMin, 1022567780)                                              \
-  V(::, max, MathMax, 612058870)                                               \
-  V(::, _doublePow, MathDoublePow, 823139975)                                  \
-  V(Float32x4, Float32x4., Float32x4Constructor, 1755873079)                   \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, 1494069379)                      \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, 916211464)                     \
-  V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
-      640076216)                                                               \
-  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1279591344)    \
-  V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139)                         \
-  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 597555927)                    \
-  V(_Float32x4, get:x, Float32x4ShuffleX, 384850558)                           \
-  V(_Float32x4, get:y, Float32x4ShuffleY, 1398002778)                          \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178056441)                          \
-  V(_Float32x4, get:w, Float32x4ShuffleW, 480831839)                           \
-  V(_Float32x4, get:signMask, Float32x4GetSignMask, 630761511)                 \
-  V(_Float32x4, _cmpequal, Float32x4Equal, 571062952)                          \
-  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295)                      \
-  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 589402909)               \
-  V(_Float32x4, _cmplt, Float32x4LessThan, 1502332656)                         \
-  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 1069848031)                 \
-  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1334574472)                     \
-  V(_Float32x4, _min, Float32x4Min, 2036349551)                                \
-  V(_Float32x4, _max, Float32x4Max, 571688115)                                 \
-  V(_Float32x4, _scale, Float32x4Scale, 1311297761)                            \
-  V(_Float32x4, _sqrt, Float32x4Sqrt, 1709659395)                              \
-  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 2043980962)          \
-  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 739405237)                   \
-  V(_Float32x4, _negate, Float32x4Negate, 445839777)                           \
-  V(_Float32x4, _abs, Float32x4Absolute, 1152777608)                           \
-  V(_Float32x4, _clamp, Float32x4Clamp, 353415442)                             \
-  V(_Float32x4, withX, Float32x4WithX, 1446546696)                             \
-  V(_Float32x4, withY, Float32x4WithY, 309844761)                              \
-  V(_Float32x4, withZ, Float32x4WithZ, 971921505)                              \
-  V(_Float32x4, withW, Float32x4WithW, 1759699726)                             \
-  V(Float64x2, Float64x2., Float64x2Constructor, 1399581872)                   \
-  V(Float64x2, Float64x2.zero, Float64x2Zero, 1836770587)                      \
-  V(Float64x2, Float64x2.splat, Float64x2Splat, 939291159)                     \
-  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1499726406)    \
-  V(_Float64x2, get:x, Float64x2GetX, 261044094)                               \
-  V(_Float64x2, get:y, Float64x2GetY, 1942257886)                              \
-  V(_Float64x2, _negate, Float64x2Negate, 2133212774)                          \
-  V(_Float64x2, abs, Float64x2Abs, 1224776282)                                 \
-  V(_Float64x2, sqrt, Float64x2Sqrt, 1037569520)                               \
-  V(_Float64x2, get:signMask, Float64x2GetSignMask, 252936800)                 \
-  V(_Float64x2, scale, Float64x2Scale, 1199438744)                             \
-  V(_Float64x2, withX, Float64x2WithX, 1042725932)                             \
-  V(_Float64x2, withY, Float64x2WithY, 1496958947)                             \
-  V(_Float64x2, min, Float64x2Min, 485240583)                                  \
-  V(_Float64x2, max, Float64x2Max, 2146148204)                                 \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 87082660)                   \
-  V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
-      372517418)                                                               \
-  V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077555238)                          \
-  V(_Int32x4, get:flagY, Int32x4GetFlagY, 779160284)                           \
-  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181912283)                           \
-  V(_Int32x4, get:flagW, Int32x4GetFlagW, 977675534)                           \
-  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929271914)                    \
-  V(_Int32x4, shuffle, Int32x4Shuffle, 1870018702)                             \
-  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 967644870)                        \
-  V(_Int32x4, select, Int32x4Select, 1696037681)                               \
-  V(_Int32x4, withFlagX, Int32x4WithFlagX, 467852789)                          \
-  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978)                         \
-  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960)                          \
-  V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907)                         \
-  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
-  V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    1346536303)                                                                \
-  V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    1794849214)                                                                \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
-  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1640672852)                       \
-  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1472976717)                      \
-  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1466627059)                 \
-  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 2141660076)                \
-  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 818792056)                      \
-  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038)                    \
-  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492)                  \
-  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736)                 \
-
-
-// A list of core function that should always be inlined.
-#define INLINE_WHITE_LIST(V)                                                   \
-  V(Object, ==, ObjectEquals, 1068471689)                                      \
-  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
-  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
-  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
-  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 210829138)                   \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 1812933946)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 2085943947)                  \
-  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
-  V(_List, get:isEmpty, ObjectArrayIsEmpty, 2130247737)                        \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1543480955)                 \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 936729641)                 \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1898018934)                   \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 111684506)                   \
-  V(::, asin, MathASin, 1651042633)                                            \
-  V(::, acos, MathACos, 1139647090)                                            \
-  V(::, atan, MathATan, 1668754384)                                            \
-  V(::, atan2, MathATan2, 1845649456)                                          \
-  V(::, cos, MathCos, 1951197905)                                              \
-  V(::, exp, MathExp, 1809210829)                                              \
-  V(::, log, MathLog, 1620336448)                                              \
-  V(::, max, MathMax, 612058870)                                               \
-  V(::, min, MathMin, 1022567780)                                              \
-  V(::, pow, MathPow, 930962530)                                               \
-  V(::, sin, MathSin, 1741396147)                                              \
-  V(::, sqrt, MathSqrt, 101545548)                                             \
-  V(::, tan, MathTan, 982072809)                                               \
-
-
-// A list of core functions that internally dispatch based on received id.
-#define POLYMORPHIC_TARGET_LIST(V)                                             \
-  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
-  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 149406583)                    \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
-  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 888580944)                  \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
-
-// Class that recognizes the name and owner of a function and returns the
-// corresponding enum. See RECOGNIZED_LIST above for list of recognizable
-// functions.
-class MethodRecognizer : public AllStatic {
- public:
-  enum Kind {
-    kUnknown,
-#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, fp) k##enum_name,
-RECOGNIZED_LIST(DEFINE_ENUM_LIST)
-#undef DEFINE_ENUM_LIST
-  };
-
-  static Kind RecognizeKind(const Function& function);
-  static bool AlwaysInline(const Function& function);
-  static bool PolymorphicTarget(const Function& function);
-  static const char* KindToCString(Kind kind);
-  static void InitializeState();
-};
-
+class UnboxIntNInstr;
 
 // CompileType describes type of the value produced by the definition.
 //
@@ -704,6 +454,7 @@
   M(LoadIndexed)                                                               \
   M(StoreIndexed)                                                              \
   M(StoreInstanceField)                                                        \
+  M(InitStaticField)                                                           \
   M(LoadStaticField)                                                           \
   M(StoreStaticField)                                                          \
   M(BooleanNegate)                                                             \
@@ -716,12 +467,15 @@
   M(InstantiateType)                                                           \
   M(InstantiateTypeArguments)                                                  \
   M(AllocateContext)                                                           \
+  M(AllocateUninitializedContext)                                              \
   M(CloneContext)                                                              \
   M(BinarySmiOp)                                                               \
+  M(BinaryInt32Op)                                                             \
   M(UnarySmiOp)                                                                \
   M(UnaryDoubleOp)                                                             \
   M(CheckStackOverflow)                                                        \
   M(SmiToDouble)                                                               \
+  M(Int32ToDouble)                                                             \
   M(DoubleToInteger)                                                           \
   M(DoubleToSmi)                                                               \
   M(DoubleToDouble)                                                            \
@@ -773,6 +527,7 @@
   M(Float32x4With)                                                             \
   M(Float32x4ToInt32x4)                                                        \
   M(MaterializeObject)                                                         \
+  M(Int32x4Constructor)                                                        \
   M(Int32x4BoolConstructor)                                                    \
   M(Int32x4GetFlag)                                                            \
   M(Int32x4Select)                                                             \
@@ -798,6 +553,8 @@
   M(UnaryUint32Op)                                                             \
   M(BoxUint32)                                                                 \
   M(UnboxUint32)                                                               \
+  M(BoxInt32)                                                                  \
+  M(UnboxInt32)                                                                \
   M(UnboxedIntConverter)                                                       \
 
 
@@ -852,6 +609,9 @@
   bool IsDefinition() { return (AsDefinition() != NULL); }
   virtual Definition* AsDefinition() { return NULL; }
 
+  virtual BoxIntNInstr* AsBoxIntN() { return NULL; }
+  virtual UnboxIntNInstr* AsUnboxIntN() { return NULL; }
+
   virtual intptr_t token_pos() const { return Scanner::kNoSourcePos; }
 
   virtual intptr_t InputCount() const = 0;
@@ -1099,6 +859,7 @@
   friend class Float64x2ZeroInstr;
   friend class Float64x2SplatInstr;
   friend class Float64x2ConstructorInstr;
+  friend class Int32x4ConstructorInstr;
   friend class Int32x4BoolConstructorInstr;
   friend class Int32x4GetFlagInstr;
   friend class Int32x4SetFlagInstr;
@@ -1146,7 +907,11 @@
   friend class BinaryUint32OpInstr;
   friend class UnaryUint32OpInstr;
   friend class ShiftUint32OpInstr;
+  friend class UnboxIntNInstr;
+  friend class UnboxInt32Instr;
   friend class UnboxUint32Instr;
+  friend class BinaryInt32OpInstr;
+  friend class UnboxedIntConverterInstr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -1875,6 +1640,13 @@
             IsUnboxInteger();
   }
 
+  bool IsInt32Definition() {
+    return IsBinaryInt32Op() ||
+           IsBoxInt32() ||
+           IsUnboxInt32() ||
+           IsUnboxedIntConverter();
+  }
+
   // Compute compile type for this definition. It is safe to use this
   // approximation even before type propagator was run (e.g. during graph
   // building).
@@ -1905,6 +1677,8 @@
     return (input_use_list_ != NULL) || (env_use_list_ != NULL);
   }
   bool HasOnlyUse(Value* use) const;
+  bool HasOnlyInputUse(Value* use) const;
+
 
   Value* input_use_list() const { return input_use_list_; }
   void set_input_use_list(Value* head) { input_use_list_ = head; }
@@ -1946,9 +1720,10 @@
   //    - unknown sentinel
   Object& constant_value() const { return constant_value_; }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   Range* range() const { return range_; }
+  void set_range(const Range&);
 
   // Definitions can be canonicalized only into definitions to ensure
   // this check statically we override base Canonicalize with a Canonicalize
@@ -2099,7 +1874,7 @@
 
   virtual void PrintTo(BufferFormatter* f) const;
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   BitVector* reaching_defs() const {
     return reaching_defs_;
@@ -2596,7 +2371,7 @@
   Value* value() const { return inputs_[0]; }
   Range* constraint() const { return constraint_; }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   void AddDependency(Definition* defn) {
     Value* val = new Value(defn);
@@ -2641,7 +2416,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -2662,10 +2437,11 @@
 // for other unboxing instructions.
 class UnboxedConstantInstr : public ConstantInstr {
  public:
-  explicit UnboxedConstantInstr(const Object& value);
+  explicit UnboxedConstantInstr(const Object& value,
+                                Representation representation);
 
   virtual Representation representation() const {
-    return kUnboxedDouble;
+    return representation_;
   }
 
   // Either NULL or the address of the unboxed constant.
@@ -2674,6 +2450,7 @@
   DECLARE_INSTRUCTION(UnboxedConstant)
 
  private:
+  const Representation representation_;
   uword constant_address_;  // Either NULL or points to the untagged constant.
 
   DISALLOW_COPY_AND_ASSIGN(UnboxedConstantInstr);
@@ -3278,7 +3055,7 @@
 
   virtual CompileType ComputeType() const;
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   ComparisonInstr* comparison() const { return comparison_; }
   intptr_t if_true() const { return if_true_; }
@@ -3912,7 +3689,7 @@
   }
 
   virtual Representation representation() const;
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual bool AllowsCSE() const { return false; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -4329,8 +4106,6 @@
   Value* element_type() const { return inputs_[kElementTypePos]; }
   Value* num_elements() const { return inputs_[kLengthPos]; }
 
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
   // Throw needs environment, which is created only if instruction can
   // deoptimize.
   virtual bool CanDeoptimize() const { return MayThrow(); }
@@ -4481,7 +4256,7 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   bool IsImmutableLengthLoad() const;
 
@@ -4620,6 +4395,60 @@
 };
 
 
+class InitStaticFieldInstr : public TemplateInstruction<1> {
+ public:
+  InitStaticFieldInstr(Value* input, const Field& field)
+      : field_(field) {
+    SetInputAt(0, input);
+  }
+
+  virtual intptr_t token_pos() const { return field_.token_pos(); }
+  const Field& field() const { return field_; }
+
+  DECLARE_INSTRUCTION(InitStaticField)
+
+  virtual intptr_t ArgumentCount() const { return 0; }
+  virtual bool CanDeoptimize() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::All(); }
+  virtual bool MayThrow() const { return true; }
+  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
+
+ private:
+  const Field& field_;
+
+  DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr);
+};
+
+
+class AllocateUninitializedContextInstr : public TemplateDefinition<0> {
+ public:
+  AllocateUninitializedContextInstr(intptr_t token_pos,
+                                    intptr_t num_context_variables)
+      : token_pos_(token_pos),
+        num_context_variables_(num_context_variables) {}
+
+  DECLARE_INSTRUCTION(AllocateUninitializedContext)
+  virtual CompileType ComputeType() const;
+
+  virtual intptr_t token_pos() const { return token_pos_; }
+  intptr_t num_context_variables() const { return num_context_variables_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const intptr_t token_pos_;
+  const intptr_t num_context_variables_;
+
+  DISALLOW_COPY_AND_ASSIGN(AllocateUninitializedContextInstr);
+};
+
+
 class CloneContextInstr : public TemplateDefinition<1> {
  public:
   CloneContextInstr(intptr_t token_pos, Value* context_value)
@@ -4851,7 +4680,7 @@
   virtual CompileType ComputeType() const;
   virtual bool RecomputeType();
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -4860,6 +4689,8 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
  private:
   bool is_smi_;
 
@@ -5024,7 +4855,7 @@
 
   intptr_t deopt_id() const { return deopt_id_; }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   DECLARE_INSTRUCTION(UnboxInteger)
   virtual CompileType ComputeType() const;
@@ -5036,6 +4867,8 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
  private:
   DISALLOW_COPY_AND_ASSIGN(UnboxIntegerInstr);
 };
@@ -6359,10 +6192,10 @@
 };
 
 
-class Int32x4BoolConstructorInstr : public TemplateDefinition<4> {
+class Int32x4ConstructorInstr : public TemplateDefinition<4> {
  public:
-  Int32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
-                               Value* value3, intptr_t deopt_id) {
+  Int32x4ConstructorInstr(Value* value0, Value* value1, Value* value2,
+                          Value* value3, intptr_t deopt_id) {
     SetInputAt(0, value0);
     SetInputAt(1, value1);
     SetInputAt(2, value2);
@@ -6384,7 +6217,57 @@
   }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx >= 0 && idx < 4);
+    ASSERT((idx >= 0) && (idx < 4));
+    return kUnboxedUint32;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(Int32x4Constructor)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Int32x4ConstructorInstr);
+};
+
+
+class Int32x4BoolConstructorInstr : public TemplateDefinition<4> {
+ public:
+  Int32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
+                              Value* value3, intptr_t deopt_id) {
+    SetInputAt(0, value0);
+    SetInputAt(1, value1);
+    SetInputAt(2, value2);
+    SetInputAt(3, value3);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value0() const { return inputs_[0]; }
+  Value* value1() const { return inputs_[1]; }
+  Value* value2() const { return inputs_[2]; }
+  Value* value3() const { return inputs_[3]; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return kUnboxedInt32x4;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx >= 0) && (idx < 4));
     return kTagged;
   }
 
@@ -6820,7 +6703,7 @@
     return deopt_id_;
   }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
@@ -6894,7 +6777,7 @@
     return deopt_id_;
   }
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   DECLARE_INSTRUCTION(ShiftMintOp)
 
@@ -7011,7 +6894,7 @@
 
   void PrintTo(BufferFormatter* f) const;
 
-  virtual void InferRange();
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
@@ -7021,6 +6904,12 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
  private:
   const Token::Kind op_kind_;
   bool overflow_;
@@ -7031,6 +6920,97 @@
 };
 
 
+class BinaryInt32OpInstr : public TemplateDefinition<2> {
+ public:
+  BinaryInt32OpInstr(Token::Kind op_kind,
+                     Value* left,
+                     Value* right,
+                     intptr_t deopt_id)
+      : op_kind_(op_kind),
+        overflow_(true),
+        is_truncating_(false) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+    // Override generated deopt-id.
+    deopt_id_ = deopt_id;
+  }
+
+  static bool IsSupported(Token::Kind op, Value* left, Value* right) {
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
+    switch (op) {
+      case Token::kADD:
+      case Token::kSUB:
+      case Token::kMUL:
+      case Token::kBIT_AND:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+        return true;
+
+      case Token::kSHL:
+      case Token::kSHR:
+        return right->BindsToConstant();
+
+      default:
+        return false;
+    }
+#else
+    return false;
+#endif
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  Token::Kind op_kind() const { return op_kind_; }
+
+  void set_overflow(bool overflow) { overflow_ = overflow; }
+
+  void set_is_truncating(bool value) { is_truncating_ = value; }
+  bool IsTruncating() const { return is_truncating_ || !overflow_; }
+
+  void PrintTo(BufferFormatter* f) const;
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  DECLARE_INSTRUCTION(BinaryInt32Op)
+  virtual CompileType ComputeType() const;
+
+  virtual bool CanDeoptimize() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const;
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual Representation representation() const {
+    return kUnboxedInt32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0 || idx == 1);
+    return kUnboxedInt32;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+  bool overflow_;
+  bool is_truncating_;
+
+  DISALLOW_COPY_AND_ASSIGN(BinaryInt32OpInstr);
+};
+
+
 // Handles both Smi operations: BIT_OR and NEGATE.
 class UnarySmiOpInstr : public TemplateDefinition<1> {
  public:
@@ -7151,6 +7131,7 @@
 };
 
 
+// TODO(vegorov): remove this instruction in favor of Int32ToDouble.
 class SmiToDoubleInstr : public TemplateDefinition<1> {
  public:
   SmiToDoubleInstr(Value* value, intptr_t token_pos)
@@ -7186,6 +7167,40 @@
 };
 
 
+class Int32ToDoubleInstr : public TemplateDefinition<1> {
+ public:
+  explicit Int32ToDoubleInstr(Value* value) {
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  DECLARE_INSTRUCTION(Int32ToDouble)
+  virtual CompileType ComputeType() const;
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return kUnboxedInt32;
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedDouble;
+  }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Int32ToDoubleInstr);
+};
+
+
 class DoubleToIntegerInstr : public TemplateDefinition<1> {
  public:
   DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call)
@@ -7945,13 +7960,18 @@
 };
 
 
-class BoxUint32Instr : public TemplateDefinition<1> {
+class BoxIntNInstr : public TemplateDefinition<1> {
  public:
-  explicit BoxUint32Instr(Value* value) {
+  BoxIntNInstr(Representation representation, Value* value)
+      : representation_(representation) {
     SetInputAt(0, value);
   }
 
   Value* value() const { return inputs_[0]; }
+  virtual bool ValueFitsSmi() const;
+
+  virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -7961,69 +7981,148 @@
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT(idx == 0);
-    return kUnboxedUint32;
+    return representation_;
   }
 
-  DECLARE_INSTRUCTION(BoxUint32)
-  virtual CompileType ComputeType() const;
-
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return other->AsBoxIntN()->representation_ == representation_;
+  }
 
   virtual bool MayThrow() const { return false; }
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual BoxIntNInstr* AsBoxIntN() { return this; }
+
+ private:
+  const Representation representation_;
+
+  DISALLOW_COPY_AND_ASSIGN(BoxIntNInstr);
+};
+
+
+class BoxUint32Instr : public BoxIntNInstr {
+ public:
+  explicit BoxUint32Instr(Value* value)
+      : BoxIntNInstr(kUnboxedUint32, value) { }
+
+  DECLARE_INSTRUCTION(BoxUint32)
+
  private:
   DISALLOW_COPY_AND_ASSIGN(BoxUint32Instr);
 };
 
 
-class UnboxUint32Instr : public TemplateDefinition<1> {
+class BoxInt32Instr : public BoxIntNInstr {
  public:
-  UnboxUint32Instr(Value* value, intptr_t deopt_id) {
+  explicit BoxInt32Instr(Value* value)
+      : BoxIntNInstr(kUnboxedInt32, value) { }
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  DECLARE_INSTRUCTION(BoxInt32)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BoxInt32Instr);
+};
+
+
+class UnboxIntNInstr : public TemplateDefinition<1> {
+ public:
+  UnboxIntNInstr(Representation representation,
+                 Value* value,
+                 intptr_t deopt_id)
+      : representation_(representation) {
     SetInputAt(0, value);
     deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
 
-  virtual bool CanDeoptimize() const {
-    return (value()->Type()->ToCid() != kSmiCid)
-        && (value()->Type()->ToCid() != kMintCid);
-  }
-
   virtual Representation representation() const {
-    return kUnboxedUint32;
+    return representation_;
   }
 
-
-  DECLARE_INSTRUCTION(UnboxUint32)
   virtual CompileType ComputeType() const;
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
-  virtual bool AttributesEqual(Instruction* other) const { return true; }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return other->AsUnboxIntN()->representation_ == representation_;
+  }
 
   virtual bool MayThrow() const { return false; }
 
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual UnboxIntNInstr* AsUnboxIntN() { return this; }
+
+ private:
+  const Representation representation_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnboxIntNInstr);
+};
+
+
+class UnboxUint32Instr : public UnboxIntNInstr {
+ public:
+  UnboxUint32Instr(Value* value, intptr_t deopt_id)
+      : UnboxIntNInstr(kUnboxedUint32, value, deopt_id) {
+  }
+
+  virtual bool CanDeoptimize() const {
+    return (value()->Type()->ToCid() != kSmiCid)
+        && (value()->Type()->ToCid() != kMintCid);
+  }
+
+  DECLARE_INSTRUCTION(UnboxUint32)
+
  private:
   DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
 };
 
 
+class UnboxInt32Instr : public UnboxIntNInstr {
+ public:
+  UnboxInt32Instr(Value* value, intptr_t deopt_id)
+      : UnboxIntNInstr(kUnboxedInt32, value, deopt_id) {
+  }
+
+  virtual bool CanDeoptimize() const;
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  DECLARE_INSTRUCTION(UnboxInt32)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxInt32Instr);
+};
+
+
 class UnboxedIntConverterInstr : public TemplateDefinition<1> {
  public:
   UnboxedIntConverterInstr(Representation from,
                            Representation to,
-                           Value* value)
+                           Value* value,
+                           intptr_t deopt_id)
       : from_representation_(from),
         to_representation_(to) {
     ASSERT(from != to);
-    ASSERT((from == kUnboxedMint) || (from == kUnboxedUint32));
-    ASSERT((to == kUnboxedMint) || (to == kUnboxedUint32));
+    ASSERT((from == kUnboxedMint) ||
+           (from == kUnboxedUint32) ||
+           (from == kUnboxedInt32));
+    ASSERT((to == kUnboxedMint) ||
+           (to == kUnboxedUint32) ||
+           (to == kUnboxedInt32));
+    ASSERT((to != kUnboxedInt32) || (deopt_id != Isolate::kNoDeoptId));
     SetInputAt(0, value);
+    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -8031,7 +8130,9 @@
   Representation from() const { return from_representation_; }
   Representation to() const { return to_representation_; }
 
-  virtual bool CanDeoptimize() const { return false; }
+  Definition* Canonicalize(FlowGraph* flow_graph);
+
+  virtual bool CanDeoptimize() const;
 
   virtual Representation representation() const {
     return to();
@@ -8052,6 +8153,10 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
   DECLARE_INSTRUCTION(UnboxedIntConverter);
 
  private:
@@ -8288,6 +8393,16 @@
 };
 
 
+// Helper macros for platform ports.
+#define DEFINE_UNIMPLEMENTED_INSTRUCTION(Name)                                \
+  LocationSummary* Name::MakeLocationSummary(                                 \
+      Isolate* isolate, bool opt) const {                                     \
+    UNIMPLEMENTED();                                                          \
+    return NULL;                                                              \
+  }                                                                           \
+  void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
+
+
 }  // namespace dart
 
 #endif  // VM_INTERMEDIATE_LANGUAGE_H_
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 1ee20cd..14ab139 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -305,14 +305,24 @@
 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) &&
-        TargetCPUFeatures::neon_supported()) {
-      const QRegister dst = locs()->out(0).fpu_reg();
-      __ veorq(dst, dst, dst);
-    } else {
-      const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
-      const Register temp = locs()->temp(0).reg();
-      __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
+    switch (representation_) {
+      case kUnboxedDouble:
+        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 {
+          const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
+          const Register temp = locs()->temp(0).reg();
+          __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
+        }
+        break;
+      case kUnboxedInt32:
+        __ LoadImmediate(locs()->out(0).reg(), Smi::Cast(value()).Value());
+        break;
+      default:
+        UNREACHABLE();
+        break;
     }
   }
 }
@@ -1186,7 +1196,7 @@
                           true,  // Load.
                           &needs_base)) {
     // CanBeImmediateIndex must return false for unsafe smis.
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
@@ -1387,7 +1397,7 @@
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
     // CanBeImmediateIndex must return false for unsafe smis.
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
     if (needs_base) {
       locs->set_temp(0, Location::RequiresRegister());
     }
@@ -2203,41 +2213,13 @@
                                    Label* done) {
   const Register kLengthReg = R2;
   const Register kElemTypeReg = R1;
-  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+  const intptr_t instance_size = 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, Operand(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, Operand(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.
-  }
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path,
+                      R0,  // instance
+                      R7,  // end address
+                      R6,
+                      R8);
   // R0: new object start as a tagged pointer.
   // R7: new object end address.
 
@@ -2557,6 +2539,83 @@
 }
 
 
+LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
+    Isolate* isolate,
+    bool opt) const {
+  ASSERT(opt);
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 3;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  locs->set_temp(1, Location::RegisterLocation(R2));
+  locs->set_temp(2, Location::RegisterLocation(R3));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
+}
+
+
+class AllocateContextSlowPath : public SlowPathCode {
+ public:
+  explicit AllocateContextSlowPath(
+      AllocateUninitializedContextInstr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("AllocateContextSlowPath");
+    __ Bind(entry_label());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+
+    __ LoadImmediate(R1, instruction_->num_context_variables());
+    StubCode* stub_code = compiler->isolate()->stub_code();
+    const ExternalLabel label(stub_code->AllocateContextEntryPoint());
+    compiler->GenerateCall(instruction_->token_pos(),
+                           &label,
+                           RawPcDescriptors::kOther,
+                           locs);
+    ASSERT(instruction_->locs()->out(0).reg() == R0);
+    compiler->RestoreLiveRegisters(instruction_->locs());
+    __ b(exit_label());
+  }
+
+ private:
+  AllocateUninitializedContextInstr* instruction_;
+};
+
+
+void AllocateUninitializedContextInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register temp0 = locs()->temp(0).reg();
+  Register temp1 = locs()->temp(1).reg();
+  Register temp2 = locs()->temp(2).reg();
+  Register result = locs()->out(0).reg();
+  // Try allocate the object.
+  AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  intptr_t instance_size = Context::InstanceSize(num_context_variables());
+
+  __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
+                      result,  // instance
+                      temp0,
+                      temp1,
+                      temp2);
+
+  // Setup up number of context variables field.
+  __ LoadImmediate(temp0, num_context_variables());
+  __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
+
+  // Setup isolate field.
+  __ ldr(temp0, FieldAddress(CTX, Context::isolate_offset()));
+  __ str(temp0, FieldAddress(result, Context::isolate_offset()));
+
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -2583,6 +2642,43 @@
 }
 
 
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  return locs;
+}
+
+
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register field = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+  Label call_runtime, no_call;
+
+  __ ldr(temp, FieldAddress(field, Field::value_offset()));
+  __ CompareObject(temp, Object::sentinel());
+  __ b(&call_runtime, EQ);
+
+  __ CompareObject(temp, Object::transition_sentinel());
+  __ b(&no_call, NE);
+
+  __ Bind(&call_runtime);
+  __ PushObject(Object::null_object());  // Make room for (unused) result.
+  __ Push(field);
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInitStaticFieldRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(2);  // Remove argument and result placeholder.
+  __ Bind(&no_call);
+}
+
+
 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2874,7 +2970,7 @@
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
       ConstantInstr* right_constant = right()->definition()->AsConstant();
-      summary->set_in(1, Location::Constant(right_constant->value()));
+      summary->set_in(1, Location::Constant(right_constant));
       summary->set_temp(0, Location::RequiresRegister());
     } else {
       summary->set_in(1, Location::RequiresRegister());
@@ -2972,13 +3068,17 @@
               // IP: result bits 32..63.
               __ cmp(IP, Operand(result, ASR, 31));
               __ b(deopt, NE);
-            } else {
+            } else if (TargetCPUFeatures::can_divide()) {
               const QRegister qtmp = locs()->temp(0).fpu_reg();
               const DRegister dtmp0 = EvenDRegisterOf(qtmp);
               const DRegister dtmp1 = OddDRegisterOf(qtmp);
               __ LoadImmediate(IP, value);
               __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
               __ mul(result, left, IP);
+            } else {
+             // TODO(vegorov): never emit this instruction if hardware does not
+             // support it! This will lead to deopt cycle penalizing the code.
+              __ b(deopt);
             }
           }
         }
@@ -3111,12 +3211,16 @@
           // IP: result bits 32..63.
           __ cmp(IP, Operand(result, ASR, 31));
           __ b(deopt, NE);
-        } else {
+        } else if (TargetCPUFeatures::can_divide()) {
           const QRegister qtmp = locs()->temp(0).fpu_reg();
           const DRegister dtmp0 = EvenDRegisterOf(qtmp);
           const DRegister dtmp1 = OddDRegisterOf(qtmp);
           __ CheckMultSignedOverflow(IP, right, result, dtmp0, dtmp1, deopt);
           __ mul(result, IP, right);
+        } else {
+          // TODO(vegorov): never emit this instruction if hardware does not
+          // support it! This will lead to deopt cycle penalizing the code.
+          __ b(deopt);
         }
       }
       break;
@@ -3143,11 +3247,16 @@
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
-      const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-      __ SmiUntag(temp, left);
-      __ SmiUntag(IP, right);
-
-      __ IntegerDivide(result, temp, IP, dtemp, DTMP);
+      if (TargetCPUFeatures::can_divide()) {
+        const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
+        __ SmiUntag(temp, left);
+        __ SmiUntag(IP, right);
+        __ IntegerDivide(result, temp, IP, dtemp, DTMP);
+      } else {
+        // TODO(vegorov): never emit this instruction if hardware does not
+        // support it! This will lead to deopt cycle penalizing the code.
+        __ b(deopt);
+      }
 
       // Check the corner case of dividing the 'MIN_SMI' with -1, in which
       // case we cannot tag the result.
@@ -3163,12 +3272,16 @@
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
-      const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-      __ SmiUntag(temp, left);
-      __ SmiUntag(IP, right);
-
-      __ IntegerDivide(result, temp, IP, dtemp, DTMP);
-
+      if (TargetCPUFeatures::can_divide()) {
+        const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
+        __ SmiUntag(temp, left);
+        __ SmiUntag(IP, right);
+        __ IntegerDivide(result, temp, IP, dtemp, DTMP);
+      } else {
+        // TODO(vegorov): never emit this instruction if hardware does not
+        // support it! This will lead to deopt cycle penalizing the code.
+        __ b(deopt);
+      }
       __ SmiUntag(IP, right);
       __ mls(result, IP, result, temp);  // result <- left - right * result
       __ SmiTag(result);
@@ -3229,6 +3342,280 @@
 }
 
 
+static void EmitInt32ShiftLeft(FlowGraphCompiler* compiler,
+                               BinaryInt32OpInstr* shift_left) {
+  const bool is_truncating = shift_left->IsTruncating();
+  const LocationSummary& locs = *shift_left->locs();
+  const Register left = locs.in(0).reg();
+  const Register result = locs.out(0).reg();
+  Label* deopt = shift_left->CanDeoptimize() ?
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
+  ASSERT(locs.in(1).IsConstant());
+  const Object& constant = locs.in(1).constant();
+  ASSERT(constant.IsSmi());
+  // Immediate shift operation takes 5 bits for the count.
+  const intptr_t kCountLimit = 0x1F;
+  const intptr_t value = Smi::Cast(constant).Value();
+  if (value == 0) {
+    __ MoveRegister(result, left);
+  } else if ((value < 0) || (value >= kCountLimit)) {
+    // This condition may not be known earlier in some cases because
+    // of constant propagation, inlining, etc.
+    if ((value >= kCountLimit) && is_truncating) {
+      __ mov(result, Operand(0));
+    } else {
+      // Result is Mint or exception.
+      __ b(deopt);
+    }
+  } else {
+    if (!is_truncating) {
+      // Check for overflow (preserve left).
+      __ Lsl(IP, left, value);
+      __ cmp(left, Operand(IP, ASR, value));
+      __ b(deopt, NE);  // Overflow.
+    }
+    // Shift for result now we know there is no overflow.
+    __ Lsl(result, left, value);
+  }
+}
+
+
+LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  // Calculate number of temporaries.
+  intptr_t num_temps = 0;
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+      (op_kind() == Token::kSHR)) {
+    num_temps = 1;
+  } else if ((op_kind() == Token::kMUL) &&
+             (TargetCPUFeatures::arm_version() != ARMv7)) {
+    num_temps = 1;
+  }
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+      (op_kind() == Token::kSHR)) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  if (op_kind() == Token::kMUL) {
+    if (TargetCPUFeatures::arm_version() != ARMv7) {
+      summary->set_temp(0, Location::RequiresFpuRegister());
+    }
+  }
+  // We make use of 3-operand instructions by not requiring result register
+  // to be identical to first input register as on Intel.
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BinaryInt32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (op_kind() == Token::kSHL) {
+    EmitInt32ShiftLeft(compiler, this);
+    return;
+  }
+
+  const Register left = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  }
+
+  if (locs()->in(1).IsConstant()) {
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    const int32_t value = Smi::Cast(constant).Value();
+    switch (op_kind()) {
+      case Token::kADD: {
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, value);
+        } else {
+          __ AddImmediateSetFlags(result, left, value);
+          __ b(deopt, VS);
+        }
+        break;
+      }
+      case Token::kSUB: {
+        if (deopt == NULL) {
+          __ AddImmediate(result, left, -value);
+        } else {
+          // Negating value and using AddImmediateSetFlags would not detect the
+          // overflow when value == kMinInt32.
+          __ SubImmediateSetFlags(result, left, value);
+          __ b(deopt, VS);
+        }
+        break;
+      }
+      case Token::kMUL: {
+        if (deopt == NULL) {
+          if (value == 2) {
+            __ mov(result, Operand(left, LSL, 1));
+          } else {
+            __ LoadImmediate(IP, value);
+            __ mul(result, left, IP);
+          }
+        } else {
+          if (value == 2) {
+            __ CompareImmediate(left, 0xC0000000);
+            __ b(deopt, MI);
+            __ mov(result, Operand(left, LSL, 1));
+          } else {
+            if (TargetCPUFeatures::arm_version() == ARMv7) {
+              __ LoadImmediate(IP, value);
+              __ smull(result, IP, left, IP);
+              // IP: result bits 32..63.
+              __ cmp(IP, Operand(result, ASR, 31));
+              __ b(deopt, NE);
+            } else if (TargetCPUFeatures::can_divide()) {
+              const QRegister qtmp = locs()->temp(0).fpu_reg();
+              const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+              const DRegister dtmp1 = OddDRegisterOf(qtmp);
+              __ LoadImmediate(IP, value);
+              __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
+              __ mul(result, left, IP);
+            } else {
+              // TODO(vegorov): never emit this instruction if hardware does not
+              // support it! This will lead to deopt cycle penalizing the code.
+              __ b(deopt);
+            }
+          }
+        }
+        break;
+      }
+      case Token::kBIT_AND: {
+        // No overflow check.
+        Operand o;
+        if (Operand::CanHold(value, &o)) {
+          __ and_(result, left, o);
+        } else if (Operand::CanHold(~value, &o)) {
+          __ bic(result, left, o);
+        } else {
+          __ LoadImmediate(IP, value);
+          __ and_(result, left, Operand(IP));
+        }
+        break;
+      }
+      case Token::kBIT_OR: {
+        // No overflow check.
+        Operand o;
+        if (Operand::CanHold(value, &o)) {
+          __ orr(result, left, o);
+        } else {
+          __ LoadImmediate(IP, value);
+          __ orr(result, left, Operand(IP));
+        }
+        break;
+      }
+      case Token::kBIT_XOR: {
+        // No overflow check.
+        Operand o;
+        if (Operand::CanHold(value, &o)) {
+          __ eor(result, left, o);
+        } else {
+          __ LoadImmediate(IP, value);
+          __ eor(result, left, Operand(IP));
+        }
+        break;
+      }
+      case Token::kSHR: {
+        // sarl operation masks the count to 5 bits.
+        const intptr_t kCountLimit = 0x1F;
+
+        if (value == 0) {
+          // TODO(vegorov): should be handled outside.
+          __ MoveRegister(result, left);
+          break;
+        } else if (value < 0) {
+          // TODO(vegorov): should be handled outside.
+          __ b(deopt);
+          break;
+        }
+
+        if (value >= kCountLimit) {
+          __ Asr(result, left, kCountLimit);
+        } else {
+          __ Asr(result, left, value);
+        }
+        break;
+      }
+
+      default:
+        UNREACHABLE();
+        break;
+    }
+    return;
+  }
+
+  const Register right = locs()->in(1).reg();
+  switch (op_kind()) {
+    case Token::kADD: {
+      if (deopt == NULL) {
+        __ add(result, left, Operand(right));
+      } else {
+        __ adds(result, left, Operand(right));
+        __ b(deopt, VS);
+      }
+      break;
+    }
+    case Token::kSUB: {
+      if (deopt == NULL) {
+        __ sub(result, left, Operand(right));
+      } else {
+        __ subs(result, left, Operand(right));
+        __ b(deopt, VS);
+      }
+      break;
+    }
+    case Token::kMUL: {
+      if (deopt == NULL) {
+        __ mul(result, left, right);
+      } else {
+        if (TargetCPUFeatures::arm_version() == ARMv7) {
+          __ smull(result, IP, left, right);
+          // IP: result bits 32..63.
+          __ cmp(IP, Operand(result, ASR, 31));
+          __ b(deopt, NE);
+        } else if (TargetCPUFeatures::can_divide()) {
+          const QRegister qtmp = locs()->temp(0).fpu_reg();
+          const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+          const DRegister dtmp1 = OddDRegisterOf(qtmp);
+          __ CheckMultSignedOverflow(left, right, result, dtmp0, dtmp1, deopt);
+          __ mul(result, left, right);
+        } else {
+          // TODO(vegorov): never emit this instruction if hardware does not
+          // support it! This will lead to deopt cycle penalizing the code.
+          __ b(deopt);
+        }
+      }
+      break;
+    }
+    case Token::kBIT_AND: {
+      // No overflow check.
+      __ and_(result, left, Operand(right));
+      break;
+    }
+    case Token::kBIT_OR: {
+      // No overflow check.
+      __ orr(result, left, Operand(right));
+      break;
+    }
+    case Token::kBIT_XOR: {
+      // No overflow check.
+      __ eor(result, left, Operand(right));
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
@@ -4481,6 +4868,42 @@
 }
 
 
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 4;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_in(2, Location::RequiresRegister());
+  summary->set_in(3, Location::RequiresRegister());
+  // Low (< 7) Q register needed for the vmovsr instruction.
+  summary->set_out(0, Location::FpuRegisterLocation(Q6));
+  return summary;
+}
+
+
+void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register v0 = locs()->in(0).reg();
+  const Register v1 = locs()->in(1).reg();
+  const Register v2 = locs()->in(2).reg();
+  const Register v3 = locs()->in(3).reg();
+  const QRegister result = locs()->out(0).fpu_reg();
+  const DRegister dresult0 = EvenDRegisterOf(result);
+  const DRegister dresult1 = OddDRegisterOf(result);
+  const SRegister sresult0 = EvenSRegisterOf(dresult0);
+  const SRegister sresult1 = OddSRegisterOf(dresult0);
+  const SRegister sresult2 = EvenSRegisterOf(dresult1);
+  const SRegister sresult3 = OddSRegisterOf(dresult1);
+  __ veorq(result, result, result);
+  __ vmovsr(sresult0, v0);
+  __ vmovsr(sresult1, v1);
+  __ vmovsr(sresult2, v2);
+  __ vmovsr(sresult3, v3);
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
@@ -4908,6 +5331,26 @@
 }
 
 
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::RequiresRegister());
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
+}
+
+
+void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register value = locs()->in(0).reg();
+  const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
+  __ vmovsr(STMP, value);
+  __ vcvtdi(result, STMP);
+}
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5345,12 +5788,16 @@
       __ b(deopt, EQ);
     }
     const Register temp = locs()->temp(0).reg();
-    const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-
-    __ SmiUntag(temp, left);
-    __ SmiUntag(IP, right);
-
-    __ IntegerDivide(result_div, temp, IP, dtemp, DTMP);
+    if (TargetCPUFeatures::can_divide()) {
+      const DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
+      __ SmiUntag(temp, left);
+      __ SmiUntag(IP, right);
+      __ IntegerDivide(result_div, temp, IP, dtemp, DTMP);
+    } else {
+      // TODO(vegorov): never emit this instruction if hardware does not
+      // support it! This will lead to deopt cycle penalizing the code.
+      __ b(deopt);
+    }
 
     // Check the corner case of dividing the 'MIN_SMI' with -1, in which
     // case we cannot tag the result.
@@ -5868,6 +6315,8 @@
         __ b(deopt, NE);
         __ smull(out_lo, out_hi, left_lo, right_lo);
       } else {
+        // TODO(vegorov): never emit this instruction if hardware does not
+        // support it! This will lead to deopt cycle penalizing the code.
         __ b(deopt);
       }
       break;
@@ -6085,16 +6534,6 @@
 }
 
 
-CompileType BoxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
-CompileType UnboxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6347,6 +6786,134 @@
 }
 
 
+LocationSummary* BoxInt32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  if (!ValueFitsSmi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  __ Lsl(out, value, 1);
+  if (!ValueFitsSmi()) {
+    Register temp = locs()->temp(0).reg();
+    Label done;
+    __ cmp(value, Operand(out, ASR, 1));
+    __ b(&done, EQ);
+    BoxAllocationSlowPath::Allocate(
+        compiler,
+        this,
+        compiler->mint_class(),
+        out,
+        temp);
+    __ Asr(temp, value, kBitsPerWord - 1);
+    __ StoreToOffset(kWord,
+                     value,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag);
+    __ StoreToOffset(kWord,
+                     temp,
+                     out,
+                     Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ Bind(&done);
+  }
+}
+
+
+
+LocationSummary* UnboxInt32Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps =
+      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register mint,
+                              Register result,
+                              Register temp,
+                              Label* deopt) {
+  __ LoadFromOffset(kWord,
+                    result,
+                    mint,
+                    Mint::value_offset() - kHeapObjectTag);
+  if (deopt != NULL) {
+    __ LoadFromOffset(kWord,
+                      temp,
+                      mint,
+                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ cmp(temp, Operand(result, ASR, kBitsPerWord - 1));
+    __ b(deopt, NE);
+  }
+}
+
+
+void UnboxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  if (value_cid == kMintCid) {
+    Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+    Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+    LoadInt32FromMint(compiler,
+                      value,
+                      out,
+                      temp,
+                      deopt);
+  } else if (value_cid == kSmiCid) {
+    __ SmiUntag(out, value);
+  } else {
+    Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    Label done;
+    __ tst(value, Operand(kSmiTagMask));
+    // Smi case.
+    __ mov(out, Operand(value), EQ);
+    __ SmiUntag(out, EQ);
+    __ b(&done, EQ);
+    // Mint case.
+    __ CompareClassId(value, kMintCid, temp);
+    __ b(deopt, NE);
+    LoadInt32FromMint(compiler,
+                      value,
+                      out,
+                      temp,
+                      deopt);
+    __ Bind(&done);
+  }
+}
+
+
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -6354,36 +6921,71 @@
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                       Location::RequiresRegister()));
     summary->set_out(0, Location::RequiresRegister());
-  } else {
-    ASSERT(from() == kUnboxedUint32);
+  } else if (to() == kUnboxedMint) {
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
     summary->set_in(0, Location::RequiresRegister());
     summary->set_out(0, Location::Pair(Location::RequiresRegister(),
                                        Location::RequiresRegister()));
+  } else {
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::SameAsFirstInput());
   }
   return summary;
 }
 
 
 void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (from() == kUnboxedMint) {
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent.
+    ASSERT(out == locs()->in(0).reg());
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    const Register out = locs()->out(0).reg();
+    // Representations are bitwise equivalent.
+    ASSERT(out == locs()->in(0).reg());
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ tst(out, Operand(out));
+      __ b(deopt, MI);
+    }
+  } else if (from() == kUnboxedMint) {
+    ASSERT(to() == kUnboxedUint32 || to() == kUnboxedInt32);
     PairLocation* in_pair = locs()->in(0).AsPairLocation();
     Register in_lo = in_pair->At(0).reg();
+    Register in_hi = in_pair->At(1).reg();
     Register out = locs()->out(0).reg();
     // Copy low word.
     __ mov(out, Operand(in_lo));
-  } else {
-    ASSERT(from() == kUnboxedUint32);
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      ASSERT(to() == kUnboxedInt32);
+      __ cmp(in_hi, Operand(in_lo, ASR, kBitsPerWord - 1));
+      __ b(deopt, NE);
+    }
+  } else if (from() == kUnboxedUint32 || from() == kUnboxedInt32) {
+    ASSERT(to() == kUnboxedMint);
     Register in = locs()->in(0).reg();
     PairLocation* out_pair = locs()->out(0).AsPairLocation();
     Register out_lo = out_pair->At(0).reg();
     Register out_hi = out_pair->At(1).reg();
     // Copy low word.
     __ mov(out_lo, Operand(in));
-    // Zero upper word.
-    __ eor(out_hi, out_hi, Operand(out_hi));
+    if (from() == kUnboxedUint32) {
+      __ eor(out_hi, out_hi, Operand(out_hi));
+    } else {
+      ASSERT(from() == kUnboxedInt32);
+      __ mov(out_hi, Operand(in, ASR, kBitsPerWord - 1));
+    }
+  } else {
+    UNREACHABLE();
   }
 }
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 63bce94..ca29a31 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -296,6 +296,7 @@
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(representation_ == kUnboxedDouble);
   if (!locs()->out(0).IsInvalid()) {
     if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
       const VRegister dst = locs()->out(0).fpu_reg();
@@ -1017,7 +1018,7 @@
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
@@ -1156,7 +1157,7 @@
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::WritableRegister());
   }
@@ -2186,6 +2187,84 @@
 }
 
 
+LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
+    Isolate* isolate,
+    bool opt) const {
+  ASSERT(opt);
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 3;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  locs->set_temp(1, Location::RegisterLocation(R2));
+  locs->set_temp(2, Location::RegisterLocation(R3));
+  locs->set_out(0, Location::RegisterLocation(R0));
+  return locs;
+}
+
+
+class AllocateContextSlowPath : public SlowPathCode {
+ public:
+  explicit AllocateContextSlowPath(
+      AllocateUninitializedContextInstr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("AllocateContextSlowPath");
+    __ Bind(entry_label());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+
+    __ LoadImmediate(R1, instruction_->num_context_variables(), PP);
+    StubCode* stub_code = compiler->isolate()->stub_code();
+    const ExternalLabel label(stub_code->AllocateContextEntryPoint());
+    compiler->GenerateCall(instruction_->token_pos(),
+                           &label,
+                           RawPcDescriptors::kOther,
+                           locs);
+    ASSERT(instruction_->locs()->out(0).reg() == R0);
+    compiler->RestoreLiveRegisters(instruction_->locs());
+    __ b(exit_label());
+  }
+
+ private:
+  AllocateUninitializedContextInstr* instruction_;
+};
+
+
+
+void AllocateUninitializedContextInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register temp0 = locs()->temp(0).reg();
+  Register temp1 = locs()->temp(1).reg();
+  Register temp2 = locs()->temp(2).reg();
+  Register result = locs()->out(0).reg();
+  // Try allocate the object.
+  AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  intptr_t instance_size = Context::InstanceSize(num_context_variables());
+
+  __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
+                      result,  // instance
+                      temp0,
+                      temp1,
+                      temp2);
+
+  // Setup up number of context variables field.
+  __ LoadImmediate(temp0, num_context_variables(), PP);
+  __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
+
+  // Setup isolate field.
+  __ ldr(temp0, FieldAddress(CTX, Context::isolate_offset()));
+  __ str(temp0, FieldAddress(result, Context::isolate_offset()));
+
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -2211,6 +2290,42 @@
                          locs());
 }
 
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(R0));
+  locs->set_temp(0, Location::RegisterLocation(R1));
+  return locs;
+}
+
+
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register field = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+  Label call_runtime, no_call;
+
+  __ ldr(temp, FieldAddress(field, Field::value_offset()));
+  __ CompareObject(temp, Object::sentinel(), PP);
+  __ b(&call_runtime, EQ);
+
+  __ CompareObject(temp, Object::transition_sentinel(), PP);
+  __ b(&no_call, NE);
+
+  __ Bind(&call_runtime);
+  __ PushObject(Object::null_object(), PP);  // Make room for (unused) result.
+  __ Push(field);
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInitStaticFieldRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(2);  // Remove argument and result placeholder.
+  __ Bind(&no_call);
+}
+
 
 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
@@ -2516,7 +2631,7 @@
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
       ConstantInstr* right_constant = right()->definition()->AsConstant();
-      summary->set_in(1, Location::Constant(right_constant->value()));
+      summary->set_in(1, Location::Constant(right_constant));
     } else {
       summary->set_in(1, Location::RequiresRegister());
     }
@@ -3861,6 +3976,35 @@
 }
 
 
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 4;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_in(2, Location::RequiresRegister());
+  summary->set_in(3, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register v0 = locs()->in(0).reg();
+  const Register v1 = locs()->in(1).reg();
+  const Register v2 = locs()->in(2).reg();
+  const Register v3 = locs()->in(3).reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  __ veor(result, result, result);
+  __ vinsw(result, 0, v0);
+  __ vinsw(result, 1, v1);
+  __ vinsw(result, 2, v2);
+  __ vinsw(result, 3, v3);
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
@@ -4261,6 +4405,9 @@
 }
 
 
+DEFINE_UNIMPLEMENTED_INSTRUCTION(Int32ToDoubleInstr)
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5002,85 +5149,42 @@
 }
 
 
-CompileType BoxUint32Instr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-
-CompileType UnboxUint32Instr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
 
 
 LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
 }
 
 
 void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  ASSERT(value == locs()->out(0).reg());
 
-
-LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
-                                                               bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(value);
+  } else {
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    __ tsti(value, kSmiTagMask);
+    __ b(deopt, NE);
+    __ SmiUntag(value);
+  }
 }
 
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index f8d3263..828bbd2 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -27,7 +27,6 @@
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
-DECLARE_FLAG(bool, use_slow_path);
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
@@ -176,15 +175,25 @@
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
-     XmmRegister result = locs()->out(0).fpu_reg();
-    if (constant_address() == 0) {
-      Register boxed = locs()->temp(0).reg();
-      __ LoadObjectSafely(boxed, value());
-      __ movsd(result, FieldAddress(boxed, Double::value_offset()));
-    } else if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
-      __ xorps(result, result);
-    } else {
-      __ movsd(result, Address::Absolute(constant_address()));
+    switch (representation()) {
+      case kUnboxedDouble: {
+        XmmRegister result = locs()->out(0).fpu_reg();
+        if (constant_address() == 0) {
+          Register boxed = locs()->temp(0).reg();
+          __ LoadObjectSafely(boxed, value());
+          __ movsd(result, FieldAddress(boxed, Double::value_offset()));
+        } else if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0)) {
+          __ xorps(result, result);
+        } else {
+          __ movsd(result, Address::Absolute(constant_address()));
+        }
+        break;
+      }
+      case kUnboxedInt32:
+        __ movl(locs()->out(0).reg(), Immediate(Smi::Cast(value()).Value()));
+        break;
+      default:
+        UNREACHABLE();
     }
   }
 }
@@ -1043,7 +1052,7 @@
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     // The index is either untagged (element size == 1) or a smi (for all
     // element sizes > 1).
@@ -1239,7 +1248,7 @@
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     // The index is either untagged (element size == 1) or a smi (for all
     // element sizes > 1).
@@ -2042,41 +2051,18 @@
 
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
-                                   intptr_t num_elements,
-                                   Label* slow_path,
-                                   Label* done) {
+                                  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();
+  const intptr_t instance_size = Array::InstanceSize(num_elements);
 
-  __ 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));
-  }
+  // Instance in EAX.
+  // Object end address in EBX.
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
+                      EAX,  // instance
+                      EBX);  // end address
 
   // Store the type argument field.
   __ StoreIntoObjectNoBarrier(EAX,
@@ -2380,23 +2366,15 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
-                                                           bool opt) const {
-  if (opt) {
-    const intptr_t kNumInputs = 0;
-    const intptr_t kNumTemps = 2;
-    LocationSummary* locs = new(isolate) LocationSummary(
-        isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
-    locs->set_temp(0, Location::RegisterLocation(ECX));
-    locs->set_temp(1, Location::RegisterLocation(EBX));
-    locs->set_out(0, Location::RegisterLocation(EAX));
-    return locs;
-  }
+LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
+    Isolate* isolate,
+    bool opt) const {
+  ASSERT(opt);
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
   LocationSummary* locs = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
-  locs->set_temp(0, Location::RegisterLocation(EDX));
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  locs->set_temp(0, Location::RegisterLocation(ECX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
 }
@@ -2404,7 +2382,8 @@
 
 class AllocateContextSlowPath : public SlowPathCode {
  public:
-  explicit AllocateContextSlowPath(AllocateContextInstr* instruction)
+  explicit AllocateContextSlowPath(
+      AllocateUninitializedContextInstr* instruction)
       : instruction_(instruction) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -2429,81 +2408,50 @@
   }
 
  private:
-  AllocateContextInstr* instruction_;
+  AllocateUninitializedContextInstr* instruction_;
 };
 
 
+void AllocateUninitializedContextInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  ASSERT(compiler->is_optimizing());
+  Register temp = locs()->temp(0).reg();
+  Register result = locs()->out(0).reg();
+  // Try allocate the object.
+  AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  intptr_t instance_size = Context::InstanceSize(num_context_variables());
+
+  __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
+                      Assembler::kFarJump,
+                      result,  // instance
+                      temp);  // end address
+
+  // Setup up number of context variables field.
+  __ movl(FieldAddress(result, Context::num_variables_offset()),
+          Immediate(num_context_variables()));
+
+  // Setup isolate field.
+  __ movl(FieldAddress(result, Context::isolate_offset()),
+          Immediate(reinterpret_cast<int32_t>(Isolate::Current())));
+
+  __ Bind(slow_path->exit_label());
+}
+
+
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_temp(0, Location::RegisterLocation(EDX));
+  locs->set_out(0, Location::RegisterLocation(EAX));
+  return locs;
+}
+
 
 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (compiler->is_optimizing()) {
-    Register temp0 = locs()->temp(0).reg();
-    Register temp1 = locs()->temp(1).reg();
-    Register result = locs()->out(0).reg();
-    // Try allocate the object.
-    AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
-    compiler->AddSlowPathCode(slow_path);
-    intptr_t instance_size = Context::InstanceSize(num_context_variables());
-    __ movl(temp1, Immediate(instance_size));
-    Isolate* isolate = Isolate::Current();
-    Heap* heap = isolate->heap();
-    __ movl(result, Address::Absolute(heap->TopAddress()));
-    __ addl(temp1, result);
-    // Check if the allocation fits into the remaining space.
-    // EAX: potential new object.
-    // EBX: potential next object start.
-    __ cmpl(temp1, Address::Absolute(heap->EndAddress()));
-    if (FLAG_use_slow_path) {
-      __ jmp(slow_path->entry_label());
-    } else {
-      __ j(ABOVE_EQUAL, slow_path->entry_label());
-    }
-
-    // Successfully allocated the object, now update top to point to
-    // next object start and initialize the object.
-    // EAX: new object.
-    // EBX: next object start.
-    // EDX: number of context variables.
-    __ movl(Address::Absolute(heap->TopAddress()), temp1);
-    __ addl(result, Immediate(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(kContextCid, instance_size, kNoRegister);
-
-    // Calculate the size tag and write tags.
-    intptr_t size_tag = (instance_size > RawObject::SizeTag::kMaxSizeTag)
-        ? 0 : instance_size << (RawObject::kSizeTagPos - kObjectAlignmentLog2);
-
-    intptr_t tags = size_tag | RawObject::ClassIdTag::encode(kContextCid);
-    __ movl(FieldAddress(result, Context::tags_offset()), Immediate(tags));
-
-    // Setup up number of context variables field.
-    // EAX: new object.
-    __ movl(FieldAddress(result, Context::num_variables_offset()),
-            Immediate(num_context_variables()));
-
-    // Setup isolate field.
-    __ movl(FieldAddress(result, Context::isolate_offset()),
-            Immediate(reinterpret_cast<int32_t>(isolate)));
-
-    // Setup the parent field.
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ movl(FieldAddress(result, Context::parent_offset()), raw_null);
-
-    // Initialize the context variables.
-    // EAX: new object.
-    if (num_context_variables() > 0) {
-      Label loop;
-      __ leal(temp1, FieldAddress(result, Context::variable_offset(0)));
-      __ movl(temp0, Immediate(num_context_variables()));
-      __ Bind(&loop);
-      __ decl(temp0);
-      __ movl(Address(temp1, temp0, TIMES_4, 0), raw_null);
-      __ j(NOT_ZERO, &loop, Assembler::kNearJump);
-    }
-    // EAX: new object.
-    __ Bind(slow_path->exit_label());
-    return;
-  }
-
   ASSERT(locs()->temp(0).reg() == EDX);
   ASSERT(locs()->out(0).reg() == EAX);
 
@@ -2517,6 +2465,44 @@
 }
 
 
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(EAX));
+  locs->set_temp(0, Location::RegisterLocation(ECX));
+  return locs;
+}
+
+
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register field = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  Label call_runtime, no_call;
+
+  __ movl(temp, FieldAddress(field, Field::value_offset()));
+  __ CompareObject(temp, Object::sentinel());
+  __ j(EQUAL, &call_runtime);
+
+  __ CompareObject(temp, Object::transition_sentinel());
+  __ j(NOT_EQUAL, &no_call);
+
+  __ Bind(&call_runtime);
+  __ PushObject(Object::null_object());  // Make room for (unused) result.
+  __ pushl(field);
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInitStaticFieldRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(2);  // Remove argument and unused result.
+  __ Bind(&no_call);
+}
+
+
 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2799,7 +2785,7 @@
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
       // The programmer only controls one bit, so the constant is safe.
-      summary->set_in(1, Location::Constant(right_constant->value()));
+      summary->set_in(1, Location::Constant(right_constant));
       summary->set_temp(0, Location::RequiresRegister());
       summary->set_out(0, Location::SameAsFirstInput());
     } else {
@@ -2869,7 +2855,7 @@
   ASSERT(left == result);
   Label* deopt = NULL;
   if (CanDeoptimize()) {
-    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
 
   if (locs()->in(1).IsConstant()) {
@@ -3163,6 +3149,289 @@
 }
 
 
+LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  if (op_kind() == Token::kTRUNCDIV) {
+    UNREACHABLE();
+    return NULL;
+  } else if (op_kind() == Token::kMOD) {
+     UNREACHABLE();
+    return NULL;
+  } else if (op_kind() == Token::kSHR) {
+    const intptr_t kNumTemps = 0;
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    summary->set_out(0, Location::SameAsFirstInput());
+    return summary;
+  } else if (op_kind() == Token::kSHL) {
+    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+    if (!IsTruncating()) {
+      summary->set_temp(0, Location::RequiresRegister());
+    }
+    summary->set_out(0, Location::SameAsFirstInput());
+    return summary;
+  } else {
+    const intptr_t kNumTemps = 0;
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresRegister());
+    ConstantInstr* constant = right()->definition()->AsConstant();
+    if (constant != NULL) {
+      summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+    } else {
+      summary->set_in(1, Location::PrefersRegister());
+    }
+    summary->set_out(0, Location::SameAsFirstInput());
+    return summary;
+  }
+}
+
+
+static void EmitInt32ShiftLeft(FlowGraphCompiler* compiler,
+                               BinaryInt32OpInstr* shift_left) {
+  const bool is_truncating = shift_left->IsTruncating();
+  const LocationSummary& locs = *shift_left->locs();
+  Register left = locs.in(0).reg();
+  Register result = locs.out(0).reg();
+  ASSERT(left == result);
+  Label* deopt = shift_left->CanDeoptimize() ?
+      compiler->AddDeoptStub(shift_left->deopt_id(), ICData::kDeoptBinarySmiOp)
+      : NULL;
+  ASSERT(locs.in(1).IsConstant());
+
+  const Object& constant = locs.in(1).constant();
+  ASSERT(constant.IsSmi());
+  // shll operation masks the count to 5 bits.
+  const intptr_t kCountLimit = 0x1F;
+  const intptr_t value = Smi::Cast(constant).Value();
+  if (value == 0) {
+    // No code needed.
+  } else if ((value < 0) || (value >= kCountLimit)) {
+    // This condition may not be known earlier in some cases because
+    // of constant propagation, inlining, etc.
+    if ((value >= kCountLimit) && is_truncating) {
+      __ xorl(result, result);
+    } else {
+      // Result is Mint or exception.
+      __ jmp(deopt);
+    }
+  } else {
+    if (!is_truncating) {
+      // Check for overflow.
+      Register temp = locs.temp(0).reg();
+      __ movl(temp, left);
+      __ shll(left, Immediate(value));
+      __ sarl(left, Immediate(value));
+      __ cmpl(left, temp);
+      __ j(NOT_EQUAL, deopt);  // Overflow.
+    }
+    // Shift for result now we know there is no overflow.
+    __ shll(left, Immediate(value));
+  }
+}
+
+
+void BinaryInt32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (op_kind() == Token::kSHL) {
+    EmitInt32ShiftLeft(compiler, this);
+    return;
+  }
+
+  Register left = locs()->in(0).reg();
+  Register result = locs()->out(0).reg();
+  ASSERT(left == result);
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt  = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  }
+
+  if (locs()->in(1).IsConstant()) {
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    const intptr_t value = Smi::Cast(constant).Value();
+    switch (op_kind()) {
+    case Token::kADD:
+        if (value != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ addl(left, Immediate(value));
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
+        break;
+      case Token::kSUB: {
+        if (value != 0) {
+          // Checking overflow without emitting an instruction would be wrong.
+          __ subl(left, Immediate(value));
+          if (deopt != NULL) __ j(OVERFLOW, deopt);
+        }
+        break;
+      }
+      case Token::kMUL: {
+        if (value == 2) {
+          __ shll(left, Immediate(1));
+        } else {
+          __ imull(left, Immediate(value));
+        }
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        break;
+      }
+      case Token::kTRUNCDIV: {
+        UNREACHABLE();
+        break;
+      }
+      case Token::kBIT_AND: {
+        // No overflow check.
+        __ andl(left, Immediate(value));
+        break;
+      }
+      case Token::kBIT_OR: {
+        // No overflow check.
+        __ orl(left, Immediate(value));
+        break;
+      }
+      case Token::kBIT_XOR: {
+        // No overflow check.
+        __ xorl(left, Immediate(value));
+        break;
+      }
+      case Token::kSHR: {
+        // sarl operation masks the count to 5 bits.
+        const intptr_t kCountLimit = 0x1F;
+        if (value == 0) {
+          // TODO(vegorov): should be handled outside.
+          break;
+        } else if (value < 0) {
+          // TODO(vegorov): should be handled outside.
+          __ jmp(deopt);
+          break;
+        }
+
+        if (value >= kCountLimit) {
+          __ sarl(left, Immediate(kCountLimit));
+        } else {
+          __ sarl(left, Immediate(value));
+        }
+
+        break;
+      }
+
+      default:
+        UNREACHABLE();
+        break;
+    }
+    return;
+  }  // if locs()->in(1).IsConstant()
+
+  if (locs()->in(1).IsStackSlot()) {
+    const Address& right = locs()->in(1).ToStackSlotAddress();
+    switch (op_kind()) {
+      case Token::kADD: {
+        __ addl(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        break;
+      }
+      case Token::kSUB: {
+        __ subl(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        break;
+      }
+      case Token::kMUL: {
+        __ imull(left, right);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        break;
+      }
+      case Token::kBIT_AND: {
+        // No overflow check.
+        __ andl(left, right);
+        break;
+      }
+      case Token::kBIT_OR: {
+        // No overflow check.
+        __ orl(left, right);
+        break;
+      }
+      case Token::kBIT_XOR: {
+        // No overflow check.
+        __ xorl(left, right);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+    return;
+  }  // if locs()->in(1).IsStackSlot.
+
+  // if locs()->in(1).IsRegister.
+  Register right = locs()->in(1).reg();
+  switch (op_kind()) {
+    case Token::kADD: {
+      __ addl(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
+      break;
+    }
+    case Token::kSUB: {
+      __ subl(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
+      break;
+    }
+    case Token::kMUL: {
+      __ imull(left, right);
+      if (deopt != NULL) __ j(OVERFLOW, deopt);
+      break;
+    }
+    case Token::kBIT_AND: {
+      // No overflow check.
+      __ andl(left, right);
+      break;
+    }
+    case Token::kBIT_OR: {
+      // No overflow check.
+      __ orl(left, right);
+      break;
+    }
+    case Token::kBIT_XOR: {
+      // No overflow check.
+      __ xorl(left, right);
+      break;
+    }
+    case Token::kTRUNCDIV: {
+      UNREACHABLE();
+      break;
+    }
+    case Token::kMOD: {
+      UNREACHABLE();
+      break;
+    }
+    case Token::kSHR: {
+      UNREACHABLE();
+      break;
+    }
+    case Token::kDIV: {
+      // Dispatches to 'Double./'.
+      // TODO(srdjan): Implement as conversion to double and double division.
+      UNREACHABLE();
+      break;
+    }
+    case Token::kOR:
+    case Token::kAND: {
+      // Flow graph builder has dissected this operation to guarantee correct
+      // behavior (short-circuit evaluation).
+      UNREACHABLE();
+      break;
+    }
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
@@ -4076,11 +4345,10 @@
   XmmRegister v0 = locs()->in(0).fpu_reg();
   XmmRegister v1 = locs()->in(1).fpu_reg();
   ASSERT(v0 == locs()->out(0).fpu_reg());
-  __ subl(ESP, Immediate(16));
-  __ movsd(Address(ESP, 0), v0);
-  __ movsd(Address(ESP, 8), v1);
-  __ movups(v0, Address(ESP, 0));
-  __ addl(ESP, Immediate(16));
+  // shufpd mask 0x0 results in:
+  // Lower 64-bits of v0 = Lower 64-bits of v0.
+  // Upper 64-bits of v0 = Lower 64-bits of v1.
+  __ shufpd(v0, v1, Immediate(0x0));
 }
 
 
@@ -4217,6 +4485,37 @@
 }
 
 
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 4;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_in(2, Location::RequiresRegister());
+  summary->set_in(3, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register v0 = locs()->in(0).reg();
+  Register v1 = locs()->in(1).reg();
+  Register v2 = locs()->in(2).reg();
+  Register v3 = locs()->in(3).reg();
+  XmmRegister result = locs()->out(0).fpu_reg();
+  __ subl(ESP, Immediate(4 * kInt32Size));
+  __ movl(Address(ESP, 0 * kInt32Size), v0);
+  __ movl(Address(ESP, 1 * kInt32Size), v1);
+  __ movl(Address(ESP, 2 * kInt32Size), v2);
+  __ movl(Address(ESP, 3 * kInt32Size), v3);
+  __ movups(result, Address(ESP, 0));
+  __ addl(ESP, Immediate(4 * kInt32Size));
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
@@ -4667,6 +4966,25 @@
 }
 
 
+LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::WritableRegister());
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
+}
+
+
+void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  FpuRegister result = locs()->out(0).fpu_reg();
+  __ cvtsi2sd(result, value);
+}
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5191,7 +5509,7 @@
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Label* deopt = compiler->AddDeoptStub(
       deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
-  if (ic_data().NumberOfChecks() == 0) {
+  if (ic_data().NumberOfUsedChecks() == 0) {
     __ jmp(deopt);
     return;
   }
@@ -5370,13 +5688,12 @@
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
-  ConstantInstr* index_constant = index()->definition()->AsConstant();
-  if (index_constant != NULL) {
-    locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
+  if (length()->definition()->IsConstant()) {
+    locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   } else {
-    locs->set_in(kIndexPos, Location::PrefersRegister());
+    locs->set_in(kLengthPos, Location::PrefersRegister());
   }
+  locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
 }
 
@@ -5398,31 +5715,31 @@
     return;
   }
 
-  if (index_loc.IsConstant()) {
-    Register length = length_loc.reg();
-    const Smi& index = Smi::Cast(index_loc.constant());
-    __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
-    __ j(BELOW_EQUAL, deopt);
-  } else if (length_loc.IsConstant()) {
-    const Smi& length = Smi::Cast(length_loc.constant());
-    if (index_loc.IsStackSlot()) {
-      const Address& index = index_loc.ToStackSlotAddress();
-      __ cmpl(index, Immediate(reinterpret_cast<int32_t>(length.raw())));
-    } else {
-      Register index = index_loc.reg();
-      __ cmpl(index, Immediate(reinterpret_cast<int32_t>(length.raw())));
-    }
-    __ j(ABOVE_EQUAL, deopt);
-  } else if (index_loc.IsStackSlot()) {
-    Register length = length_loc.reg();
-    const Address& index = index_loc.ToStackSlotAddress();
-    __ cmpl(length, index);
-    __ j(BELOW_EQUAL, deopt);
-  } else {
-    Register length = length_loc.reg();
+  if (length_loc.IsConstant()) {
     Register index = index_loc.reg();
+    const Smi& length = Smi::Cast(length_loc.constant());
+    __ cmpl(index, Immediate(reinterpret_cast<int32_t>(length.raw())));
+    __ j(ABOVE_EQUAL, deopt);
+  } else if (index_loc.IsConstant()) {
+    const Smi& index = Smi::Cast(index_loc.constant());
+    if (length_loc.IsStackSlot()) {
+      const Address& length = length_loc.ToStackSlotAddress();
+      __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
+    } else {
+      Register length = length_loc.reg();
+      __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
+    }
+    __ j(BELOW_EQUAL, deopt);
+  } else if (length_loc.IsStackSlot()) {
+    Register index = index_loc.reg();
+    const Address& length = length_loc.ToStackSlotAddress();
     __ cmpl(index, length);
     __ j(ABOVE_EQUAL, deopt);
+  } else {
+    Register index = index_loc.reg();
+    Register length = length_loc.reg();
+    __ cmpl(length, index);
+    __ j(BELOW_EQUAL, deopt);
   }
 }
 
@@ -5905,16 +6222,6 @@
 }
 
 
-CompileType BoxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
-CompileType UnboxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6087,9 +6394,14 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresRegister());
+  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
+                                     : Location::RequiresRegister());
   return summary;
 }
 
@@ -6097,27 +6409,68 @@
 void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
   Register out = locs()->out(0).reg();
-  ASSERT(value != out);
 
   Label not_smi, done;
 
-  // TODO(johnmccutchan): Use range information to fast path smi / mint boxing.
-  // Test if this value is <= kSmiMax.
-  __ cmpl(value, Immediate(kSmiMax));
-  __ j(ABOVE, &not_smi);
-  // Smi.
-  __ movl(out, value);
-  __ SmiTag(out);
-  __ jmp(&done);
-  __ Bind(&not_smi);
-  // Allocate a mint.
-  BoxAllocationSlowPath::Allocate(
-      compiler, this, compiler->mint_class(), out, kNoRegister);
-  // Copy low word into mint.
-  __ movl(FieldAddress(out, Mint::value_offset()), value);
-  // Zero high word.
-  __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), Immediate(0));
-  __ Bind(&done);
+  if (ValueFitsSmi()) {
+    ASSERT(value == out);
+    __ SmiTag(value);
+  } else {
+    ASSERT(value != out);
+    __ cmpl(value, Immediate(kSmiMax));
+    __ j(ABOVE, &not_smi);
+    // Smi.
+    __ movl(out, value);
+    __ SmiTag(out);
+    __ jmp(&done);
+    __ Bind(&not_smi);
+    // Allocate a mint.
+    BoxAllocationSlowPath::Allocate(
+        compiler, this, compiler->mint_class(), out, kNoRegister);
+    // Copy low word into mint.
+    __ movl(FieldAddress(out, Mint::value_offset()), value);
+    // Zero high word.
+    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), Immediate(0));
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* BoxInt32Instr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, ValueFitsSmi() ? Location::RequiresRegister()
+                                    : Location::WritableRegister());
+  summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput()
+                                     : Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+
+  if (out != value) {
+    __ movl(out, value);
+  }
+  __ shll(out, Immediate(1));
+  if (!ValueFitsSmi()) {
+    Label done;
+    __ j(NO_OVERFLOW, &done);
+    // Allocate a mint.
+    BoxAllocationSlowPath::Allocate(
+        compiler, this, compiler->mint_class(), out, kNoRegister);
+    __ movl(FieldAddress(out, Mint::value_offset()), value);
+    __ sarl(value, Immediate(31));  // Sign extend.
+    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
+    __ Bind(&done);
+  }
 }
 
 
@@ -6166,35 +6519,142 @@
 }
 
 
+LocationSummary* UnboxInt32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = CanDeoptimize() ? 1 : 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, (value_cid == kSmiCid) ? Location::SameAsFirstInput()
+                                             : Location::RequiresRegister());
+  return summary;
+}
+
+
+static void LoadInt32FromMint(FlowGraphCompiler* compiler,
+                              Register mint,
+                              Register result,
+                              Register temp,
+                              Label* deopt) {
+  __ movl(result, FieldAddress(mint, Mint::value_offset()));
+  if (deopt != NULL) {
+    __ movl(temp, result);
+    __ sarl(temp, Immediate(31));
+    __ cmpl(temp, FieldAddress(mint, Mint::value_offset() + kWordSize));
+    __ j(NOT_EQUAL, deopt);
+  }
+}
+
+
+void UnboxInt32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const Register result = locs()->out(0).reg();
+
+  // TODO(johnmccutchan): Emit better code for constant inputs.
+  if (value_cid == kMintCid) {
+    Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
+    Label* deopt = CanDeoptimize() ?
+        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+    LoadInt32FromMint(compiler,
+                      value,
+                      result,
+                      temp,
+                      deopt);
+  } else if (value_cid == kSmiCid) {
+    ASSERT(value == result);
+    __ SmiUntag(value);
+  } else {
+    Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    Label is_smi, done;
+    __ testl(value, Immediate(kSmiTagMask));
+    __ j(ZERO, &is_smi);
+    __ CompareClassId(value, kMintCid, temp);
+    __ j(NOT_EQUAL, deopt);
+    LoadInt32FromMint(compiler,
+                      value,
+                      result,
+                      temp,
+                      deopt);
+    __ movl(value, FieldAddress(value, Mint::value_offset()));
+    __ jmp(&done);
+    __ Bind(&is_smi);
+    __ SmiUntag(value);
+    __ Bind(&done);
+  }
+}
+
+
 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
                                                                bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  if (from() == kUnboxedMint) {
-    summary->set_in(0, Location::Pair(Location::RequiresRegister(),
-                                      Location::RequiresRegister()));
+  if ((from() == kUnboxedInt32 || from() == kUnboxedUint32) &&
+      (to() == kUnboxedInt32 || to() == kUnboxedUint32)) {
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::SameAsFirstInput());
+  } else if (from() == kUnboxedMint) {
+    summary->set_in(0, Location::Pair(
+        CanDeoptimize() ? Location::WritableRegister()
+                        : Location::RequiresRegister(),
+        Location::RequiresRegister()));
     summary->set_out(0, Location::RequiresRegister());
-  } else {
-    ASSERT(from() == kUnboxedUint32);
+  } else if (from() == kUnboxedUint32) {
     summary->set_in(0, Location::RequiresRegister());
     summary->set_out(0, Location::Pair(Location::RequiresRegister(),
                                        Location::RequiresRegister()));
+  } else if (from() == kUnboxedInt32) {
+    summary->set_in(0, Location::RegisterLocation(EAX));
+    summary->set_out(0, Location::Pair(Location::RegisterLocation(EAX),
+                                       Location::RegisterLocation(EDX)));
   }
   return summary;
 }
 
 
 void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (from() == kUnboxedMint) {
+  if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
+    // Representations are bitwise equivalent.
+    ASSERT(locs()->out(0).reg() == locs()->in(0).reg());
+  } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
+    // Representations are bitwise equivalent.
+    ASSERT(locs()->out(0).reg() == locs()->in(0).reg());
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ testl(locs()->out(0).reg(), locs()->out(0).reg());
+      __ j(NEGATIVE, deopt);
+    }
+  } else if (from() == kUnboxedMint) {
+    // TODO(vegorov) kUnboxedMint -> kInt32 conversion is currently usually
+    // dominated by a CheckSmi(BoxInteger(val)) which is an artifact of ordering
+    // of optimization passes and the way we check smi-ness of values.
+    // Optimize it away.
+    ASSERT(to() == kUnboxedInt32 || to() == kUnboxedUint32);
     PairLocation* in_pair = locs()->in(0).AsPairLocation();
     Register in_lo = in_pair->At(0).reg();
+    Register in_hi = in_pair->At(1).reg();
     Register out = locs()->out(0).reg();
     // Copy low word.
     __ movl(out, in_lo);
-  } else {
-    ASSERT(from() == kUnboxedUint32);
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      __ sarl(in_lo, Immediate(31));
+      __ cmpl(in_lo, in_hi);
+      __ j(NOT_EQUAL, deopt);
+    }
+  } else if (from() == kUnboxedUint32) {
+    ASSERT(to() == kUnboxedMint);
     Register in = locs()->in(0).reg();
     PairLocation* out_pair = locs()->out(0).AsPairLocation();
     Register out_lo = out_pair->At(0).reg();
@@ -6203,6 +6663,16 @@
     __ movl(out_lo, in);
     // Zero upper word.
     __ xorl(out_hi, out_hi);
+  } else if (from() == kUnboxedInt32) {
+    ASSERT(to() == kUnboxedMint);
+    PairLocation* out_pair = locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+    ASSERT(locs()->in(0).reg() == EAX);
+    ASSERT(out_lo == EAX && out_hi == EDX);
+    __ cdq();
+  } else {
+    UNREACHABLE();
   }
 }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 7793d9b..645f87b 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -326,6 +326,7 @@
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(representation_ == kUnboxedDouble);
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
     ASSERT(value().IsDouble());
@@ -1122,7 +1123,7 @@
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::RequiresRegister());
   }
@@ -1275,7 +1276,7 @@
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
-    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+    locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
   } else {
     locs->set_in(1, Location::WritableRegister());
   }
@@ -1995,41 +1996,13 @@
                                    Label* done) {
   const Register kLengthReg = A1;
   const Register kElemTypeReg = A0;
-  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+  const intptr_t instance_size = 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.
-  }
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path,
+                      V0,  // instance
+                      T1,  // end address
+                      T2,
+                      T3);
   // V0: new object start as a tagged pointer.
   // T1: new object end address.
 
@@ -2311,6 +2284,83 @@
 }
 
 
+LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
+    Isolate* isolate,
+    bool opt) const {
+  ASSERT(opt);
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 3;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  locs->set_temp(0, Location::RegisterLocation(T1));
+  locs->set_temp(1, Location::RegisterLocation(T2));
+  locs->set_temp(2, Location::RegisterLocation(T3));
+  locs->set_out(0, Location::RegisterLocation(V0));
+  return locs;
+}
+
+
+class AllocateContextSlowPath : public SlowPathCode {
+ public:
+  explicit AllocateContextSlowPath(
+      AllocateUninitializedContextInstr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("AllocateContextSlowPath");
+    __ Bind(entry_label());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+
+    __ LoadImmediate(T1, instruction_->num_context_variables());
+    StubCode* stub_code = compiler->isolate()->stub_code();
+    const ExternalLabel label(stub_code->AllocateContextEntryPoint());
+    compiler->GenerateCall(instruction_->token_pos(),
+                           &label,
+                           RawPcDescriptors::kOther,
+                           locs);
+    ASSERT(instruction_->locs()->out(0).reg() == V0);
+    compiler->RestoreLiveRegisters(instruction_->locs());
+    __ b(exit_label());
+  }
+
+ private:
+  AllocateUninitializedContextInstr* instruction_;
+};
+
+
+void AllocateUninitializedContextInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  Register temp0 = locs()->temp(0).reg();
+  Register temp1 = locs()->temp(1).reg();
+  Register temp2 = locs()->temp(2).reg();
+  Register result = locs()->out(0).reg();
+  // Try allocate the object.
+  AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  intptr_t instance_size = Context::InstanceSize(num_context_variables());
+
+  __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
+                      result,  // instance
+                      temp0,
+                      temp1,
+                      temp2);
+
+  // Setup up number of context variables field.
+  __ LoadImmediate(temp0, num_context_variables());
+  __ sw(temp0, FieldAddress(result, Context::num_variables_offset()));
+
+  // Setup isolate field.
+  __ lw(temp0, FieldAddress(CTX, Context::isolate_offset()));
+  __ sw(temp0, FieldAddress(result, Context::isolate_offset()));
+
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -2324,12 +2374,11 @@
 
 
 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register temp = T1;
-  ASSERT(locs()->temp(0).reg() == temp);
+  ASSERT(locs()->temp(0).reg() == T1);
   ASSERT(locs()->out(0).reg() == V0);
 
   __ TraceSimMsg("AllocateContextInstr");
-  __ LoadImmediate(temp, num_context_variables());
+  __ LoadImmediate(T1, num_context_variables());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->AllocateContextEntryPoint());
   compiler->GenerateCall(token_pos(),
@@ -2339,6 +2388,47 @@
 }
 
 
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(T0));
+  locs->set_temp(0, Location::RegisterLocation(T1));
+  return locs;
+}
+
+
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register field = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  Label call_runtime, no_call;
+  __ TraceSimMsg("InitStaticFieldInstr");
+
+  __ lw(temp, FieldAddress(field, Field::value_offset()));
+  __ BranchEqual(temp, Object::sentinel(), &call_runtime);
+  __ BranchNotEqual(temp, Object::transition_sentinel(), &no_call);
+
+  __ Bind(&call_runtime);
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ LoadObject(TMP, Object::null_object());
+  __ sw(TMP, Address(SP, 1 * kWordSize));   // Make room for (unused) result.
+  __ sw(field, Address(SP, 0 * kWordSize));
+
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInitStaticFieldRuntimeEntry,
+                                1,
+                                locs());
+
+  __ addiu(SP, SP, Immediate(2 * kWordSize));  // Purge argument and result.
+
+  __ Bind(&no_call);
+}
+
+
 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2635,7 +2725,7 @@
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
       ConstantInstr* right_constant = right()->definition()->AsConstant();
-      summary->set_in(1, Location::Constant(right_constant->value()));
+      summary->set_in(1, Location::Constant(right_constant));
     } else {
       summary->set_in(1, Location::RequiresRegister());
     }
@@ -3463,6 +3553,18 @@
 }
 
 
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
+    Isolate* isolate, bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
@@ -3734,6 +3836,8 @@
 }
 
 
+DEFINE_UNIMPLEMENTED_INSTRUCTION(Int32ToDoubleInstr)
+
 
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
@@ -4457,86 +4561,15 @@
 }
 
 
-CompileType BoxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
-CompileType UnboxUint32Instr::ComputeType() const {
-  return CompileType::Int();
-}
-
-
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                       bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
-                                                               bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxUint32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
 
 
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index ccbab45..67d6d8e 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -253,6 +253,7 @@
 
 
 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(representation_ == kUnboxedDouble);
   // The register allocator drops constant definitions that have no uses.
   if (!locs()->out(0).IsInvalid()) {
     XmmRegister result = locs()->out(0).fpu_reg();
@@ -970,13 +971,11 @@
   // tagged (for all element sizes > 1).
   if (index_scale() == 1) {
     locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(
-                          index()->definition()->AsConstant()->value())
+                      ? Location::Constant(index()->definition()->AsConstant())
                       : Location::WritableRegister());
   } else {
     locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(
-                          index()->definition()->AsConstant()->value())
+                      ? Location::Constant(index()->definition()->AsConstant())
                       : Location::RequiresRegister());
   }
   if ((representation() == kUnboxedDouble)    ||
@@ -1113,13 +1112,11 @@
   // tagged (for all element sizes > 1).
   if (index_scale() == 1) {
     locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(
-                          index()->definition()->AsConstant()->value())
+                      ? Location::Constant(index()->definition()->AsConstant())
                       : Location::WritableRegister());
   } else {
     locs->set_in(1, CanBeImmediateIndex(index(), class_id())
-                      ? Location::Constant(
-                          index()->definition()->AsConstant()->value())
+                      ? Location::Constant(index()->definition()->AsConstant())
                       : Location::RequiresRegister());
   }
   switch (class_id()) {
@@ -1884,41 +1881,11 @@
                                    Label* done) {
   const Register kLengthReg = R10;
   const Register kElemTypeReg = RBX;
-  const intptr_t kArraySize = Array::InstanceSize(num_elements);
+  const intptr_t instance_size = 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));
-  }
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
+                      RAX,  // instance
+                      RCX);  // end address
 
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
@@ -2221,6 +2188,79 @@
 }
 
 
+LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
+    Isolate* isolate,
+    bool opt) const {
+  ASSERT(opt);
+  const intptr_t kNumInputs = 0;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  locs->set_temp(0, Location::RegisterLocation(R10));
+  locs->set_out(0, Location::RegisterLocation(RAX));
+  return locs;
+}
+
+
+class AllocateContextSlowPath : public SlowPathCode {
+ public:
+  explicit AllocateContextSlowPath(
+      AllocateUninitializedContextInstr* instruction)
+      : instruction_(instruction) { }
+
+  virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
+    __ Comment("AllocateContextSlowPath");
+    __ Bind(entry_label());
+
+    LocationSummary* locs = instruction_->locs();
+    locs->live_registers()->Remove(locs->out(0));
+
+    compiler->SaveLiveRegisters(locs);
+
+    __ LoadImmediate(R10, Immediate(instruction_->num_context_variables()), PP);
+    StubCode* stub_code = compiler->isolate()->stub_code();
+    const ExternalLabel label(stub_code->AllocateContextEntryPoint());
+    compiler->GenerateCall(instruction_->token_pos(),
+                           &label,
+                           RawPcDescriptors::kOther,
+                           locs);
+    ASSERT(instruction_->locs()->out(0).reg() == RAX);
+    compiler->RestoreLiveRegisters(instruction_->locs());
+    __ jmp(exit_label());
+  }
+
+ private:
+  AllocateUninitializedContextInstr* instruction_;
+};
+
+
+void AllocateUninitializedContextInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  ASSERT(compiler->is_optimizing());
+  Register temp = locs()->temp(0).reg();
+  Register result = locs()->out(0).reg();
+  // Try allocate the object.
+  AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  intptr_t instance_size = Context::InstanceSize(num_context_variables());
+
+  __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
+                      Assembler::kFarJump,
+                      result,  // instance
+                      temp);  // end address
+
+  // Setup up number of context variables field.
+  __ movq(FieldAddress(result, Context::num_variables_offset()),
+          Immediate(num_context_variables()));
+
+  // Setup isolate field.
+  __ movq(FieldAddress(result, Context::isolate_offset()),
+          Immediate(reinterpret_cast<intptr_t>(Isolate::Current())));
+
+  __ Bind(slow_path->exit_label());
+}
+
+
 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
@@ -2247,6 +2287,44 @@
 }
 
 
+LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
+  locs->set_in(0, Location::RegisterLocation(RAX));
+  locs->set_temp(0, Location::RegisterLocation(RCX));
+  return locs;
+}
+
+
+void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register field = locs()->in(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  Label call_runtime, no_call;
+
+  __ movq(temp, FieldAddress(field, Field::value_offset()));
+  __ CompareObject(temp, Object::sentinel(), PP);
+  __ j(EQUAL, &call_runtime);
+
+  __ CompareObject(temp, Object::transition_sentinel(), PP);
+  __ j(NOT_EQUAL, &no_call);
+
+  __ Bind(&call_runtime);
+  __ PushObject(Object::null_object(), PP);  // Make room for (unused) result.
+  __ pushq(field);
+  compiler->GenerateRuntimeCall(token_pos(),
+                                deopt_id(),
+                                kInitStaticFieldRuntimeEntry,
+                                1,
+                                locs());
+  __ Drop(2);  // Remove argument and unused result.
+  __ Bind(&no_call);
+}
+
+
 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -2572,7 +2650,7 @@
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
-    summary->set_in(1, Location::Constant(right_constant->value()));
+    summary->set_in(1, Location::Constant(right_constant));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   }
@@ -2584,7 +2662,7 @@
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
-      summary->set_in(1, Location::Constant(right_constant->value()));
+      summary->set_in(1, Location::Constant(right_constant));
       summary->set_temp(0, Location::RequiresRegister());
       summary->set_out(0, Location::SameAsFirstInput());
     } else {
@@ -3898,11 +3976,10 @@
   XmmRegister v0 = locs()->in(0).fpu_reg();
   XmmRegister v1 = locs()->in(1).fpu_reg();
   ASSERT(v0 == locs()->out(0).fpu_reg());
-  __ AddImmediate(RSP, Immediate(-16), PP);
-  __ movsd(Address(RSP, 0), v0);
-  __ movsd(Address(RSP, 8), v1);
-  __ movups(v0, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(16), PP);
+  // shufpd mask 0x0 results in:
+  // Lower 64-bits of v0 = Lower 64-bits of v0.
+  // Upper 64-bits of v0 = Lower 64-bits of v1.
+  __ shufpd(v0, v1, Immediate(0x0));
 }
 
 
@@ -4039,6 +4116,37 @@
 }
 
 
+LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 4;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_in(2, Location::RequiresRegister());
+  summary->set_in(3, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
+}
+
+
+void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register v0 = locs()->in(0).reg();
+  Register v1 = locs()->in(1).reg();
+  Register v2 = locs()->in(2).reg();
+  Register v3 = locs()->in(3).reg();
+  XmmRegister result = locs()->out(0).fpu_reg();
+  __ AddImmediate(RSP, Immediate(-4 * kInt32Size), PP);
+  __ movl(Address(RSP, 0 * kInt32Size), v0);
+  __ movl(Address(RSP, 1 * kInt32Size), v1);
+  __ movl(Address(RSP, 2 * kInt32Size), v2);
+  __ movl(Address(RSP, 3 * kInt32Size), v3);
+  __ movups(result, Address(RSP, 0));
+  __ AddImmediate(RSP, Immediate(4 * kInt32Size), PP);
+}
+
+
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
     Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
@@ -4514,6 +4622,9 @@
 }
 
 
+DEFINE_UNIMPLEMENTED_INSTRUCTION(Int32ToDoubleInstr)
+
+
 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5401,85 +5512,42 @@
 }
 
 
-CompileType BoxUint32Instr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-
-CompileType UnboxUint32Instr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxInt32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxUint32Instr)
+DEFINE_UNIMPLEMENTED_INSTRUCTION(UnboxedIntConverterInstr)
 
 
 LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
 }
 
 
 void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  ASSERT(value == locs()->out(0).reg());
 
-
-LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
-                                                     bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
-}
-
-
-LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
-                                                               bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-
-void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  if (value_cid == kSmiCid) {
+    __ SmiUntag(value);
+  } else {
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    __ testq(value, Immediate(kSmiTagMask));
+    __ j(NOT_ZERO, deopt);
+    __ SmiUntag(value);
+  }
 }
 
 
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 6c6f03a9..d0a58b7 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -14,75 +14,6 @@
 DEFINE_FLAG(bool, intrinsify, true, "Instrinsify when possible");
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
-static bool CompareNames(const Library& lib,
-                         const char* test_name,
-                         const char* name) {
-  static const char* kPrivateGetterPrefix = "get:_";
-  static const char* kPrivateSetterPrefix = "set:_";
-
-  if (test_name[0] == '_') {
-    if (name[0] != '_') {
-      return false;
-    }
-  } else if (strncmp(test_name,
-                     kPrivateGetterPrefix,
-                     strlen(kPrivateGetterPrefix)) == 0) {
-    if (strncmp(name,
-                kPrivateGetterPrefix,
-                strlen(kPrivateGetterPrefix)) != 0) {
-      return false;
-    }
-  } else if (strncmp(test_name,
-                     kPrivateSetterPrefix,
-                     strlen(kPrivateSetterPrefix)) == 0) {
-    if (strncmp(name,
-                kPrivateSetterPrefix,
-                strlen(kPrivateSetterPrefix)) != 0) {
-      return false;
-    }
-  } else {
-    return (strcmp(test_name, name) == 0);
-  }
-
-  // Check if the private class is member of the library and matches
-  // the test_class_name.
-  const String& test_str = String::Handle(String::New(test_name));
-  const String& test_str_with_key = String::Handle(
-      String::Concat(test_str, String::Handle(lib.private_key())));
-  if (strcmp(test_str_with_key.ToCString(), name) == 0) {
-    return true;
-  }
-
-  return false;
-}
-
-
-// Returns true if the function matches function_name and class_name, with
-// special recognition of corelib private classes.
-static bool TestFunction(const Library& lib,
-                         const Function& function,
-                         const char* function_class_name,
-                         const char* function_name,
-                         const char* test_class_name,
-                         const char* test_function_name) {
-  // If test_function_name starts with a '.' we use that to indicate
-  // that it is a named constructor in the class. Therefore, if
-  // the class matches and the rest of the method name starting with
-  // the dot matches, we have found a match.
-  // We do not store the entire factory constructor name with the class
-  // (e.g: _GrowableList.withData) because the actual function name
-  //  that we see here includes the private key.
-  if (test_function_name[0] == '.') {
-    function_name = strstr(function_name, ".");
-    if (function_name == NULL) {
-      return false;
-    }
-  }
-  return CompareNames(lib, test_class_name, function_class_name) &&
-         CompareNames(lib, test_function_name, function_name);
-}
-
-
 bool Intrinsifier::CanIntrinsify(const Function& function) {
   if (!FLAG_intrinsify) return false;
   if (function.IsClosureFunction()) return false;
@@ -127,12 +58,7 @@
   lib = Library::CoreLibrary();
   ASSERT(!lib.IsNull());
   CORE_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-
-  // Integer intrinsics are in the core library, but we don't want to intrinsify
-  // when Smi > 32 bits if we are looking for javascript integer overflow.
-  if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
-    CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
-  }
+  CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
 
   // Set up all math lib functions that can be intrisified.
   lib = Library::MathLibrary();
@@ -156,34 +82,38 @@
 void Intrinsifier::Intrinsify(const Function& function, Assembler* assembler) {
   if (!CanIntrinsify(function)) return;
 
-  const char* function_name = String::Handle(function.name()).ToCString();
-  const Class& function_class = Class::Handle(function.Owner());
-  const char* class_name = String::Handle(function_class.Name()).ToCString();
-  const Library& lib = Library::Handle(function_class.library());
+#define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
+    case MethodRecognizer::k##enum_name:                                       \
+      ASSERT(function.CheckSourceFingerprint(fp));                             \
+      assembler->Comment("Intrinsic");                                         \
+      enum_name(assembler);                                                    \
+      break;
 
-#define FIND_INTRINSICS(test_class_name, test_function_name, destination, fp)  \
-  if (TestFunction(lib, function,                                              \
-                   class_name, function_name,                                  \
-                   #test_class_name, #test_function_name)) {                   \
-    ASSERT(function.CheckSourceFingerprint(fp));                               \
-    assembler->Comment("Intrinsic");                                           \
-    destination(assembler);                                                    \
-    return;                                                                    \
-  }                                                                            \
-
-  if (lib.raw() == Library::CoreLibrary()) {
-    CORE_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
-    if (!FLAG_throw_on_javascript_int_overflow || (Smi::kBits < 32)) {
-      CORE_INTEGER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+  if (FLAG_throw_on_javascript_int_overflow && (Smi::kBits >= 32)) {
+    // Integer intrinsics are in the core library, but we don't want to
+    // intrinsify when Smi > 32 bits if we are looking for javascript integer
+    // overflow.
+    switch (function.recognized_kind()) {
+      CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
+      MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
+      TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
+      PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+      default:
+        break;
     }
-  } else if (lib.raw() == Library::TypedDataLibrary()) {
-    TYPED_DATA_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
-  } else if (lib.raw() == Library::MathLibrary()) {
-    MATH_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
-  } else if (lib.raw() == Library::ProfilerLibrary()) {
-    PROFILER_LIB_INTRINSIC_LIST(FIND_INTRINSICS);
+  } else {
+    switch (function.recognized_kind()) {
+      CORE_LIB_INTRINSIC_LIST(EMIT_CASE);
+      CORE_INTEGER_LIB_INTRINSIC_LIST(EMIT_CASE);
+      MATH_LIB_INTRINSIC_LIST(EMIT_CASE);
+      TYPED_DATA_LIB_INTRINSIC_LIST(EMIT_CASE);
+      PROFILER_LIB_INTRINSIC_LIST(EMIT_CASE);
+      default:
+        UNREACHABLE();
+        break;
+    }
   }
-#undef FIND_INTRINSICS
+#undef EMIT_INTRINSIC
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index fe0aa2a..7c7671b 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -7,144 +7,10 @@
 #define VM_INTRINSIFIER_H_
 
 #include "vm/allocation.h"
+#include "vm/method_recognizer.h"
 
 namespace dart {
 
-// List of intrinsics:
-// (class-name, function-name, intrinsification method, fingerprint).
-//
-// When adding a new function for intrinsification add a 0 as fingerprint,
-// build and run to get the correct fingerprint from the mismatch error.
-#define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, 105519892)                                         \
-  V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
-  V(_Double, >, Double_greaterThan, 381325711)                                 \
-  V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
-  V(_Double, <, Double_lessThan, 2080387973)                                   \
-  V(_Double, <=, Double_lessEqualThan, 106225572)                              \
-  V(_Double, ==, Double_equal, 2093918133)                                     \
-  V(_Double, +, Double_add, 1646350451)                                        \
-  V(_Double, -, Double_sub, 1477459276)                                        \
-  V(_Double, *, Double_mul, 1334580777)                                        \
-  V(_Double, /, Double_div, 1938037155)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 843050033)                            \
-  V(_Double, get:isNegative, Double_getIsNegative, 1637875580)                 \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483)               \
-  V(_Double, .fromInteger, Double_fromInteger, 999771940)                      \
-  V(_List, get:length, Array_getLength, 1181352729)                            \
-  V(_List, [], Array_getIndexed, 795612476)                                    \
-  V(_List, []=, Array_setIndexed, 1288827575)                                  \
-  V(_GrowableList, .withData, GrowableList_Allocate, 732923072)                \
-  V(_GrowableList, get:length, GrowableList_getLength, 778505107)              \
-  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 555140075)         \
-  V(_GrowableList, [], GrowableList_getIndexed, 919108233)                     \
-  V(_GrowableList, []=, GrowableList_setIndexed, 1218649853)                   \
-  V(_GrowableList, _setLength, GrowableList_setLength, 89389299)               \
-  V(_GrowableList, _setData, GrowableList_setData, 2126927509)                 \
-  V(_GrowableList, add, GrowableList_add, 1899133961)                          \
-  V(_ImmutableList, [], ImmutableList_getIndexed, 1990177341)                  \
-  V(_ImmutableList, get:length, ImmutableList_getLength, 274917727)            \
-  V(Object, ==, Object_equal, 1068471689)                                      \
-  V(_StringBase, get:hashCode, String_getHashCode, 2102906241)                 \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 49873871)                     \
-  V(_StringBase, get:length, String_getLength, 784399628)                      \
-  V(_StringBase, codeUnitAt, String_codeUnitAt, 397735324)                     \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929)       \
-  V(_OneByteString, _substringUncheckedNative,                                 \
-      OneByteString_substringUnchecked, 1527498975)                            \
-  V(_OneByteString, _setAt, OneByteString_setAt, 468605749)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 2035417022)             \
-  V(_OneByteString, ==, OneByteString_equality, 1727047023)                    \
-  V(_TwoByteString, ==, TwoByteString_equality, 951149689)                     \
-
-
-#define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
-  V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
-    438687793)                                                                 \
-  V(_IntegerImplementation, +, Integer_add, 837070328)                         \
-  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
-    562800077)                                                                 \
-  V(_IntegerImplementation, -, Integer_sub, 1904782019)                        \
-  V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
-    67891834)                                                                  \
-  V(_IntegerImplementation, *, Integer_mul, 1012952097)                        \
-  V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
-    93478264)                                                                  \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 724644222)                \
-  V(_IntegerImplementation, unary-, Integer_negate, 2095203689)                \
-  V(_IntegerImplementation, _bitAndFromInteger,                                \
-    Integer_bitAndFromInteger, 504496713)                                      \
-  V(_IntegerImplementation, &, Integer_bitAnd, 347192674)                      \
-  V(_IntegerImplementation, _bitOrFromInteger,                                 \
-    Integer_bitOrFromInteger, 1763728073)                                      \
-  V(_IntegerImplementation, |, Integer_bitOr, 1293445202)                      \
-  V(_IntegerImplementation, _bitXorFromInteger,                                \
-    Integer_bitXorFromInteger, 281425907)                                      \
-  V(_IntegerImplementation, ^, Integer_bitXor, 2139935734)                     \
-  V(_IntegerImplementation,                                                    \
-    _greaterThanFromInteger,                                                   \
-    Integer_greaterThanFromInt, 787426822)                                     \
-  V(_IntegerImplementation, >, Integer_greaterThan, 123961041)                 \
-  V(_IntegerImplementation, ==, Integer_equal, 1423724294)                     \
-  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
-    1790821042)                                                                \
-  V(_IntegerImplementation, <, Integer_lessThan, 425560117)                    \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 1512735828)             \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 668293748)           \
-  V(_IntegerImplementation, <<, Integer_shl, 34265041)                         \
-  V(_IntegerImplementation, >>, Integer_sar, 1797129864)                       \
-  V(_Double, toInt, Double_toInt, 1547535151)
-
-
-#define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, Math_sqrt, 101545548)                                            \
-  V(_Random, _nextState, Random_nextState, 55890711)                           \
-
-
-#define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(_TypedList, get:length, TypedData_getLength, 522565357)                    \
-  V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819)                     \
-  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760)                   \
-  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668)      \
-  V(_Int16Array, _new, TypedData_Int16Array_new, 1879541015)                   \
-  V(_Uint16Array, _new, TypedData_Uint16Array_new, 189496401)                  \
-  V(_Int32Array, _new, TypedData_Int32Array_new, 1725327048)                   \
-  V(_Uint32Array, _new, TypedData_Uint32Array_new, 10306485)                   \
-  V(_Int64Array, _new, TypedData_Int64Array_new, 1299501918)                   \
-  V(_Uint64Array, _new, TypedData_Uint64Array_new, 1635318703)                 \
-  V(_Float32Array, _new, TypedData_Float32Array_new, 577737480)                \
-  V(_Float64Array, _new, TypedData_Float64Array_new, 645355686)                \
-  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 596639418)            \
-  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 496358233)                \
-  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1506975080)           \
-  V(_Int8Array, ., TypedData_Int8Array_factory, 1499010120)                    \
-  V(_Uint8Array, ., TypedData_Uint8Array_factory, 354210806)                   \
-  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 231626935)     \
-  V(_Int16Array, ., TypedData_Int16Array_factory, 1044203454)                  \
-  V(_Uint16Array, ., TypedData_Uint16Array_factory, 616427808)                 \
-  V(_Int32Array, ., TypedData_Int32Array_factory, 26656923)                    \
-  V(_Uint32Array, ., TypedData_Uint32Array_factory, 297463966)                 \
-  V(_Int64Array, ., TypedData_Int64Array_factory, 105050331)                   \
-  V(_Uint64Array, ., TypedData_Uint64Array_factory, 1469861670)                \
-  V(_Float32Array, ., TypedData_Float32Array_factory, 105860920)               \
-  V(_Float64Array, ., TypedData_Float64Array_factory, 342242776)               \
-  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993)          \
-  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417)               \
-  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575)           \
-  V(_Uint8Array, [], Uint8Array_getIndexed, 16125140)                          \
-  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 1678777951)        \
-  V(_Float64Array, [], Float64Array_getIndexed, 1779054297)                    \
-  V(_Float64Array, []=, Float64Array_setIndexed, 243929230)                    \
-
-
-#define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, 370414636)                     \
-  V(::, _getDefaultTag, UserTag_defaultTag, 1159885970)                        \
-  V(::, _getCurrentTag, Profiler_getCurrentTag, 1182126114)                    \
-
-// TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
-//   _FixedSizeArrayIterator, moveNext.
-
 // Forward declarations.
 class Assembler;
 class Function;
@@ -155,18 +21,15 @@
   // completely and the code does not need to be generated (i.e., no slow
   // path possible).
   static void Intrinsify(const Function& function, Assembler* assembler);
-  static bool CanIntrinsify(const Function& function);
   static void InitializeState();
 
  private:
+  static bool CanIntrinsify(const Function& function);
+
 #define DECLARE_FUNCTION(test_class_name, test_function_name, destination, fp) \
   static void destination(Assembler* assembler);
 
-  CORE_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
-  CORE_INTEGER_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
-  MATH_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
-  TYPED_DATA_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
-  PROFILER_LIB_INTRINSIC_LIST(DECLARE_FUNCTION)
+  ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
 
 #undef DECLARE_FUNCTION
 };
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index c026751..59ca32d 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -22,19 +22,19 @@
 #define __ assembler->
 
 
-void Intrinsifier::Array_getLength(Assembler* assembler) {
+void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, Array::length_offset()));
   __ Ret();
 }
 
 
-void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  Array_getLength(assembler);
+void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
+  ObjectArrayLength(assembler);
 }
 
 
-void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
@@ -56,8 +56,8 @@
 }
 
 
-void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  Array_getIndexed(assembler);
+void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
+  ObjectArrayGetIndexed(assembler);
 }
 
 
@@ -75,7 +75,7 @@
 
 // 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) {
+void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   Label fall_through;
 
   if (FLAG_enable_type_checks) {
@@ -137,46 +137,16 @@
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
-void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
   // 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());
-  __ ldr(R0, Address(R2, 0));
-  __ AddImmediate(R1, R0, fixed_size);
-
-  // 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());
-  __ 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, kHeapObjectTag);
-
-  // Initialize the tags.
-  // R0: new growable array object start as a tagged pointer.
+  // Try allocating in new space.
   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);
-  __ str(R1, FieldAddress(R0, GrowableObjectArray::tags_offset()));
+      Isolate::Current()->object_store()->growable_object_array_class());
+  __ TryAllocate(cls, &fall_through, R0, R1);
 
   // Store backing array object in growable array object.
   __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
@@ -197,21 +167,20 @@
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0);
   __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ UpdateAllocationStats(kGrowableObjectArrayCid, R1);
   __ Ret();  // Returns the newly allocated object in R0.
 
   __ Bind(&fall_through);
 }
 
 
-void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, GrowableObjectArray::length_offset()));
   __ Ret();
 }
 
 
-void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));
   __ ldr(R0, FieldAddress(R0, Array::length_offset()));
@@ -219,7 +188,7 @@
 }
 
 
-void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
@@ -244,7 +213,7 @@
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+2), index (+1), value (+0).
-void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -272,7 +241,7 @@
 // Set length of growable object array. The length cannot
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
-void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Length value.
   __ tst(R1, Operand(kSmiTagMask));  // Check for Smi.
@@ -284,7 +253,7 @@
 
 // Set data of growable object array.
 // On stack: growable array (+1), data (+0).
-void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetData(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -307,7 +276,7 @@
 // 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) {
+void Intrinsifier::GrowableArray_add(Assembler* assembler) {
   // In checked mode we need to type-check the incoming argument.
   if (FLAG_enable_type_checks) {
     return;
@@ -424,14 +393,14 @@
 
 
 // Gets the length of a TypedData.
-void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+void Intrinsifier::TypedDataLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, TypedData::length_offset()));
   __ Ret();
 }
 
 
-void Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
@@ -452,7 +421,7 @@
 }
 
 
-void Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
@@ -475,7 +444,10 @@
 }
 
 
-void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
+  if (!TargetCPUFeatures::vfp_supported()) {
+    return;
+  }
   Label fall_through;
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
@@ -510,7 +482,10 @@
 }
 
 
-void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
+  if (!TargetCPUFeatures::vfp_supported()) {
+    return;
+  }
   Label fall_through;
   __ ldr(R0, Address(SP, + 1 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 2 * kWordSize));  // Array.
@@ -623,22 +598,23 @@
 
 
 void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
-  Label fall_through;
-
-  TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
-  __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
-
   if (TargetCPUFeatures::arm_version() == ARMv7) {
+    Label fall_through;
+    TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
+    __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
     __ smull(R0, IP, R0, R1);  // IP:R0 <- R0 * R1.
     __ cmp(IP, Operand(R0, ASR, 31));
     __ bx(LR, EQ);
-  } else {
+    __ Bind(&fall_through);  // Fall through on overflow.
+  } else if (TargetCPUFeatures::can_divide()) {
+    Label fall_through;
+    TestBothArgumentsSmis(assembler, &fall_through);  // checks two smis
+    __ SmiUntag(R0);  // Untags R6. We only want result shifted by one.
     __ CheckMultSignedOverflow(R0, R1, IP, D0, D1, &fall_through);
     __ mul(R0, R0, R1);
     __ Ret();
+    __ Bind(&fall_through);  // Fall through on overflow.
   }
-
-  __ Bind(&fall_through);  // Fall through on overflow.
 }
 
 
@@ -704,6 +680,9 @@
 //    }
 //  }
 void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
+  if (!TargetCPUFeatures::can_divide()) {
+    return;
+  }
   // Check to see if we have integer division
   Label fall_through;
   __ ldr(R1, Address(SP, + 0 * kWordSize));
@@ -735,6 +714,9 @@
 
 
 void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
+  if (!TargetCPUFeatures::can_divide()) {
+    return;
+  }
   // Check to see if we have integer division
   Label fall_through;
 
@@ -1214,7 +1196,7 @@
 }
 
 
-void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     Label fall_through;
 
@@ -1279,7 +1261,7 @@
 }
 
 
-void Intrinsifier::Double_toInt(Assembler* assembler) {
+void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     Label fall_through;
 
@@ -1304,7 +1286,7 @@
 }
 
 
-void Intrinsifier::Math_sqrt(Assembler* assembler) {
+void Intrinsifier::MathSqrt(Assembler* assembler) {
   if (TargetCPUFeatures::vfp_supported()) {
     Label fall_through, is_smi, double_op;
     TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
@@ -1372,7 +1354,7 @@
 }
 
 
-void Intrinsifier::Object_equal(Assembler* assembler) {
+void Intrinsifier::ObjectEquals(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
   __ cmp(R0, Operand(R1));
@@ -1390,14 +1372,14 @@
 }
 
 
-void Intrinsifier::String_getLength(Assembler* assembler) {
+void Intrinsifier::StringBaseLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::length_offset()));
   __ Ret();
 }
 
 
-void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Index.
@@ -1429,7 +1411,50 @@
 }
 
 
-void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
+  Label fall_through, try_two_byte_string;
+
+  __ ldr(R1, Address(SP, 0 * kWordSize));  // Index.
+  __ ldr(R0, Address(SP, 1 * kWordSize));  // String.
+  __ tst(R1, Operand(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, R3);
+  __ b(&try_two_byte_string, NE);
+  __ SmiUntag(R1);
+  __ AddImmediate(R0, OneByteString::data_offset() - kHeapObjectTag);
+  __ ldrb(R1, Address(R0, R1));
+  __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols);
+  __ b(&fall_through, GE);
+  __ LoadImmediate(R0,
+                   reinterpret_cast<uword>(Symbols::PredefinedAddress()));
+  __ AddImmediate(R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ ldr(R0, Address(R0, R1, LSL, 2));
+  __ Ret();
+
+  __ Bind(&try_two_byte_string);
+  __ CompareClassId(R0, kTwoByteStringCid, R3);
+  __ b(&fall_through, NE);
+  ASSERT(kSmiTagShift == 1);
+  __ AddImmediate(R0, TwoByteString::data_offset() - kHeapObjectTag);
+  __ ldrh(R1, Address(R0, R1));
+  __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols);
+  __ b(&fall_through, GE);
+  __ LoadImmediate(R0,
+                   reinterpret_cast<uword>(Symbols::PredefinedAddress()));
+  __ AddImmediate(R0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ ldr(R0, Address(R0, R1, LSL, 2));
+  __ Ret();
+
+  __ Bind(&fall_through);
+}
+
+
+void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::length_offset()));
   __ cmp(R0, Operand(Smi::RawValue(0)));
@@ -1634,7 +1659,7 @@
 }
 
 
-void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
   __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
   __ ldr(R0, Address(SP, 2 * kWordSize));  // OneByteString.
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index ef10775..2c27c36 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -17,22 +17,23 @@
 
 DECLARE_FLAG(bool, enable_type_checks);
 
+
 #define __ assembler->
 
 
-void Intrinsifier::Array_getLength(Assembler* assembler) {
+void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, Array::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  Array_getLength(assembler);
+void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
+  ObjectArrayLength(assembler);
 }
 
 
-void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
@@ -55,8 +56,8 @@
 }
 
 
-void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  Array_getIndexed(assembler);
+void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
+  ObjectArrayGetIndexed(assembler);
 }
 
 
@@ -74,7 +75,7 @@
 
 // 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) {
+void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   Label fall_through;
 
   if (FLAG_enable_type_checks) {
@@ -137,46 +138,16 @@
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
-void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
   // 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.
+  // Try allocating in new space.
   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()));
+      Isolate::Current()->object_store()->growable_object_array_class());
+  __ TryAllocate(cls, &fall_through, R0, R1, kNoPP);
 
   // Store backing array object in growable array object.
   __ ldr(R1, Address(SP, kArrayOffset));  // Data argument.
@@ -197,21 +168,20 @@
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0, kNoPP);
   __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ UpdateAllocationStats(kGrowableObjectArrayCid, kNoPP);
   __ ret();  // Returns the newly allocated object in R0.
 
   __ Bind(&fall_through);
 }
 
 
-void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, GrowableObjectArray::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, GrowableObjectArray::data_offset()));
   __ ldr(R0, FieldAddress(R0, Array::length_offset()));
@@ -219,7 +189,7 @@
 }
 
 
-void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index
@@ -245,7 +215,7 @@
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+2), index (+1), value (+0).
-void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -275,7 +245,7 @@
 // Set length of growable object array. The length cannot
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
-void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Length value.
@@ -290,7 +260,7 @@
 
 // Set data of growable object array.
 // On stack: growable array (+1), data (+0).
-void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetData(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -313,7 +283,7 @@
 // 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) {
+void Intrinsifier::GrowableArray_add(Assembler* assembler) {
   // In checked mode we need to type-check the incoming argument.
   if (FLAG_enable_type_checks) {
     return;
@@ -347,14 +317,14 @@
 
 
 // Gets the length of a TypedData.
-void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+void Intrinsifier::TypedDataLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, TypedData::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
@@ -376,7 +346,7 @@
 }
 
 
-void Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
@@ -400,7 +370,7 @@
 }
 
 
-void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, + 0 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 1 * kWordSize));  // Array.
@@ -435,7 +405,7 @@
 }
 
 
-void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
   Label fall_through;
   __ ldr(R0, Address(SP, + 1 * kWordSize));  // Index.
   __ ldr(R1, Address(SP, + 2 * kWordSize));  // Array.
@@ -1124,7 +1094,7 @@
 }
 
 
-void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, 0 * kWordSize));
@@ -1184,7 +1154,7 @@
 }
 
 
-void Intrinsifier::Double_toInt(Assembler* assembler) {
+void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   Label fall_through;
 
   __ ldr(R0, Address(SP, 0 * kWordSize));
@@ -1206,7 +1176,7 @@
 }
 
 
-void Intrinsifier::Math_sqrt(Assembler* assembler) {
+void Intrinsifier::MathSqrt(Assembler* assembler) {
   Label fall_through, is_smi, double_op;
   TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Argument is double and is in R0.
@@ -1263,7 +1233,7 @@
 }
 
 
-void Intrinsifier::Object_equal(Assembler* assembler) {
+void Intrinsifier::ObjectEquals(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R1, Address(SP, 1 * kWordSize));
   __ cmp(R0, Operand(R1));
@@ -1286,14 +1256,14 @@
 }
 
 
-void Intrinsifier::String_getLength(Assembler* assembler) {
+void Intrinsifier::StringBaseLength(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Index.
@@ -1325,7 +1295,52 @@
 }
 
 
-void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
+  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(R1, Address(R0, R1), kUnsignedByte);
+  __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols, kNoPP);
+  __ b(&fall_through, GE);
+  __ LoadImmediate(
+      R0, reinterpret_cast<uword>(Symbols::PredefinedAddress()), kNoPP);
+  __ AddImmediate(
+      R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize, kNoPP);
+  __ ldr(R0, Address(R0, R1, UXTX, Address::Scaled));
+  __ 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(R1, Address(R0, R1), kUnsignedHalfword);
+  __ CompareImmediate(R1, Symbols::kNumberOfOneCharCodeSymbols, kNoPP);
+  __ b(&fall_through, GE);
+  __ LoadImmediate(
+      R0, reinterpret_cast<uword>(Symbols::PredefinedAddress()), kNoPP);
+  __ AddImmediate(
+      R0, R0, Symbols::kNullCharCodeSymbolOffset * kWordSize, kNoPP);
+  __ ldr(R0, Address(R0, R1, UXTX, Address::Scaled));
+  __ ret();
+
+  __ Bind(&fall_through);
+}
+
+
+void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ ldr(R0, FieldAddress(R0, String::length_offset()));
   __ cmp(R0, Operand(Smi::RawValue(0)));
@@ -1533,7 +1548,7 @@
 }
 
 
-void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
   __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
   __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
   __ ldr(R0, Address(SP, 2 * kWordSize));  // OneByteString.
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 288373a..97e6a34 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -29,19 +29,19 @@
 #define __ assembler->
 
 
-void Intrinsifier::Array_getLength(Assembler* assembler) {
+void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  Array_getLength(assembler);
+void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
+  ObjectArrayLength(assembler);
 }
 
 
-void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
@@ -59,8 +59,8 @@
 }
 
 
-void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  Array_getIndexed(assembler);
+void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
+  ObjectArrayGetIndexed(assembler);
 }
 
 
@@ -78,7 +78,7 @@
 
 // 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) {
+void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   Label fall_through;
   if (FLAG_enable_type_checks) {
     const intptr_t type_args_field_offset =
@@ -135,7 +135,7 @@
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
-void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
   // This snippet of inlined code uses the following registers:
   // EAX, EBX
   // and the newly allocated object is returned in EAX.
@@ -143,37 +143,10 @@
   const intptr_t kArrayOffset = 1 * 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();
-
-  __ movl(EAX, Address::Absolute(heap->TopAddress()));
-  __ leal(EBX, Address(EAX, fixed_size));
-
-  // Check if the allocation fits into the remaining space.
-  // EAX: potential new backing array object start.
-  // EBX: potential next object start.
-  __ 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));
-
-  // Initialize the tags.
-  // EAX: new growable array object start as a tagged pointer.
+  // Try allocating in new space.
   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);
-  __ movl(FieldAddress(EAX, GrowableObjectArray::tags_offset()),
-          Immediate(tags));
+      Isolate::Current()->object_store()->growable_object_array_class());
+  __ TryAllocate(cls, &fall_through, Assembler::kNearJump, EAX, EBX);
 
   // Store backing array object in growable array object.
   __ movl(EBX, Address(ESP, kArrayOffset));  // data argument.
@@ -194,7 +167,6 @@
   // Set the length field in the growable array object to 0.
   __ movl(FieldAddress(EAX, GrowableObjectArray::length_offset()),
           Immediate(0));
-  __ UpdateAllocationStats(kGrowableObjectArrayCid, EBX);
   __ ret();  // returns the newly allocated object in EAX.
 
   __ Bind(&fall_through);
@@ -203,7 +175,7 @@
 
 // Get length of growable object array.
 // On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
   __ ret();
@@ -212,7 +184,7 @@
 
 // Get capacity of growable object array.
 // On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(EAX, FieldAddress(EAX, GrowableObjectArray::data_offset()));
   __ movl(EAX, FieldAddress(EAX, Array::length_offset()));
@@ -222,7 +194,7 @@
 
 // Access growable object array at specified index.
 // On stack: growable array (+2), index (+1), return-address (+0).
-void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // GrowableArray.
@@ -244,7 +216,7 @@
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+3), index (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -272,7 +244,7 @@
 // Set length of growable object array. The length cannot
 // be greater than the length of the data container.
 // On stack: growable array (+2), length (+1), return-address (+0).
-void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
   Label fall_through;
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Growable array.
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Length value.
@@ -286,7 +258,7 @@
 
 // Set data of growable object array.
 // On stack: growable array (+2), data (+1), return-address (+0).
-void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetData(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -309,7 +281,7 @@
 // Add an element to growable array if it doesn't need to grow, otherwise
 // call into regular code.
 // On stack: growable array (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableList_add(Assembler* assembler) {
+void Intrinsifier::GrowableArray_add(Assembler* assembler) {
   // In checked mode we need to type-check the incoming argument.
   if (FLAG_enable_type_checks) return;
 
@@ -435,14 +407,14 @@
 
 
 // Gets the length of a TypedData.
-void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+void Intrinsifier::TypedDataLength(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ movl(EAX, FieldAddress(EAX, TypedData::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
@@ -461,7 +433,7 @@
 }
 
 
-void Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
@@ -481,7 +453,7 @@
 }
 
 
-void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Array.
@@ -514,7 +486,7 @@
 }
 
 
-void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 3 * kWordSize));  // Array.
@@ -1231,7 +1203,7 @@
 }
 
 
-void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   Label fall_through;
   __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ testl(EAX, Immediate(kSmiTagMask));
@@ -1290,7 +1262,7 @@
 }
 
 
-void Intrinsifier::Double_toInt(Assembler* assembler) {
+void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
   __ cvttsd2si(EAX, XMM0);
@@ -1306,7 +1278,7 @@
 
 
 // Argument type is not known
-void Intrinsifier::Math_sqrt(Assembler* assembler) {
+void Intrinsifier::MathSqrt(Assembler* assembler) {
   Label fall_through, is_smi, double_op;
   TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Argument is double and is in EAX.
@@ -1370,7 +1342,7 @@
 
 
 // Identity comparison.
-void Intrinsifier::Object_equal(Assembler* assembler) {
+void Intrinsifier::ObjectEquals(Assembler* assembler) {
   Label is_true;
   __ movl(EAX, Address(ESP, + 1 * kWordSize));
   __ cmpl(EAX, Address(ESP, + 2 * kWordSize));
@@ -1395,14 +1367,14 @@
 }
 
 
-void Intrinsifier::String_getLength(Assembler* assembler) {
+void Intrinsifier::StringBaseLength(Assembler* assembler) {
   __ movl(EAX, Address(ESP, + 1 * kWordSize));  // String object.
   __ movl(EAX, FieldAddress(EAX, String::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
   __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // String.
@@ -1423,7 +1395,7 @@
   __ CompareClassId(EAX, kTwoByteStringCid, EDI);
   __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);
   ASSERT(kSmiTagShift == 1);
-  __ movzxw(EAX, FieldAddress(EAX, EBX, TIMES_1, OneByteString::data_offset()));
+  __ movzxw(EAX, FieldAddress(EAX, EBX, TIMES_1, TwoByteString::data_offset()));
   __ SmiTag(EAX);
   __ ret();
 
@@ -1431,7 +1403,50 @@
 }
 
 
-void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
+  Label fall_through, try_two_byte_string;
+  __ movl(EBX, Address(ESP, + 1 * kWordSize));  // Index.
+  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // String.
+  __ testl(EBX, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
+  // Range check.
+  __ cmpl(EBX, FieldAddress(EAX, String::length_offset()));
+  // Runtime throws exception.
+  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
+  __ CompareClassId(EAX, kOneByteStringCid, EDI);
+  __ j(NOT_EQUAL, &try_two_byte_string, Assembler::kNearJump);
+  __ SmiUntag(EBX);
+  __ movzxb(EBX, FieldAddress(EAX, EBX, TIMES_1, OneByteString::data_offset()));
+  __ cmpl(EBX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
+  __ j(GREATER_EQUAL, &fall_through);
+  __ movl(EAX,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movl(EAX, Address(EAX,
+                       EBX,
+                       TIMES_4,
+                       Symbols::kNullCharCodeSymbolOffset * kWordSize));
+  __ ret();
+
+  __ Bind(&try_two_byte_string);
+  __ CompareClassId(EAX, kTwoByteStringCid, EDI);
+  __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);
+  ASSERT(kSmiTagShift == 1);
+  __ movzxw(EBX, FieldAddress(EAX, EBX, TIMES_1, TwoByteString::data_offset()));
+  __ cmpl(EBX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
+  __ j(GREATER_EQUAL, &fall_through);
+  __ movl(EAX,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movl(EAX, Address(EAX,
+                       EBX,
+                       TIMES_4,
+                       Symbols::kNullCharCodeSymbolOffset * kWordSize));
+  __ ret();
+
+  __ Bind(&fall_through);
+}
+
+
+void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   Label is_true;
   // Get length.
   __ movl(EAX, Address(ESP, + 1 * kWordSize));  // String object.
@@ -1642,7 +1657,7 @@
 }
 
 
-void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
   __ movl(ECX, Address(ESP, + 1 * kWordSize));  // Value.
   __ movl(EBX, Address(ESP, + 2 * kWordSize));  // Index.
   __ movl(EAX, Address(ESP, + 3 * kWordSize));  // OneByteString.
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index de67175..06ee97f 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -17,23 +17,22 @@
 
 DECLARE_FLAG(bool, enable_type_checks);
 
-
 #define __ assembler->
 
 
-void Intrinsifier::Array_getLength(Assembler* assembler) {
+void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
   __ lw(V0, Address(SP, 0 * kWordSize));
   __ Ret();
   __ delay_slot()->lw(V0, FieldAddress(V0, Array::length_offset()));
 }
 
 
-void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  Array_getLength(assembler);
+void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
+  ObjectArrayLength(assembler);
 }
 
 
-void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Index
@@ -56,8 +55,8 @@
 }
 
 
-void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  Array_getIndexed(assembler);
+void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
+  ObjectArrayGetIndexed(assembler);
 }
 
 
@@ -75,7 +74,7 @@
 
 // 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) {
+void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   Label fall_through;
 
   if (FLAG_enable_type_checks) {
@@ -135,45 +134,16 @@
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
-void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
   // The newly allocated object is returned in V0.
   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(T2, heap->TopAddress());
-  __ lw(V0, Address(T2, 0));
-  __ AddImmediate(T1, V0, fixed_size);
-
-  // Check if the allocation fits into the remaining space.
-  // V0: potential new backing array object start.
-  // T1: potential next object start.
-  __ LoadImmediate(T3, heap->EndAddress());
-  __ lw(T3, Address(T3, 0));
-  __ BranchUnsignedGreaterEqual(T1, T3, &fall_through);
-
-  // Successfully allocated the object(s), now update top to point to
-  // next object start and initialize the object.
-  __ sw(T1, Address(T2, 0));
-  __ AddImmediate(V0, kHeapObjectTag);
-
-  // Initialize the tags.
-  // V0: new growable array object start as a tagged pointer.
+  // Try allocating in new space.
   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(T1, tags);
-  __ sw(T1, FieldAddress(V0, GrowableObjectArray::tags_offset()));
+      Isolate::Current()->object_store()->growable_object_array_class());
+  __ TryAllocate(cls, &fall_through, V0, T1);
 
   // Store backing array object in growable array object.
   __ lw(T1, Address(SP, kArrayOffset));  // Data argument.
@@ -190,7 +160,6 @@
       V0,
       FieldAddress(V0, GrowableObjectArray::type_arguments_offset()),
       T1);
-  __ UpdateAllocationStats(kGrowableObjectArrayCid, T1);
   // Set the length field in the growable array object to 0.
   __ Ret();  // Returns the newly allocated object in V0.
   __ delay_slot()->sw(ZR,
@@ -200,7 +169,7 @@
 }
 
 
-void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
   __ lw(V0, Address(SP, 0 * kWordSize));
   __ Ret();
   __ delay_slot()->lw(V0,
@@ -208,7 +177,7 @@
 }
 
 
-void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
   __ lw(V0, Address(SP, 0 * kWordSize));
   __ lw(V0, FieldAddress(V0, GrowableObjectArray::data_offset()));
   __ Ret();
@@ -216,7 +185,7 @@
 }
 
 
-void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, 0 * kWordSize));  // Index
@@ -243,7 +212,7 @@
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+2), index (+1), value (+0).
-void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -273,7 +242,7 @@
 // Set length of growable object array. The length cannot
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
-void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
   Label fall_through;
   __ lw(T1, Address(SP, 0 * kWordSize));  // Length value.
   __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
@@ -288,7 +257,7 @@
 
 // Set data of growable object array.
 // On stack: growable array (+1), data (+0).
-void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetData(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -311,7 +280,7 @@
 // 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) {
+void Intrinsifier::GrowableArray_add(Assembler* assembler) {
   // In checked mode we need to type-check the incoming argument.
   if (FLAG_enable_type_checks) return;
   Label fall_through;
@@ -430,14 +399,14 @@
 
 
 // Gets the length of a TypedData.
-void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+void Intrinsifier::TypedDataLength(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ Ret();
   __ delay_slot()->lw(V0, FieldAddress(T0, TypedData::length_offset()));
 }
 
 
-void Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
@@ -460,7 +429,7 @@
 }
 
 
-void Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
@@ -484,7 +453,7 @@
 }
 
 
-void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, + 0 * kWordSize));  // Index.
@@ -519,7 +488,7 @@
 }
 
 
-void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, + 1 * kWordSize));  // Index.
@@ -1252,7 +1221,7 @@
 }
 
 
-void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   Label fall_through;
 
   __ lw(T0, Address(SP, 0 * kWordSize));
@@ -1323,7 +1292,7 @@
 }
 
 
-void Intrinsifier::Double_toInt(Assembler* assembler) {
+void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ LoadDFromOffset(D0, T0, Double::value_offset() - kHeapObjectTag);
 
@@ -1342,7 +1311,7 @@
 }
 
 
-void Intrinsifier::Math_sqrt(Assembler* assembler) {
+void Intrinsifier::MathSqrt(Assembler* assembler) {
   Label fall_through, is_smi, double_op;
   TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Argument is double and is in T0.
@@ -1412,7 +1381,7 @@
 }
 
 
-void Intrinsifier::Object_equal(Assembler* assembler) {
+void Intrinsifier::ObjectEquals(Assembler* assembler) {
   Label is_true;
 
   __ lw(T0, Address(SP, 0 * kWordSize));
@@ -1436,14 +1405,14 @@
 }
 
 
-void Intrinsifier::String_getLength(Assembler* assembler) {
+void Intrinsifier::StringBaseLength(Assembler* assembler) {
   __ lw(T0, Address(SP, 0 * kWordSize));
   __ Ret();
   __ delay_slot()->lw(V0, FieldAddress(T0, String::length_offset()));
 }
 
 
-void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
 
   __ lw(T1, Address(SP, 0 * kWordSize));  // Index.
@@ -1469,7 +1438,7 @@
   __ BranchNotEqual(CMPRES1, kTwoByteStringCid, &fall_through);
   ASSERT(kSmiTagShift == 1);
   __ addu(T2, T0, T1);
-  __ lhu(V0, FieldAddress(T2, OneByteString::data_offset()));
+  __ lhu(V0, FieldAddress(T2, TwoByteString::data_offset()));
   __ Ret();
   __ delay_slot()->SmiTag(V0);
 
@@ -1477,7 +1446,55 @@
 }
 
 
-void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
+  Label fall_through, try_two_byte_string;
+
+  __ lw(T1, Address(SP, 0 * kWordSize));  // Index.
+  __ lw(T0, Address(SP, 1 * kWordSize));  // String.
+
+  // Checks.
+  __ andi(CMPRES1, T1, Immediate(kSmiTagMask));
+  __ bne(T1, ZR, &fall_through);  // Index is not a Smi.
+  __ lw(T2, FieldAddress(T0, String::length_offset()));  // Range check.
+  // Runtime throws exception.
+  __ BranchUnsignedGreaterEqual(T1, T2, &fall_through);
+  __ LoadClassId(CMPRES1, T0);  // Class ID check.
+  __ BranchNotEqual(CMPRES1, kOneByteStringCid, &try_two_byte_string);
+
+  // Grab byte and return.
+  __ SmiUntag(T1);
+  __ addu(T2, T0, T1);
+  __ lbu(T2, FieldAddress(T2, OneByteString::data_offset()));
+  __ BranchUnsignedGreaterEqual(
+      T2, Symbols::kNumberOfOneCharCodeSymbols, &fall_through);
+  __ LoadImmediate(
+      V0, reinterpret_cast<uword>(Symbols::PredefinedAddress()));
+  __ AddImmediate(V0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ sll(T2, T2, 2);
+  __ addu(T2, T2, V0);
+  __ Ret();
+  __ delay_slot()->lw(V0, Address(T2));
+
+  __ Bind(&try_two_byte_string);
+  __ BranchNotEqual(CMPRES1, kTwoByteStringCid, &fall_through);
+  ASSERT(kSmiTagShift == 1);
+  __ addu(T2, T0, T1);
+  __ lhu(T2, FieldAddress(T2, TwoByteString::data_offset()));
+  __ BranchUnsignedGreaterEqual(
+      T2, Symbols::kNumberOfOneCharCodeSymbols, &fall_through);
+  __ LoadImmediate(V0,
+                   reinterpret_cast<uword>(Symbols::PredefinedAddress()));
+  __ AddImmediate(V0, Symbols::kNullCharCodeSymbolOffset * kWordSize);
+  __ sll(T2, T2, 2);
+  __ addu(T2, T2, V0);
+  __ Ret();
+  __ delay_slot()->lw(V0, Address(T2));
+
+  __ Bind(&fall_through);
+}
+
+
+void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   Label is_true;
 
   __ lw(T0, Address(SP, 0 * kWordSize));
@@ -1692,7 +1709,7 @@
 }
 
 
-void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
   __ lw(T2, Address(SP, 0 * kWordSize));  // Value.
   __ lw(T1, Address(SP, 1 * kWordSize));  // Index.
   __ lw(T0, Address(SP, 2 * kWordSize));  // OneByteString.
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index b83522d..6d8eeb6 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -27,19 +27,19 @@
 #define __ assembler->
 
 
-void Intrinsifier::Array_getLength(Assembler* assembler) {
+void Intrinsifier::ObjectArrayLength(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
-  Array_getLength(assembler);
+void Intrinsifier::ImmutableArrayLength(Assembler* assembler) {
+  ObjectArrayLength(assembler);
 }
 
 
-void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
@@ -57,12 +57,12 @@
 }
 
 
-void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
-  Array_getIndexed(assembler);
+void Intrinsifier::ImmutableArrayGetIndexed(Assembler* assembler) {
+  ObjectArrayGetIndexed(assembler);
 }
 
 
-void Intrinsifier::Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -90,7 +90,7 @@
 
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
-void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+void Intrinsifier::GrowableArray_Allocate(Assembler* assembler) {
   // This snippet of inlined code uses the following registers:
   // RAX, RCX, R13
   // and the newly allocated object is returned in RAX.
@@ -98,40 +98,10 @@
   const intptr_t kArrayOffset = 1 * 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();
-
-  __ movq(RAX, Immediate(heap->TopAddress()));
-  __ movq(RAX, Address(RAX, 0));
-  __ leaq(RCX, Address(RAX, fixed_size));
-
-  // Check if the allocation fits into the remaining space.
-  // RAX: potential new backing array object start.
-  // RCX: potential next object start.
-  __ 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));
-
-  // Initialize the tags.
-  // EAX: new growable array object start as a tagged pointer.
+  // Try allocating in new space.
   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);
-  __ movq(FieldAddress(RAX, GrowableObjectArray::tags_offset()),
-          Immediate(tags));
+      Isolate::Current()->object_store()->growable_object_array_class());
+  __ TryAllocate(cls, &fall_through, Assembler::kFarJump, RAX, kNoRegister);
 
   // Store backing array object in growable array object.
   __ movq(RCX, Address(RSP, kArrayOffset));  // data argument.
@@ -152,7 +122,6 @@
   // Set the length field in the growable array object to 0.
   __ movq(FieldAddress(RAX, GrowableObjectArray::length_offset()),
           Immediate(0));
-  __ UpdateAllocationStats(kGrowableObjectArrayCid);
   __ ret();  // returns the newly allocated object in RAX.
 
   __ Bind(&fall_through);
@@ -161,14 +130,14 @@
 
 // Get length of growable object array.
 // On stack: growable array (+1), return-address (+0).
-void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+void Intrinsifier::GrowableArrayLength(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+void Intrinsifier::GrowableArrayCapacity(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::data_offset()));
   __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
@@ -178,7 +147,7 @@
 
 // Access growable object array at specified index.
 // On stack: growable array (+2), index (+1), return-address (+0).
-void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // GrowableArray.
@@ -200,7 +169,7 @@
 
 // Set value into growable object array at specified index.
 // On stack: growable array (+3), index (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetIndexed(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -228,7 +197,7 @@
 // Set length of growable object array. The length cannot
 // be greater than the length of the data container.
 // On stack: growable array (+2), length (+1), return-address (+0).
-void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
   Label fall_through;
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Growable array.
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Length value.
@@ -242,7 +211,7 @@
 
 // Set data of growable object array.
 // On stack: growable array (+2), data (+1), return-address (+0).
-void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+void Intrinsifier::GrowableArraySetData(Assembler* assembler) {
   if (FLAG_enable_type_checks) {
     return;
   }
@@ -264,7 +233,7 @@
 // Add an element to growable array if it doesn't need to grow, otherwise
 // call into regular code.
 // On stack: growable array (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableList_add(Assembler* assembler) {
+void Intrinsifier::GrowableArray_add(Assembler* assembler) {
   // In checked mode we need to check the incoming argument.
   if (FLAG_enable_type_checks) return;
   Label fall_through;
@@ -390,14 +359,14 @@
 
 
 // Gets the length of a TypedData.
-void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+void Intrinsifier::TypedDataLength(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));
   __ movq(RAX, FieldAddress(RAX, TypedData::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::Uint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Uint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
@@ -416,7 +385,7 @@
 }
 
 
-void Intrinsifier::ExternalUint8Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::ExternalUint8ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
@@ -436,7 +405,7 @@
 }
 
 
-void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArrayGetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Array.
@@ -469,7 +438,7 @@
 }
 
 
-void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
+void Intrinsifier::Float64ArraySetIndexed(Assembler* assembler) {
   Label fall_through;
   __ movq(RCX, Address(RSP, + 2 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 3 * kWordSize));  // Array.
@@ -1136,7 +1105,7 @@
 
 
 // Left is double right is integer (Bigint, Mint or Smi)
-void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+void Intrinsifier::DoubleFromInteger(Assembler* assembler) {
   Label fall_through;
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ testq(RAX, Immediate(kSmiTagMask));
@@ -1195,7 +1164,7 @@
 }
 
 
-void Intrinsifier::Double_toInt(Assembler* assembler) {
+void Intrinsifier::DoubleToInteger(Assembler* assembler) {
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
   __ cvttsd2siq(RAX, XMM0);
@@ -1211,7 +1180,7 @@
 }
 
 
-void Intrinsifier::Math_sqrt(Assembler* assembler) {
+void Intrinsifier::MathSqrt(Assembler* assembler) {
   Label fall_through, is_smi, double_op;
   TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Argument is double and is in RAX.
@@ -1272,7 +1241,7 @@
 }
 
 // Identity comparison.
-void Intrinsifier::Object_equal(Assembler* assembler) {
+void Intrinsifier::ObjectEquals(Assembler* assembler) {
   Label is_true;
   const intptr_t kReceiverOffset = 2;
   const intptr_t kArgumentOffset = 1;
@@ -1300,14 +1269,14 @@
 }
 
 
-void Intrinsifier::String_getLength(Assembler* assembler) {
+void Intrinsifier::StringBaseLength(Assembler* assembler) {
   __ movq(RAX, Address(RSP, + 1 * kWordSize));  // String object.
   __ movq(RAX, FieldAddress(RAX, String::length_offset()));
   __ ret();
 }
 
 
-void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) {
   Label fall_through, try_two_byte_string;
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // String.
@@ -1336,7 +1305,50 @@
 }
 
 
-void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+void Intrinsifier::StringBaseCharAt(Assembler* assembler) {
+  Label fall_through, try_two_byte_string;
+  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
+  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // String.
+  __ testq(RCX, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
+  // Range check.
+  __ cmpq(RCX, FieldAddress(RAX, String::length_offset()));
+  // Runtime throws exception.
+  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
+  __ CompareClassId(RAX, kOneByteStringCid);
+  __ j(NOT_EQUAL, &try_two_byte_string, Assembler::kNearJump);
+  __ SmiUntag(RCX);
+  __ movzxb(RCX, FieldAddress(RAX, RCX, TIMES_1, OneByteString::data_offset()));
+  __ cmpq(RCX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
+  __ j(GREATER_EQUAL, &fall_through);
+  __ movq(RAX,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movq(RAX, Address(RAX,
+                       RCX,
+                       TIMES_8,
+                       Symbols::kNullCharCodeSymbolOffset * kWordSize));
+  __ ret();
+
+  __ Bind(&try_two_byte_string);
+  __ CompareClassId(RAX, kTwoByteStringCid);
+  __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);
+  ASSERT(kSmiTagShift == 1);
+  __ movzxw(RCX, FieldAddress(RAX, RCX, TIMES_1, OneByteString::data_offset()));
+  __ cmpq(RCX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
+  __ j(GREATER_EQUAL, &fall_through);
+  __ movq(RAX,
+          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
+  __ movq(RAX, Address(RAX,
+                       RCX,
+                       TIMES_8,
+                       Symbols::kNullCharCodeSymbolOffset * kWordSize));
+  __ ret();
+
+  __ Bind(&fall_through);
+}
+
+
+void Intrinsifier::StringBaseIsEmpty(Assembler* assembler) {
   Label is_true;
   // Get length.
   __ movq(RAX, Address(RSP, + 1 * kWordSize));  // String object.
@@ -1548,7 +1560,7 @@
 }
 
 
-void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+void Intrinsifier::OneByteStringSetAt(Assembler* assembler) {
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Value.
   __ movq(RBX, Address(RSP, + 2 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 3 * kWordSize));  // OneByteString.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index eec4191..a90137d 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -416,6 +416,7 @@
       mutex_(new Mutex()),
       stack_limit_(0),
       saved_stack_limit_(0),
+      stack_base_(0),
       stack_overflow_flags_(0),
       stack_overflow_count_(0),
       message_handler_(NULL),
@@ -436,6 +437,7 @@
       thread_state_(NULL),
       tag_table_(GrowableObjectArray::null()),
       current_tag_(UserTag::null()),
+      metrics_list_head_(NULL),
       next_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
@@ -443,10 +445,65 @@
   set_vm_tag(VMTag::kIdleTagId);
   set_user_tag(UserTags::kDefaultUserTag);
 }
+
+Isolate::Isolate(Isolate* original)
+    : store_buffer_(true),
+      class_table_(original->class_table()),
+      message_notify_callback_(NULL),
+      name_(NULL),
+      start_time_(OS::GetCurrentTimeMicros()),
+      main_port_(0),
+      pause_capability_(0),
+      terminate_capability_(0),
+      heap_(NULL),
+      object_store_(NULL),
+      top_context_(Context::null()),
+      top_exit_frame_info_(0),
+      init_callback_data_(NULL),
+      environment_callback_(NULL),
+      library_tag_handler_(NULL),
+      api_state_(NULL),
+      stub_code_(NULL),
+      debugger_(NULL),
+      single_step_(false),
+      resume_request_(false),
+      random_(),
+      simulator_(NULL),
+      long_jump_base_(NULL),
+      timer_list_(),
+      deopt_id_(0),
+      mutex_(new Mutex()),
+      stack_limit_(0),
+      saved_stack_limit_(0),
+      stack_overflow_flags_(0),
+      stack_overflow_count_(0),
+      message_handler_(NULL),
+      spawn_state_(NULL),
+      is_runnable_(false),
+      gc_prologue_callback_(NULL),
+      gc_epilogue_callback_(NULL),
+      defer_finalization_count_(0),
+      deopt_context_(NULL),
+      stacktrace_(NULL),
+      stack_frame_index_(-1),
+      last_allocationprofile_accumulator_reset_timestamp_(0),
+      last_allocationprofile_gc_timestamp_(0),
+      cha_(NULL),
+      object_id_ring_(NULL),
+      trace_buffer_(NULL),
+      profiler_data_(NULL),
+      thread_state_(NULL),
+      tag_table_(GrowableObjectArray::null()),
+      current_tag_(UserTag::null()),
+      metrics_list_head_(NULL),
+      next_(NULL),
+      REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
+      REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
+      reusable_handles_() {
+}
 #undef REUSABLE_HANDLE_SCOPE_INIT
 #undef REUSABLE_HANDLE_INITIALIZERS
 
-
 Isolate::~Isolate() {
   delete [] name_;
   delete heap_;
@@ -510,9 +567,17 @@
   Isolate* result = new Isolate();
   ASSERT(result != NULL);
 
+  // Initialize metrics.
+#define ISOLATE_METRIC_INIT(type, variable, name, unit)                        \
+  result->metric_##variable##_.Init(result, name, NULL, Metric::unit);
+  ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT);
+#undef ISOLATE_METRIC_INIT
+
+
   // Add to isolate list.
   AddIsolateTolist(result);
 
+
   // TODO(5411455): For now just set the recently created isolate as
   // the current isolate.
   SetCurrent(result);
@@ -537,7 +602,7 @@
   // main thread.
   // TODO(5411455): Need to figure out how to set the stack limit for the
   // main thread.
-  result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
+  result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
   result->set_pause_capability(result->random()->NextUInt64());
   result->set_terminate_capability(result->random()->NextUInt64());
@@ -578,19 +643,24 @@
 }
 
 
-void Isolate::SetStackLimitFromCurrentTOS(uword stack_top_value) {
+void Isolate::SetStackLimitFromStackBase(uword stack_base) {
 #if defined(USING_SIMULATOR)
   // Ignore passed-in native stack top and use Simulator stack top.
   Simulator* sim = Simulator::Current();  // May allocate a simulator.
   ASSERT(simulator() == sim);  // This isolate's simulator is the current one.
-  stack_top_value = sim->StackTop();
+  stack_base = sim->StackTop();
   // The overflow area is accounted for by the simulator.
 #endif
-  SetStackLimit(stack_top_value - GetSpecifiedStackSize());
+  // Set stack base.
+  stack_base_ = stack_base;
+  // Set stack limit.
+  SetStackLimit(stack_base_ - GetSpecifiedStackSize());
 }
 
 
 void Isolate::SetStackLimit(uword limit) {
+  // The isolate setting the stack limit is not necessarily the isolate which
+  // the stack limit is being set on.
   MutexLocker ml(mutex_);
   if (stack_limit_ == saved_stack_limit_) {
     // No interrupt pending, set stack_limit_ too.
@@ -600,7 +670,13 @@
 }
 
 
-bool Isolate::GetStackBounds(uword* lower, uword* upper) {
+void Isolate::ClearStackLimit() {
+  SetStackLimit(~static_cast<uword>(0));
+  stack_base_ = 0;
+}
+
+
+bool Isolate::GetProfilerStackBounds(uword* lower, uword* upper) const {
   uword stack_lower = stack_limit();
   if (stack_lower == kUwordMax) {
     stack_lower = saved_stack_limit();
@@ -616,16 +692,12 @@
 
 
 void Isolate::ScheduleInterrupts(uword interrupt_bits) {
-  // TODO(turnidge): Can't use MutexLocker here because MutexLocker is
-  // a StackResource, which requires a current isolate.  Should
-  // MutexLocker really be a StackResource?
-  mutex_->Lock();
+  MutexLocker ml(mutex_);
   ASSERT((interrupt_bits & ~kInterruptsMask) == 0);  // Must fit in mask.
   if (stack_limit_ == saved_stack_limit_) {
     stack_limit_ = (~static_cast<uword>(0)) & ~kInterruptsMask;
   }
   stack_limit_ |= interrupt_bits;
-  mutex_->Unlock();
 }
 
 
@@ -647,12 +719,9 @@
 
 bool Isolate::MakeRunnable() {
   ASSERT(Isolate::Current() == NULL);
-  // Can't use MutexLocker here because MutexLocker is
-  // a StackResource, which requires a current isolate.
-  mutex_->Lock();
+  MutexLocker ml(mutex_);
   // Check if we are in a valid state to make the isolate runnable.
   if (is_runnable_ == true) {
-    mutex_->Unlock();
     return false;  // Already runnable.
   }
   // Set the isolate as runnable and if we are being spawned schedule
@@ -667,7 +736,6 @@
     ASSERT(this == state->isolate());
     Run();
   }
-  mutex_->Unlock();
   return true;
 }
 
@@ -768,17 +836,28 @@
     func ^= result.raw();
     func = func.ImplicitClosureFunction();
 
+    const Array& capabilities = Array::Handle(Array::New(2));
+    Capability& capability = Capability::Handle();
+    capability = Capability::New(isolate->pause_capability());
+    capabilities.SetAt(0, capability);
+    capability = Capability::New(isolate->terminate_capability());
+    capabilities.SetAt(1, capability);
+
     // Instead of directly invoking the entry point we call '_startIsolate' with
-    // the entry point as argument. The '_startIsolate' function will
-    // communicate with the spawner to receive the initial message before it
-    // executes the real entry point.
+    // the entry point as argument.
     // Since this function ("RunIsolate") is used for both Isolate.spawn and
     // Isolate.spawnUri we also send a boolean flag as argument so that the
     // "_startIsolate" function can act corresponding to how the isolate was
     // created.
-    const Array& args = Array::Handle(Array::New(2));
-    args.SetAt(0, Instance::Handle(func.ImplicitStaticClosure()));
-    args.SetAt(1, is_spawn_uri ? Bool::True() : Bool::False());
+    const Array& args = Array::Handle(Array::New(7));
+    args.SetAt(0, SendPort::Handle(SendPort::New(state->parent_port())));
+    args.SetAt(1, Instance::Handle(func.ImplicitStaticClosure()));
+    args.SetAt(2, Instance::Handle(state->BuildArgs()));
+    args.SetAt(3, Instance::Handle(state->BuildMessage()));
+    args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
+    args.SetAt(5, ReceivePort::Handle(
+        ReceivePort::New(isolate->main_port(), true /* control port */)));
+    args.SetAt(6, capabilities);
 
     const Library& lib = Library::Handle(Library::IsolateLibrary());
     const String& entry_name = String::Handle(String::New("_startIsolate"));
@@ -970,6 +1049,11 @@
 }
 
 
+Isolate* Isolate::ShallowCopy() {
+  return new Isolate(this);
+}
+
+
 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL;
 Dart_IsolateInterruptCallback Isolate::interrupt_callback_ = NULL;
 Dart_IsolateUnhandledExceptionCallback
@@ -1106,7 +1190,6 @@
     jsobj.AddProperty("depth", (intptr_t)0);
   }
   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.
@@ -1237,6 +1320,18 @@
 }
 
 
+intptr_t Isolate::IsolateListLength() {
+  MonitorLocker ml(isolates_list_monitor_);
+  intptr_t count = 0;
+  Isolate* current = isolates_list_head_;
+  while (current != NULL) {
+    count++;
+    current = current->next_;
+  }
+  return count;
+}
+
+
 void Isolate::AddIsolateTolist(Isolate* isolate) {
   MonitorLocker ml(isolates_list_monitor_);
   ASSERT(isolate != NULL);
@@ -1289,13 +1384,50 @@
 }
 
 
-IsolateSpawnState::IsolateSpawnState(const Function& func)
+static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+  void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
+  return reinterpret_cast<uint8_t*>(new_ptr);
+}
+
+
+static void SerializeObject(const Instance& obj,
+                            uint8_t** obj_data,
+                            intptr_t* obj_len) {
+  MessageWriter writer(obj_data, &allocator);
+  writer.WriteMessage(obj);
+  *obj_len = writer.BytesWritten();
+}
+
+
+static RawInstance* DeserializeObject(Isolate* isolate,
+                                      uint8_t* obj_data,
+                                      intptr_t obj_len) {
+  if (obj_data == NULL) {
+    return Instance::null();
+  }
+  SnapshotReader reader(obj_data, obj_len, Snapshot::kMessage, isolate);
+  const Object& obj = Object::Handle(isolate, reader.ReadObject());
+  ASSERT(!obj.IsError());
+  Instance& instance = Instance::Handle(isolate);
+  instance ^= obj.raw();  // Can't use Instance::Cast because may be null.
+  return instance.raw();
+}
+
+
+IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port,
+                                     const Function& func,
+                                     const Instance& message)
     : isolate_(NULL),
+      parent_port_(parent_port),
       script_url_(NULL),
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      exception_callback_name_(NULL) {
+      exception_callback_name_(NULL),
+      serialized_args_(NULL),
+      serialized_args_len_(0),
+      serialized_message_(NULL),
+      serialized_message_len_(0) {
   script_url_ = NULL;
   const Class& cls = Class::Handle(func.Owner());
   const Library& lib = Library::Handle(cls.library());
@@ -1309,19 +1441,30 @@
     class_name_ = strdup(class_name.ToCString());
   }
   exception_callback_name_ = strdup("_unhandledExceptionCallback");
+  SerializeObject(message, &serialized_message_, &serialized_message_len_);
 }
 
 
-IsolateSpawnState::IsolateSpawnState(const char* script_url)
+IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port,
+                                     const char* script_url,
+                                     const Instance& args,
+                                     const Instance& message)
     : isolate_(NULL),
+      parent_port_(parent_port),
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      exception_callback_name_(NULL) {
+      exception_callback_name_(NULL),
+      serialized_args_(NULL),
+      serialized_args_len_(0),
+      serialized_message_(NULL),
+      serialized_message_len_(0) {
   script_url_ = strdup(script_url);
   library_url_ = NULL;
   function_name_ = strdup("main");
   exception_callback_name_ = strdup("_unhandledExceptionCallback");
+  SerializeObject(args, &serialized_args_, &serialized_args_len_);
+  SerializeObject(message, &serialized_message_, &serialized_message_len_);
 }
 
 
@@ -1331,6 +1474,8 @@
   free(function_name_);
   free(class_name_);
   free(exception_callback_name_);
+  free(serialized_args_);
+  free(serialized_message_);
 }
 
 
@@ -1387,6 +1532,17 @@
 }
 
 
+RawInstance* IsolateSpawnState::BuildArgs() {
+  return DeserializeObject(isolate_, serialized_args_, serialized_args_len_);
+}
+
+
+RawInstance* IsolateSpawnState::BuildMessage() {
+  return DeserializeObject(isolate_,
+                           serialized_message_, serialized_message_len_);
+}
+
+
 void IsolateSpawnState::Cleanup() {
   SwitchIsolateScope switch_scope(I);
   Dart::ShutdownIsolate();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 1f37635..0356d59 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -12,6 +12,7 @@
 #include "vm/counters.h"
 #include "vm/handles.h"
 #include "vm/megamorphic_cache_table.h"
+#include "vm/metrics.h"
 #include "vm/random.h"
 #include "vm/store_buffer.h"
 #include "vm/tags.h"
@@ -119,6 +120,8 @@
   static Isolate* Init(const char* name_prefix);
   void Shutdown();
 
+  Isolate* ShallowCopy();
+
   // Register a newly introduced class.
   void RegisterClass(const Class& cls);
   void RegisterClassAt(intptr_t index, const Class& cls);
@@ -237,7 +240,8 @@
   }
 
   void SetStackLimit(uword value);
-  void SetStackLimitFromCurrentTOS(uword isolate_stack_top);
+  void SetStackLimitFromStackBase(uword stack_base);
+  void ClearStackLimit();
 
   uword stack_limit_address() const {
     return reinterpret_cast<uword>(&stack_limit_);
@@ -253,6 +257,8 @@
   // The true stack limit for this isolate.
   uword saved_stack_limit() const { return saved_stack_limit_; }
 
+  uword stack_base() const { return stack_base_; }
+
   // Stack overflow flags
   enum {
     kOsrRequest = 0x1,  // Current stack overflow caused by OSR request.
@@ -271,8 +277,8 @@
   // stack overflow is called.
   uword GetAndClearStackOverflowFlags();
 
-  // Retrieve the stack address bounds.
-  bool GetStackBounds(uword* lower, uword* upper);
+  // Retrieve the stack address bounds for profiler.
+  bool GetProfilerStackBounds(uword* lower, uword* upper) const;
 
   static uword GetSpecifiedStackSize();
 
@@ -555,12 +561,27 @@
     return OFFSET_OF(Isolate, current_tag_);
   }
 
+#define ISOLATE_METRIC_ACCESSOR(type, variable, name, unit)                    \
+  type* Get##variable##Metric() { return &metric_##variable##_; }
+  ISOLATE_METRIC_LIST(ISOLATE_METRIC_ACCESSOR);
+#undef ISOLATE_METRIC_ACCESSOR
+
+  static intptr_t IsolateListLength();
+
   RawGrowableObjectArray* tag_table() const { return tag_table_; }
   void set_tag_table(const GrowableObjectArray& value);
 
   RawUserTag* current_tag() const { return current_tag_; }
   void set_current_tag(const UserTag& tag);
 
+  Metric* metrics_list_head() {
+    return metrics_list_head_;
+  }
+
+  void set_metrics_list_head(Metric* metric) {
+    metrics_list_head_ = metric;
+  }
+
 #if defined(DEBUG)
 #define REUSABLE_HANDLE_SCOPE_ACCESSORS(object)                                \
   void set_reusable_##object##_handle_scope_active(bool value) {               \
@@ -586,6 +607,7 @@
 
  private:
   Isolate();
+  explicit Isolate(Isolate* original);
 
   void BuildName(const char* name_prefix);
   void PrintInvokedFunctions();
@@ -630,6 +652,7 @@
   Mutex* mutex_;  // protects stack_limit_ and saved_stack_limit_.
   uword stack_limit_;
   uword saved_stack_limit_;
+  uword stack_base_;
   uword stack_overflow_flags_;
   int32_t stack_overflow_count_;
   MessageHandler* message_handler_;
@@ -665,6 +688,8 @@
   RawGrowableObjectArray* tag_table_;
   RawUserTag* current_tag_;
 
+  Metric* metrics_list_head_;
+
   Counters counters_;
 
   // Isolate list next pointer.
@@ -683,6 +708,11 @@
 #undef REUSABLE_HANDLE_SCOPE_VARIABLE
 #endif  // defined(DEBUG)
 
+#define ISOLATE_METRIC_VARIABLE(type, variable, name, unit)                    \
+  type metric_##variable##_;
+  ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE);
+#undef ISOLATE_METRIC_VARIABLE
+
   VMHandles reusable_handles_;
 
   static Dart_IsolateCreateCallback create_callback_;
@@ -723,13 +753,13 @@
     if (saved_isolate_ != new_isolate_) {
       ASSERT(Isolate::Current() == NULL);
       Isolate::SetCurrent(new_isolate_);
-      new_isolate_->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(this));
+      new_isolate_->SetStackLimitFromStackBase(reinterpret_cast<uword>(this));
     }
   }
 
   ~StartIsolateScope() {
     if (saved_isolate_ != new_isolate_) {
-      new_isolate_->SetStackLimit(~static_cast<uword>(0));
+      new_isolate_->ClearStackLimit();
       Isolate::SetCurrent(saved_isolate_);
     }
   }
@@ -780,12 +810,19 @@
 
 class IsolateSpawnState {
  public:
-  explicit IsolateSpawnState(const Function& func);
-  explicit IsolateSpawnState(const char* script_url);
+  IsolateSpawnState(Dart_Port parent_port,
+                    const Function& func,
+                    const Instance& message);
+  IsolateSpawnState(Dart_Port parent_port,
+                    const char* script_url,
+                    const Instance& args,
+                    const Instance& message);
   ~IsolateSpawnState();
 
   Isolate* isolate() const { return isolate_; }
   void set_isolate(Isolate* value) { isolate_ = value; }
+
+  Dart_Port parent_port() const { return parent_port_; }
   char* script_url() const { return script_url_; }
   char* library_url() const { return library_url_; }
   char* class_name() const { return class_name_; }
@@ -794,15 +831,22 @@
   bool is_spawn_uri() const { return library_url_ == NULL; }
 
   RawObject* ResolveFunction();
+  RawInstance* BuildArgs();
+  RawInstance* BuildMessage();
   void Cleanup();
 
  private:
   Isolate* isolate_;
+  Dart_Port parent_port_;
   char* script_url_;
   char* library_url_;
   char* class_name_;
   char* function_name_;
   char* exception_callback_name_;
+  uint8_t* serialized_args_;
+  intptr_t serialized_args_len_;
+  uint8_t* serialized_message_;
+  intptr_t serialized_message_len_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index d72ff5b..762124d 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -8,6 +8,7 @@
 #include "vm/debugger.h"
 #include "vm/json_stream.h"
 #include "vm/message.h"
+#include "vm/metrics.h"
 #include "vm/object.h"
 #include "vm/unicode.h"
 
@@ -259,6 +260,12 @@
 }
 
 
+void JSONStream::PrintValue(Metric* metric) {
+  PrintCommaIfNeeded();
+  metric->PrintJSON(this);
+}
+
+
 void JSONStream::PrintValue(Isolate* isolate, bool ref) {
   PrintCommaIfNeeded();
   isolate->PrintJSON(this, ref);
@@ -313,6 +320,11 @@
 }
 
 
+void JSONStream::PrintProperty(const char* name, Metric* metric) {
+  PrintPropertyName(name);
+  PrintValue(metric);
+}
+
 void JSONStream::PrintProperty(const char* name, Isolate* isolate) {
   PrintPropertyName(name);
   PrintValue(isolate);
@@ -396,6 +408,9 @@
 
 
 void JSONStream::AddEscapedUTF8String(const char* s) {
+  if (s == NULL) {
+    return;
+  }
   intptr_t len = strlen(s);
   const uint8_t* s8 = reinterpret_cast<const uint8_t*>(s);
   intptr_t i = 0;
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 3fc4961..057fbf9 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -20,6 +20,7 @@
 class JSONObject;
 class Object;
 class SourceBreakpoint;
+class Metric;
 class Zone;
 
 class JSONStream : ValueObject {
@@ -88,6 +89,7 @@
   void PrintValue(const Object& o, bool ref = true);
   void PrintValue(SourceBreakpoint* bpt);
   void PrintValue(const DebuggerEvent* event);
+  void PrintValue(Metric* metric);
   void PrintValue(Isolate* isolate, bool ref = true);
 
   void PrintPropertyBool(const char* name, bool b);
@@ -102,6 +104,7 @@
 
   void PrintProperty(const char* name, const DebuggerEvent* event);
   void PrintProperty(const char* name, SourceBreakpoint* bpt);
+  void PrintProperty(const char* name, Metric* metric);
   void PrintProperty(const char* name, Isolate* isolate);
   void PrintPropertyName(const char* name);
   void PrintCommaIfNeeded();
@@ -168,6 +171,9 @@
   void AddProperty(const char* name, SourceBreakpoint* bpt) const {
     stream_->PrintProperty(name, bpt);
   }
+  void AddProperty(const char* name, Metric* metric) const {
+    stream_->PrintProperty(name, metric);
+  }
   void AddProperty(const char* name, Isolate* isolate) const {
     stream_->PrintProperty(name, isolate);
   }
@@ -216,6 +222,9 @@
   void AddValue(const DebuggerEvent* event) const {
     stream_->PrintValue(event);
   }
+  void AddValue(Metric* metric) const {
+    stream_->PrintValue(metric);
+  }
   void AddValueF(const char* format, ...) const PRINTF_ATTRIBUTE(2, 3);
 
  private:
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 0024b68..c0ef26e 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -71,7 +71,7 @@
 Location Location::RegisterOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::RequiresRegister();
 }
 
@@ -79,7 +79,7 @@
 Location Location::RegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::RequiresRegister();
 }
 
@@ -87,7 +87,7 @@
 Location Location::WritableRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::WritableRegister();
 }
 
@@ -95,7 +95,7 @@
 Location Location::FixedRegisterOrConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::RegisterLocation(reg);
 }
 
@@ -103,7 +103,7 @@
 Location Location::FixedRegisterOrSmiConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::RegisterLocation(reg);
 }
 
@@ -111,7 +111,7 @@
 Location Location::AnyOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
-      ? Location::Constant(constant->value())
+      ? Location::Constant(constant)
       : Location::Any();
 }
 
@@ -140,6 +140,11 @@
 }
 
 
+const Object& Location::constant() const {
+  return constant_instruction()->value();
+}
+
+
 const char* Location::Name() const {
   switch (kind()) {
     case kInvalid: return "?";
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 0a2a636..a5332391 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -14,6 +14,7 @@
 class BufferFormatter;
 class Value;
 class PairLocation;
+class ConstantInstr;
 
 
 enum Representation {
@@ -21,6 +22,7 @@
   kTagged,
   kUntagged,
   kUnboxedDouble,
+  kUnboxedInt32,
   kUnboxedUint32,
   kUnboxedMint,
   kUnboxedFloat32x4,
@@ -143,17 +145,19 @@
     return (value_ & kLocationTagMask) == kConstantTag;
   }
 
-  static Location Constant(const Object& obj) {
-    Location loc(reinterpret_cast<uword>(&obj) | kConstantTag);
-    ASSERT(&obj == &loc.constant());
+  static Location Constant(ConstantInstr* obj) {
+    Location loc(reinterpret_cast<uword>(obj) | kConstantTag);
+    ASSERT(obj == loc.constant_instruction());
     return loc;
   }
 
-  const Object& constant() const {
+  ConstantInstr* constant_instruction() const {
     ASSERT(IsConstant());
-    return *reinterpret_cast<const Object*>(value_ & ~kLocationTagMask);
+    return reinterpret_cast<ConstantInstr*>(value_ & ~kLocationTagMask);
   }
 
+  const Object& constant() const;
+
   bool IsPairLocation() const {
     return (value_ & kLocationTagMask) == kPairLocationTag;
   }
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index c9eaddf..3a4f0b2 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -13,11 +13,9 @@
 
 namespace dart {
 
-class MutexLocker : public StackResource {
+class MutexLocker : public ValueObject {
  public:
-  explicit MutexLocker(Mutex* mutex) :
-    StackResource(Isolate::Current()),
-    mutex_(mutex) {
+  explicit MutexLocker(Mutex* mutex) : mutex_(mutex) {
     ASSERT(mutex != NULL);
     // TODO(iposva): Consider adding a no GC scope here.
     mutex_->Lock();
@@ -35,11 +33,9 @@
 };
 
 
-class MonitorLocker : public StackResource {
+class MonitorLocker : public ValueObject {
  public:
-  explicit MonitorLocker(Monitor* monitor)
-      : StackResource(Isolate::Current()),
-        monitor_(monitor) {
+  explicit MonitorLocker(Monitor* monitor) : monitor_(monitor) {
     ASSERT(monitor != NULL);
     // TODO(iposva): Consider adding a no GC scope here.
     monitor_->Enter();
@@ -54,7 +50,7 @@
     return monitor_->Wait(millis);
   }
 
-  Monitor::WaitResult WaitMicros(int64_t micros = dart::Monitor::kNoTimeout) {
+  Monitor::WaitResult WaitMicros(int64_t micros = Monitor::kNoTimeout) {
     return monitor_->WaitMicros(micros);
   }
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 26b5683..e5990fb 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -20,7 +20,7 @@
     ASSERT(handler != NULL);
   }
 
-  void Run() {
+  virtual void Run() {
     handler_->TaskCallback();
   }
 
@@ -34,7 +34,6 @@
 MessageHandler::MessageHandler()
     : queue_(new MessageQueue()),
       oob_queue_(new MessageQueue()),
-      control_ports_(0),
       live_ports_(0),
       paused_(0),
       pause_on_start_(false),
@@ -272,8 +271,8 @@
     OS::Print("[-] Closing port:\n"
               "\thandler:    %s\n"
               "\tport:       %" Pd64 "\n"
-              "\tports:      control(%" Pd ") live(%" Pd ")\n",
-              name(), port, control_ports_, live_ports_);
+              "\tports:      live(%" Pd ")\n",
+              name(), port, live_ports_);
   }
 }
 
@@ -307,22 +306,4 @@
   live_ports_--;
 }
 
-
-void MessageHandler::increment_control_ports() {
-  MonitorLocker ml(&monitor_);
-#if defined(DEBUG)
-  CheckAccess();
-#endif
-  control_ports_++;
-}
-
-
-void MessageHandler::decrement_control_ports() {
-  MonitorLocker ml(&monitor_);
-#if defined(DEBUG)
-  CheckAccess();
-#endif
-  control_ports_--;
-}
-
 }  // namespace dart
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 78da45d..65dc32f 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -54,24 +54,13 @@
   // Returns true on success.
   bool HandleOOBMessages();
 
-  // The number of opened control ports is determined whether the isolate has
-  // live ports. An isolate is considered not having any live ports if only
-  // control ports are open.
-  // Usually either 0 or 1.
-  void increment_control_ports();
-  void decrement_control_ports();
-
   // A message handler tracks how many live ports it has.
-  bool HasLivePorts() const { return live_ports_ > control_ports_; }
+  bool HasLivePorts() const { return live_ports_ > 0; }
 
   intptr_t live_ports() const {
     return live_ports_;
   }
 
-  intptr_t control_ports() const {
-    return control_ports_;
-  }
-
   bool paused() const { return paused_ > 0; }
 
   void increment_paused() { paused_++; }
@@ -168,7 +157,6 @@
   Monitor monitor_;  // Protects all fields in MessageHandler.
   MessageQueue* queue_;
   MessageQueue* oob_queue_;
-  intptr_t control_ports_;  // The number of open control ports usually 0 or 1.
   intptr_t live_ports_;  // The number of open ports, including control ports.
   intptr_t paused_;  // The number of pause messages received.
   bool pause_on_start_;
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
new file mode 100644
index 0000000..29b08fd
--- /dev/null
+++ b/runtime/vm/method_recognizer.cc
@@ -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.
+
+#include "vm/method_recognizer.h"
+
+#include "vm/object.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+MethodRecognizer::Kind MethodRecognizer::RecognizeKind(
+    const Function& function) {
+  return function.recognized_kind();
+}
+
+
+bool MethodRecognizer::AlwaysInline(const Function& function) {
+  return function.always_inline();
+}
+
+
+bool MethodRecognizer::PolymorphicTarget(const Function& function) {
+  return function.is_polymorphic_target();
+}
+
+
+const char* MethodRecognizer::KindToCString(Kind kind) {
+#define KIND_TO_STRING(class_name, function_name, enum_name, fp)               \
+  if (kind == k##enum_name) return #enum_name;
+RECOGNIZED_LIST(KIND_TO_STRING)
+#undef KIND_TO_STRING
+  return "?";
+}
+
+
+void MethodRecognizer::InitializeState() {
+  GrowableArray<Library*> libs(3);
+  libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
+  libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
+  libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
+  libs.Add(&Library::ZoneHandle(Library::InternalLibrary()));
+  libs.Add(&Library::ZoneHandle(Library::ProfilerLibrary()));
+  Function& func = Function::Handle();
+
+#define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, fp)          \
+  func = Library::GetFunction(libs, #class_name, #function_name);              \
+  if (func.IsNull()) {                                                         \
+    OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
+    UNREACHABLE();                                                             \
+  }                                                                            \
+  ASSERT(func.CheckSourceFingerprint(fp));                                     \
+  func.set_recognized_kind(k##enum_name);
+
+  RECOGNIZED_LIST(SET_RECOGNIZED_KIND);
+
+#define SET_FUNCTION_BIT(class_name, function_name, dest, fp, setter_name)     \
+  func = Library::GetFunction(libs, #class_name, #function_name);              \
+  if (func.IsNull()) {                                                         \
+    OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
+    UNREACHABLE();                                                             \
+  }                                                                            \
+  ASSERT(func.CheckSourceFingerprint(fp));                                     \
+  func.setter_name(true);
+
+#define SET_IS_ALWAYS_INLINE(class_name, function_name, dest, fp)              \
+  SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_always_inline)
+
+#define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp)         \
+  SET_FUNCTION_BIT(class_name, function_name, dest, fp,                        \
+                   set_is_polymorphic_target)
+
+  INLINE_WHITE_LIST(SET_IS_ALWAYS_INLINE);
+  POLYMORPHIC_TARGET_LIST(SET_IS_POLYMORPHIC_TARGET);
+
+#undef SET_RECOGNIZED_KIND
+#undef SET_IS_ALWAYS_INLINE
+#undef SET_IS_POLYMORPHIC_TARGET
+#undef SET_FUNCTION_BIT
+}
+
+}  // namespace dart
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
new file mode 100644
index 0000000..a0339d4
--- /dev/null
+++ b/runtime/vm/method_recognizer.h
@@ -0,0 +1,393 @@
+// 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.
+
+#ifndef VM_METHOD_RECOGNIZER_H_
+#define VM_METHOD_RECOGNIZER_H_
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+// (class-name, function-name, recognized enum, fingerprint).
+// When adding a new function add a 0 as fingerprint, build and run to get the
+// correct fingerprint from the mismatch error.
+#define OTHER_RECOGNIZED_LIST(V)                                               \
+  V(::, identical, ObjectIdentical, 496869842)                                 \
+  V(ClassID, getID, ClassIDgetID, 1322490980)                                  \
+  V(Object, Object., ObjectConstructor, 1066669787)                            \
+  V(_List, ., ObjectArrayAllocate, 1595327584)                                 \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 149406583)                   \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 888580944)                 \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
+  V(_StringBase, _interpolate, StringBaseInterpolate, 1758627989)              \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1084977108)             \
+  V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32,  \
+      597111055)                                                               \
+  V(_Double, truncateToDouble, DoubleTruncate, 2117801967)                     \
+  V(_Double, roundToDouble, DoubleRound, 2124216110)                           \
+  V(_Double, floorToDouble, DoubleFloor, 968600699)                            \
+  V(_Double, ceilToDouble, DoubleCeil, 1779929274)                             \
+  V(_Double, _modulo, DoubleMod, 1473971007)                                   \
+  V(_Double, _add, DoubleAdd, 1570715125)                                      \
+  V(_Double, _sub, DoubleSub, 1466395310)                                      \
+  V(_Double, _mul, DoubleMul, 546441193)                                       \
+  V(_Double, _div, DoubleDiv, 1201505037)                                      \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, cos, MathCos, 1951197905)                                              \
+  V(::, min, MathMin, 1022567780)                                              \
+  V(::, max, MathMax, 612058870)                                               \
+  V(::, _doublePow, MathDoublePow, 823139975)                                  \
+  V(Float32x4, Float32x4., Float32x4Constructor, 1755873079)                   \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, 1494069379)                      \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, 916211464)                     \
+  V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
+      640076216)                                                               \
+  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1279591344)    \
+  V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139)                         \
+  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 597555927)                    \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 384850558)                           \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 1398002778)                          \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178056441)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 480831839)                           \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, 630761511)                 \
+  V(_Float32x4, _cmpequal, Float32x4Equal, 571062952)                          \
+  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295)                      \
+  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 589402909)               \
+  V(_Float32x4, _cmplt, Float32x4LessThan, 1502332656)                         \
+  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 1069848031)                 \
+  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1334574472)                     \
+  V(_Float32x4, _min, Float32x4Min, 2036349551)                                \
+  V(_Float32x4, _max, Float32x4Max, 571688115)                                 \
+  V(_Float32x4, _scale, Float32x4Scale, 1311297761)                            \
+  V(_Float32x4, _sqrt, Float32x4Sqrt, 1709659395)                              \
+  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 2043980962)          \
+  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 739405237)                   \
+  V(_Float32x4, _negate, Float32x4Negate, 445839777)                           \
+  V(_Float32x4, _abs, Float32x4Absolute, 1152777608)                           \
+  V(_Float32x4, _clamp, Float32x4Clamp, 353415442)                             \
+  V(_Float32x4, withX, Float32x4WithX, 1446546696)                             \
+  V(_Float32x4, withY, Float32x4WithY, 309844761)                              \
+  V(_Float32x4, withZ, Float32x4WithZ, 971921505)                              \
+  V(_Float32x4, withW, Float32x4WithW, 1759699726)                             \
+  V(Float64x2, Float64x2., Float64x2Constructor, 1399581872)                   \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, 1836770587)                      \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, 939291159)                     \
+  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1499726406)    \
+  V(_Float64x2, get:x, Float64x2GetX, 261044094)                               \
+  V(_Float64x2, get:y, Float64x2GetY, 1942257886)                              \
+  V(_Float64x2, _negate, Float64x2Negate, 2133212774)                          \
+  V(_Float64x2, abs, Float64x2Abs, 1224776282)                                 \
+  V(_Float64x2, sqrt, Float64x2Sqrt, 1037569520)                               \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, 252936800)                 \
+  V(_Float64x2, scale, Float64x2Scale, 1199438744)                             \
+  V(_Float64x2, withX, Float64x2WithX, 1042725932)                             \
+  V(_Float64x2, withY, Float64x2WithY, 1496958947)                             \
+  V(_Float64x2, min, Float64x2Min, 485240583)                                  \
+  V(_Float64x2, max, Float64x2Max, 2146148204)                                 \
+  V(Int32x4, Int32x4., Int32x4Constructor, 665986284)                          \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 87082660)                   \
+  V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
+      372517418)                                                               \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077555238)                          \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, 779160284)                           \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181912283)                           \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, 977675534)                           \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929271914)                    \
+  V(_Int32x4, shuffle, Int32x4Shuffle, 1870018702)                             \
+  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 967644870)                        \
+  V(_Int32x4, select, Int32x4Select, 1696037681)                               \
+  V(_Int32x4, withFlagX, Int32x4WithFlagX, 467852789)                          \
+  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978)                         \
+  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960)                          \
+  V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907)                         \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
+  V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
+    1346536303)                                                                \
+  V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
+    1794849214)                                                                \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1640672852)                       \
+  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1472976717)                      \
+  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1466627059)                 \
+  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 2141660076)                \
+  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 818792056)                      \
+  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038)                    \
+  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492)                  \
+  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736)                 \
+
+// List of intrinsics:
+// (class-name, function-name, intrinsification method, fingerprint).
+#define CORE_LIB_INTRINSIC_LIST(V)                                             \
+  V(_Smi, ~, Smi_bitNegate, 105519892)                                         \
+  V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
+  V(_Double, >, Double_greaterThan, 381325711)                                 \
+  V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
+  V(_Double, <, Double_lessThan, 2080387973)                                   \
+  V(_Double, <=, Double_lessEqualThan, 106225572)                              \
+  V(_Double, ==, Double_equal, 2093918133)                                     \
+  V(_Double, +, Double_add, 1646350451)                                        \
+  V(_Double, -, Double_sub, 1477459276)                                        \
+  V(_Double, *, Double_mul, 1334580777)                                        \
+  V(_Double, /, Double_div, 1938037155)                                        \
+  V(_Double, get:isNaN, Double_getIsNaN, 843050033)                            \
+  V(_Double, get:isNegative, Double_getIsNegative, 1637875580)                 \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483)               \
+  V(_Double, .fromInteger, DoubleFromInteger, 999771940)                       \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_GrowableList, .withData, GrowableArray_Allocate, 732923072)               \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_GrowableList, _setLength, GrowableArraySetLength, 89389299)               \
+  V(_GrowableList, _setData, GrowableArraySetData, 2126927509)                 \
+  V(_GrowableList, add, GrowableArray_add, 1899133961)                         \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(Object, ==, ObjectEquals, 1068471689)                                      \
+  V(_StringBase, get:hashCode, String_getHashCode, 2102906241)                 \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871)                     \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929)       \
+  V(_OneByteString, _substringUncheckedNative,                                 \
+      OneByteString_substringUnchecked, 1527498975)                            \
+  V(_OneByteString, _setAt, OneByteStringSetAt, 468605749)                     \
+  V(_OneByteString, _allocate, OneByteString_allocate, 2035417022)             \
+  V(_OneByteString, ==, OneByteString_equality, 1727047023)                    \
+  V(_TwoByteString, ==, TwoByteString_equality, 951149689)                     \
+
+
+#define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
+  V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
+    438687793)                                                                 \
+  V(_IntegerImplementation, +, Integer_add, 837070328)                         \
+  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
+    562800077)                                                                 \
+  V(_IntegerImplementation, -, Integer_sub, 1904782019)                        \
+  V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
+    67891834)                                                                  \
+  V(_IntegerImplementation, *, Integer_mul, 1012952097)                        \
+  V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
+    93478264)                                                                  \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 724644222)                \
+  V(_IntegerImplementation, unary-, Integer_negate, 2095203689)                \
+  V(_IntegerImplementation, _bitAndFromInteger,                                \
+    Integer_bitAndFromInteger, 504496713)                                      \
+  V(_IntegerImplementation, &, Integer_bitAnd, 347192674)                      \
+  V(_IntegerImplementation, _bitOrFromInteger,                                 \
+    Integer_bitOrFromInteger, 1763728073)                                      \
+  V(_IntegerImplementation, |, Integer_bitOr, 1293445202)                      \
+  V(_IntegerImplementation, _bitXorFromInteger,                                \
+    Integer_bitXorFromInteger, 281425907)                                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 2139935734)                     \
+  V(_IntegerImplementation,                                                    \
+    _greaterThanFromInteger,                                                   \
+    Integer_greaterThanFromInt, 787426822)                                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 123961041)                 \
+  V(_IntegerImplementation, ==, Integer_equal, 1423724294)                     \
+  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
+    1790821042)                                                                \
+  V(_IntegerImplementation, <, Integer_lessThan, 425560117)                    \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 1512735828)             \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 668293748)           \
+  V(_IntegerImplementation, <<, Integer_shl, 34265041)                         \
+  V(_IntegerImplementation, >>, Integer_sar, 1797129864)                       \
+  V(_Double, toInt, DoubleToInteger, 1547535151)
+
+
+#define MATH_LIB_INTRINSIC_LIST(V)                                             \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(_Random, _nextState, Random_nextState, 55890711)                           \
+
+
+#define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819)                     \
+  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760)                   \
+  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668)      \
+  V(_Int16Array, _new, TypedData_Int16Array_new, 1879541015)                   \
+  V(_Uint16Array, _new, TypedData_Uint16Array_new, 189496401)                  \
+  V(_Int32Array, _new, TypedData_Int32Array_new, 1725327048)                   \
+  V(_Uint32Array, _new, TypedData_Uint32Array_new, 10306485)                   \
+  V(_Int64Array, _new, TypedData_Int64Array_new, 1299501918)                   \
+  V(_Uint64Array, _new, TypedData_Uint64Array_new, 1635318703)                 \
+  V(_Float32Array, _new, TypedData_Float32Array_new, 577737480)                \
+  V(_Float64Array, _new, TypedData_Float64Array_new, 645355686)                \
+  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 596639418)            \
+  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 496358233)                \
+  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1506975080)           \
+  V(_Int8Array, ., TypedData_Int8Array_factory, 1499010120)                    \
+  V(_Uint8Array, ., TypedData_Uint8Array_factory, 354210806)                   \
+  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 231626935)     \
+  V(_Int16Array, ., TypedData_Int16Array_factory, 1044203454)                  \
+  V(_Uint16Array, ., TypedData_Uint16Array_factory, 616427808)                 \
+  V(_Int32Array, ., TypedData_Int32Array_factory, 26656923)                    \
+  V(_Uint32Array, ., TypedData_Uint32Array_factory, 297463966)                 \
+  V(_Int64Array, ., TypedData_Int64Array_factory, 105050331)                   \
+  V(_Uint64Array, ., TypedData_Uint64Array_factory, 1469861670)                \
+  V(_Float32Array, ., TypedData_Float32Array_factory, 105860920)               \
+  V(_Float64Array, ., TypedData_Float64Array_factory, 342242776)               \
+  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993)          \
+  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417)               \
+  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575)           \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+
+
+#define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, 370414636)                     \
+  V(::, _getDefaultTag, UserTag_defaultTag, 1159885970)                        \
+  V(::, _getCurrentTag, Profiler_getCurrentTag, 1182126114)                    \
+
+#define ALL_INTRINSICS_LIST(V)                                                 \
+  CORE_LIB_INTRINSIC_LIST(V)                                                   \
+  CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                           \
+  MATH_LIB_INTRINSIC_LIST(V)                                                   \
+  TYPED_DATA_LIB_INTRINSIC_LIST(V)                                             \
+  PROFILER_LIB_INTRINSIC_LIST(V)
+
+#define RECOGNIZED_LIST(V)                                                     \
+  OTHER_RECOGNIZED_LIST(V)                                                     \
+  ALL_INTRINSICS_LIST(V)
+
+// A list of core function that should always be inlined.
+#define INLINE_WHITE_LIST(V)                                                   \
+  V(Object, ==, ObjectEquals, 1068471689)                                      \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(ListIterator, moveNext, ListIteratorMoveNext, 210829138)                   \
+  V(_GrowableList, get:iterator, GrowableArrayIterator, 1812933946)            \
+  V(_GrowableList, forEach, GrowableArrayForEach, 2085943947)                  \
+  V(_List, ., ObjectArrayAllocate, 1595327584)                                 \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_List, get:isEmpty, ObjectArrayIsEmpty, 2130247737)                        \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1543480955)                 \
+  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 936729641)                 \
+  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1898018934)                   \
+  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 111684506)                   \
+  V(::, asin, MathASin, 1651042633)                                            \
+  V(::, acos, MathACos, 1139647090)                                            \
+  V(::, atan, MathATan, 1668754384)                                            \
+  V(::, atan2, MathATan2, 1845649456)                                          \
+  V(::, cos, MathCos, 1951197905)                                              \
+  V(::, exp, MathExp, 1809210829)                                              \
+  V(::, log, MathLog, 1620336448)                                              \
+  V(::, max, MathMax, 612058870)                                               \
+  V(::, min, MathMin, 1022567780)                                              \
+  V(::, pow, MathPow, 930962530)                                               \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(::, tan, MathTan, 982072809)                                               \
+  V(Lists, copy, ListsCopy, 902244797)
+
+
+// A list of core functions that internally dispatch based on received id.
+#define POLYMORPHIC_TARGET_LIST(V)                                             \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 149406583)                    \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 888580944)                  \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
+
+// Forward declarations.
+class Function;
+
+// Class that recognizes the name and owner of a function and returns the
+// corresponding enum. See RECOGNIZED_LIST above for list of recognizable
+// functions.
+class MethodRecognizer : public AllStatic {
+ public:
+  enum Kind {
+    kUnknown,
+#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, fp) k##enum_name,
+RECOGNIZED_LIST(DEFINE_ENUM_LIST)
+#undef DEFINE_ENUM_LIST
+    kNumRecognizedMethods
+  };
+
+  static Kind RecognizeKind(const Function& function);
+  static bool AlwaysInline(const Function& function);
+  static bool PolymorphicTarget(const Function& function);
+  static const char* KindToCString(Kind kind);
+  static void InitializeState();
+};
+
+}  // namespace dart
+
+#endif  // VM_METHOD_RECOGNIZER_H_
diff --git a/runtime/vm/metrics.cc b/runtime/vm/metrics.cc
new file mode 100644
index 0000000..7687005
--- /dev/null
+++ b/runtime/vm/metrics.cc
@@ -0,0 +1,246 @@
+// 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.
+
+#include "vm/metrics.h"
+
+#include "vm/isolate.h"
+#include "vm/json_stream.h"
+#include "vm/native_entry.h"
+#include "vm/runtime_entry.h"
+#include "vm/object.h"
+
+namespace dart {
+
+Metric* Metric::vm_list_head_ = NULL;
+
+Metric::Metric()
+    : isolate_(NULL),
+      name_(NULL),
+      description_(NULL),
+      unit_(kCounter),
+      value_(0),
+      next_(NULL) {
+}
+
+
+void Metric::Init(Isolate* isolate,
+                  const char* name,
+                  const char* description,
+                  Unit unit) {
+  // Only called once.
+  ASSERT(next_ == NULL);
+  ASSERT(name != NULL);
+  isolate_ = isolate;
+  name_ = name;
+  description_ = description;
+  unit_ = unit;
+  RegisterWithIsolate();
+}
+
+
+void Metric::Init(const char* name, const char* description, Unit unit) {
+  // Only called once.
+  ASSERT(next_ == NULL);
+  ASSERT(name != NULL);
+  name_ = name;
+  description_ = description;
+  unit_ = unit;
+  RegisterWithVM();
+}
+
+
+Metric::~Metric() {
+  // Only deregister metrics which had been registered. Metrics without a name
+  // are from shallow copy isolates.
+  if (name_ != NULL) {
+    if (isolate_ == NULL) {
+      DeregisterWithVM();
+    } else {
+      DeregisterWithIsolate();
+    }
+  }
+}
+
+
+static const char* UnitString(intptr_t unit) {
+  switch (unit) {
+    case Metric::kCounter: return "counter";
+    case Metric::kByte: return "byte";
+    default:
+      UNREACHABLE();
+  }
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void Metric::PrintJSON(JSONStream* stream) {
+  JSONObject obj(stream);
+  obj.AddProperty("type", "Counter");
+  obj.AddProperty("name", name_);
+  obj.AddProperty("description", description_);
+  obj.AddProperty("unit", UnitString(unit()));
+  obj.AddPropertyF("id", "metrics/vm/%s", name_);
+  // TODO(johnmccutchan): Overflow?
+  double value_as_double = static_cast<double>(Value());
+  obj.AddProperty("value", value_as_double);
+}
+
+
+bool Metric::NameExists(Metric* head, const char* name) {
+  ASSERT(name != NULL);
+  while (head != NULL) {
+    const char* metric_name = head->name();
+    ASSERT(metric_name != NULL);
+    if (strcmp(metric_name, name) == 0) {
+      return true;
+    }
+    head = head->next();
+  }
+  return false;
+}
+
+
+
+void Metric::RegisterWithIsolate() {
+  ASSERT(isolate_ != NULL);
+  ASSERT(next_ == NULL);
+  // No duplicate names allowed.
+  ASSERT(!NameExists(isolate_->metrics_list_head(), name()));
+  Metric* head = isolate_->metrics_list_head();
+  if (head != NULL) {
+    set_next(head);
+  }
+  isolate_->set_metrics_list_head(this);
+}
+
+
+void Metric::DeregisterWithIsolate() {
+  Metric* head = isolate_->metrics_list_head();
+  ASSERT(head != NULL);
+  // Handle head of list case.
+  if (head == this) {
+    isolate_->set_metrics_list_head(next());
+    set_next(NULL);
+    return;
+  }
+  Metric* previous = NULL;
+  while (true) {
+    previous = head;
+    ASSERT(previous != NULL);
+    head = head->next();
+    if (head == NULL) {
+      break;
+    }
+    if (head == this) {
+      // Remove this from list.
+      previous->set_next(head->next());
+      set_next(NULL);
+      return;
+    }
+    ASSERT(head != NULL);
+  }
+  UNREACHABLE();
+}
+
+
+void Metric::RegisterWithVM() {
+  ASSERT(isolate_ == NULL);
+  ASSERT(next_ == NULL);
+  // No duplicate names allowed.
+  ASSERT(!NameExists(vm_list_head_, name()));
+  Metric* head = vm_list_head_;
+  if (head != NULL) {
+    set_next(head);
+  }
+  vm_list_head_ = this;
+}
+
+
+void Metric::DeregisterWithVM() {
+  ASSERT(isolate_ == NULL);
+  Metric* head = vm_list_head_;
+  if (head == NULL) {
+    return;
+  }
+  // Handle head of list case.
+  if (head == this) {
+    vm_list_head_ = next();
+    set_next(NULL);
+    return;
+  }
+  Metric* previous = NULL;
+  while (true) {
+    previous = head;
+    ASSERT(previous != NULL);
+    head = head->next();
+    if (head == NULL) {
+      break;
+    }
+    if (head == this) {
+      // Remove this from list.
+      previous->set_next(head->next());
+      set_next(NULL);
+      return;
+    }
+    ASSERT(head != NULL);
+  }
+  UNREACHABLE();
+}
+
+
+int64_t MetricHeapOldUsed::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->UsedInWords(Heap::kOld) * kWordSize;
+}
+
+
+int64_t MetricHeapOldCapacity::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->CapacityInWords(Heap::kOld) * kWordSize;
+}
+
+
+int64_t MetricHeapOldExternal::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->ExternalInWords(Heap::kOld) * kWordSize;
+}
+
+
+int64_t MetricHeapNewUsed::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->UsedInWords(Heap::kNew) * kWordSize;
+}
+
+
+int64_t MetricHeapNewCapacity::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->CapacityInWords(Heap::kNew) * kWordSize;
+}
+
+
+int64_t MetricHeapNewExternal::Value() const {
+  ASSERT(isolate() == Isolate::Current());
+  return isolate()->heap()->ExternalInWords(Heap::kNew) * kWordSize;
+}
+
+
+int64_t MetricIsolateCount::Value() const {
+  return Isolate::IsolateListLength();
+}
+
+#define VM_METRIC_VARIABLE(type, variable, name, unit)                         \
+  static type vm_metric_##variable##_;
+  VM_METRIC_LIST(VM_METRIC_VARIABLE);
+#undef VM_METRIC_VARIABLE
+
+
+void Metric::InitOnce() {
+#define VM_METRIC_INIT(type, variable, name, unit)                             \
+  vm_metric_##variable##_.Init(name, NULL, Metric::unit);
+  VM_METRIC_LIST(VM_METRIC_INIT);
+#undef VM_METRIC_INIT
+}
+
+}  // namespace dart
diff --git a/runtime/vm/metrics.h b/runtime/vm/metrics.h
new file mode 100644
index 0000000..ab58881
--- /dev/null
+++ b/runtime/vm/metrics.h
@@ -0,0 +1,141 @@
+// 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.
+
+#ifndef VM_METRICS_H_
+#define VM_METRICS_H_
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+class Isolate;
+class JSONStream;
+
+// Metrics for each isolate.
+#define ISOLATE_METRIC_LIST(V)                                                 \
+  V(MetricHeapOldUsed, HeapOldUsed, "heap.old.used", kByte)                    \
+  V(MetricHeapOldCapacity, HeapOldCapacity, "heap.old.capacity", kByte)        \
+  V(MetricHeapOldExternal, HeapOldExternal, "heap.old.external", kByte)        \
+  V(MetricHeapNewUsed, HeapNewUsed, "heap.new.used", kByte)                    \
+  V(MetricHeapNewCapacity, HeapNewCapacity, "heap.new.capacity", kByte)        \
+  V(MetricHeapNewExternal, HeapNewExternal, "heap.new.external", kByte)        \
+
+#define VM_METRIC_LIST(V)                                                      \
+  V(MetricIsolateCount, IsolateCount, "vm.isolate.count", kCounter)            \
+
+class Metric {
+ public:
+  enum Unit {
+    kCounter,
+    kByte,
+  };
+
+  Metric();
+
+  static void InitOnce();
+
+  // Initialize and register a metric for an isolate.
+  void Init(Isolate* isolate,
+            const char* name,
+            const char* description,
+            Unit unit);
+
+  // Initialize and register a metric for the VM.
+  void Init(const char* name,
+            const char* description,
+            Unit unit);
+
+  virtual ~Metric();
+
+  void PrintJSON(JSONStream* stream);
+
+  int64_t value() const { return value_; }
+  void set_value(int64_t value) { value_ = value; }
+
+  void increment() { value_++; }
+
+  Metric* next() const { return next_; }
+  void set_next(Metric* next) {
+    next_ = next;
+  }
+
+  const char* name() const { return name_; }
+  const char* description() const { return description_; }
+  Unit unit() const { return unit_; }
+
+  // Will be NULL for Metric that is VM-global.
+  Isolate* isolate() const { return isolate_; }
+
+  static Metric* vm_head() { return vm_list_head_; }
+
+ protected:
+  // Override to get a callback when value is serialized to JSON.
+  // Use this for metrics that produce their value on demand.
+  virtual int64_t Value() const { return value(); }
+
+ private:
+  Isolate* isolate_;
+  const char* name_;
+  const char* description_;
+  Unit unit_;
+  int64_t value_;
+  Metric* next_;
+
+  static bool NameExists(Metric* head, const char* name);
+
+  void RegisterWithIsolate();
+  void DeregisterWithIsolate();
+  void RegisterWithVM();
+  void DeregisterWithVM();
+
+  static Metric* vm_list_head_;
+  DISALLOW_COPY_AND_ASSIGN(Metric);
+};
+
+
+class MetricHeapOldUsed : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricHeapOldCapacity : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricHeapOldExternal : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricHeapNewUsed : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricHeapNewCapacity : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricHeapNewExternal : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+class MetricIsolateCount : public Metric {
+ protected:
+  virtual int64_t Value() const;
+};
+
+
+}  // namespace dart
+
+#endif  // VM_METRICS_H_
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
new file mode 100644
index 0000000..bfcd469
--- /dev/null
+++ b/runtime/vm/metrics_test.cc
@@ -0,0 +1,62 @@
+// 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.
+
+#include "platform/assert.h"
+
+#include "vm/dart_api_impl.h"
+#include "vm/dart_api_state.h"
+#include "vm/globals.h"
+#include "vm/json_stream.h"
+#include "vm/metrics.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+UNIT_TEST_CASE(Metric_Simple) {
+  Isolate* isolate = Isolate::Init(NULL);
+  EXPECT_EQ(isolate, Isolate::Current());
+  Metric metric;
+
+  // Initialize metric.
+  metric.Init(Isolate::Current(), "a.b.c", "foobar", Metric::kCounter);
+  EXPECT_EQ(0, metric.value());
+  metric.increment();
+  EXPECT_EQ(1, metric.value());
+  metric.set_value(44);
+  EXPECT_EQ(44, metric.value());
+}
+
+class MyMetric : public Metric {
+ protected:
+  int64_t Value() const {
+    // 99 bytes.
+    return 99;
+  }
+
+ public:
+  // Just used for testing.
+  int64_t LeakyValue() const { return Value(); }
+};
+
+UNIT_TEST_CASE(Metric_OnDemand) {
+  Isolate* isolate = Isolate::Init(NULL);
+  EXPECT_EQ(isolate, Isolate::Current());
+  MyMetric metric;
+
+  metric.Init(Isolate::Current(), "a.b.c", "foobar", Metric::kByte);
+  // value is still the default value.
+  EXPECT_EQ(0, metric.value());
+  // Call LeakyValue to confirm that Value returns constant 99.
+  EXPECT_EQ(99, metric.LeakyValue());
+
+  // Serialize to JSON.
+  JSONStream js;
+  metric.PrintJSON(&js);
+  const char* json = js.ToCString();
+  EXPECT_STREQ("{\"type\":\"Counter\",\"name\":\"a.b.c\",\"description\":"
+               "\"foobar\",\"unit\":\"byte\",\"id\":\"metrics\\/vm\\/a.b.c\""
+               ",\"value\":99.000000}", json);
+}
+
+}  // namespace dart
diff --git a/runtime/vm/mirrors_api_impl.cc b/runtime/vm/mirrors_api_impl.cc
index a608ea9..e5e667c 100644
--- a/runtime/vm/mirrors_api_impl.cc
+++ b/runtime/vm/mirrors_api_impl.cc
@@ -98,7 +98,6 @@
         if (func.kind() == RawFunction::kImplicitGetter ||
             func.kind() == RawFunction::kImplicitSetter ||
             func.kind() == RawFunction::kImplicitStaticFinalGetter ||
-            func.kind() == RawFunction::kStaticInitializer ||
             func.kind() == RawFunction::kMethodExtractor ||
             func.kind() == RawFunction::kNoSuchMethodDispatcher) {
           continue;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index eba4e8c..43d4593 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1549,6 +1549,11 @@
     jsobj.AddProperty("type", ref ? "@Null" : "Null");
     jsobj.AddProperty("id", "objects/null");
     jsobj.AddProperty("valueAsString", "null");
+    if (!ref) {
+      const Class& cls = Class::Handle(this->clazz());
+      jsobj.AddProperty("class", cls);
+      jsobj.AddProperty("size", raw()->Size());
+    }
   } else {
     PrintJSONImpl(stream, ref);
   }
@@ -2781,7 +2786,7 @@
   new_list = Array::New(patch_len + orig_len);
   for (intptr_t i = 0; i < patch_len; i++) {
     field ^= patch_list.At(i);
-    field.set_owner(*this);
+    field.set_owner(patch_class);
     member_name = field.name();
     // TODO(iposva): Verify non-public fields only.
 
@@ -4085,19 +4090,27 @@
 }
 
 
+static void AddNameProperties(JSONObject* jsobj,
+                              const String& name,
+                              const String& vm_name) {
+  jsobj->AddProperty("name", name.ToCString());
+  if (!name.Equals(vm_name)) {
+    jsobj->AddProperty("vmName", vm_name.ToCString());
+  }
+}
+
+
 void Class::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   if ((raw() == Class::null()) || (id() == kFreeListElement)) {
     jsobj.AddProperty("type", "Null");
     return;
   }
-  const char* internal_class_name = String::Handle(Name()).ToCString();
-  const char* pretty_class_name =
-      String::Handle(PrettyName()).ToCString();
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "classes/%" Pd "", id());
-  jsobj.AddProperty("name", internal_class_name);
-  jsobj.AddProperty("user_name", pretty_class_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (ref) {
     return;
   }
@@ -4167,24 +4180,15 @@
         GrowableObjectArray::Handle(direct_subclasses());
     if (!subclasses.IsNull()) {
       Class& subclass = Class::Handle();
-      if (!subclasses.IsNull()) {
-        for (intptr_t i = 0; i < subclasses.Length(); ++i) {
-          // TODO(turnidge): Use the Type directly once regis has added
-          // types to the vmservice.
-          subclass ^= subclasses.At(i);
-          subclasses_array.AddValue(subclass);
-        }
+      for (intptr_t i = 0; i < subclasses.Length(); ++i) {
+        // TODO(turnidge): Use the Type directly once regis has added
+        // types to the vmservice.
+        subclass ^= subclasses.At(i);
+        subclasses_array.AddValue(subclass);
       }
     }
   }
   {
-    JSONObject typesRef(&jsobj, "canonicalTypes");
-    typesRef.AddProperty("type", "@TypeList");
-    typesRef.AddPropertyF("id", "classes/%" Pd "/types", id());
-    jsobj.AddPropertyF("name", "canonical types of %s", internal_class_name);
-    jsobj.AddPropertyF("user_name", "canonical types of %s", pretty_class_name);
-  }
-  {
     ClassTable* class_table = Isolate::Current()->class_table();
     const ClassHeapStats* stats = class_table->StatsWithUpdatedSize(id());
     if (stats != NULL) {
@@ -4442,12 +4446,11 @@
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  const char* name = String::Handle(Name()).ToCString();
-  const char* pretty_name = String::Handle(PrettyName()).ToCString();
-  jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", pretty_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   jsobj.AddProperty("length", Length());
-  jsobj.AddProperty("num_instantiations", NumInstantiations());
+  jsobj.AddProperty("numInstantiations", NumInstantiations());
   if (ref) {
     return;
   }
@@ -5207,21 +5210,6 @@
 }
 
 
-RawField* Function::saved_static_field() const {
-  ASSERT(kind() == RawFunction::kStaticInitializer);
-  const Object& obj = Object::Handle(raw_ptr()->data_);
-  ASSERT(obj.IsField());
-  return Field::Cast(obj).raw();
-}
-
-
-void Function::set_saved_static_field(const Field& value) const {
-  ASSERT(kind() == RawFunction::kStaticInitializer);
-  ASSERT(raw_ptr()->data_ == Object::null());
-  set_data(value);
-}
-
-
 RawFunction* Function::parent_function() const {
   if (IsClosureFunction()) {
     const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -5246,7 +5234,6 @@
 RawFunction* Function::implicit_closure_function() const {
   if (IsClosureFunction() ||
       IsSignatureFunction() ||
-      IsStaticInitializerFunction() ||
       IsFactory()) {
     return Function::null();
   }
@@ -5340,9 +5327,6 @@
     case RawFunction::kImplicitStaticFinalGetter:
       return "kImplicitStaticFinalGetter";
       break;
-    case RawFunction::kStaticInitializer:
-      return "kStaticInitializer";
-      break;
     case RawFunction::kMethodExtractor:
       return "kMethodExtractor";
       break;
@@ -5499,8 +5483,10 @@
 }
 
 
-void Function::set_is_recognized(bool value) const {
-  set_kind_tag(RecognizedBit::update(value, raw_ptr()->kind_tag_));
+void Function::set_recognized_kind(MethodRecognizer::Kind value) const {
+  // Prevent multiple settings of kind.
+  ASSERT((value == MethodRecognizer::kUnknown) || !IsRecognized());
+  set_kind_tag(RecognizedBits::update(value, raw_ptr()->kind_tag_));
 }
 
 
@@ -5526,7 +5512,8 @@
 
 void Function::set_is_async_closure(bool value) const {
   set_kind_tag(AsyncClosureBit::update(value, raw_ptr()->kind_tag_));
-  set_is_optimizable(false);
+  // Prohibit inlining as the closure is used for implementing a continuation.
+  set_is_inlinable(false);
 }
 
 
@@ -5830,10 +5817,19 @@
 // name of a function in it, and replacing ':' by '_' to make sure the
 // constructed name is a valid C++ identifier for debugging purpose.
 // Set 'chars' to allocated buffer and return number of written characters.
-static intptr_t ConstructFunctionFullyQualifiedCString(const Function& function,
-                                                       char** chars,
-                                                       intptr_t reserve_len,
-                                                       bool with_lib) {
+
+enum QualifiedFunctionLibKind {
+  kQualifiedFunctionLibKindLibUrl,
+  kQualifiedFunctionLibKindLibName
+};
+
+
+static intptr_t ConstructFunctionFullyQualifiedCString(
+    const Function& function,
+    char** chars,
+    intptr_t reserve_len,
+    bool with_lib,
+    QualifiedFunctionLibKind lib_kind) {
   const char* name = String::Handle(function.name()).ToCString();
   const char* function_format = (reserve_len == 0) ? "%s" : "%s_";
   reserve_len += OS::SNPrint(NULL, 0, function_format, name);
@@ -5849,7 +5845,16 @@
     const char* library_name = NULL;
     const char* lib_class_format = NULL;
     if (with_lib) {
-      library_name = String::Handle(library.url()).ToCString();
+      switch (lib_kind) {
+        case kQualifiedFunctionLibKindLibUrl:
+          library_name = String::Handle(library.url()).ToCString();
+          break;
+        case kQualifiedFunctionLibKindLibName:
+          library_name = String::Handle(library.name()).ToCString();
+          break;
+        default:
+          UNREACHABLE();
+      }
       ASSERT(library_name != NULL);
       lib_class_format = (library_name[0] == '\0') ? "%s%s_" : "%s_%s_";
     } else {
@@ -5866,7 +5871,8 @@
     written = ConstructFunctionFullyQualifiedCString(parent,
                                                      chars,
                                                      reserve_len,
-                                                     with_lib);
+                                                     with_lib,
+                                                     lib_kind);
   }
   ASSERT(*chars != NULL);
   char* next = *chars + written;
@@ -5883,14 +5889,24 @@
 
 const char* Function::ToFullyQualifiedCString() const {
   char* chars = NULL;
-  ConstructFunctionFullyQualifiedCString(*this, &chars, 0, true);
+  ConstructFunctionFullyQualifiedCString(*this, &chars, 0, true,
+                                         kQualifiedFunctionLibKindLibUrl);
+  return chars;
+}
+
+
+const char* Function::ToLibNamePrefixedQualifiedCString() const {
+  char* chars = NULL;
+  ConstructFunctionFullyQualifiedCString(*this, &chars, 0, true,
+                                         kQualifiedFunctionLibKindLibName);
   return chars;
 }
 
 
 const char* Function::ToQualifiedCString() const {
   char* chars = NULL;
-  ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false);
+  ConstructFunctionFullyQualifiedCString(*this, &chars, 0, false,
+                                         kQualifiedFunctionLibKindLibUrl);
   return chars;
 }
 
@@ -6127,6 +6143,7 @@
   result.set_parameter_names(Object::empty_array());
   result.set_name(name);
   result.set_kind(kind);
+  result.set_recognized_kind(MethodRecognizer::kUnknown);
   result.set_modifier(RawFunction::kNoModifier);
   result.set_is_static(is_static);
   result.set_is_const(is_const);
@@ -6135,9 +6152,10 @@
   result.set_is_native(is_native);
   result.set_is_visible(true);  // Will be computed later.
   result.set_is_intrinsic(false);
-  result.set_is_recognized(false);
   result.set_is_redirecting(false);
   result.set_is_async_closure(false);
+  result.set_always_inline(false);
+  result.set_is_polymorphic_target(false);
   result.set_owner(owner);
   result.set_token_pos(token_pos);
   result.set_end_token_pos(token_pos);
@@ -6633,7 +6651,7 @@
   const Array& saved_icd = Array::Handle(isolate, ic_data_array());
   if (saved_icd.Length() == 0) {
     deopt_id_to_ic_data->Clear();
-    return;;
+    return;
   }
   ICData& icd = ICData::Handle();
   icd ^= saved_icd.At(saved_icd.Length() - 1);
@@ -6687,36 +6705,6 @@
 }
 
 
-RawFunction* Function::NewStaticInitializer(const Field& field) {
-  ASSERT(field.is_static());
-  const String& field_name = String::Handle(field.name());
-  const String& init_name =
-      String::Handle(Symbols::New(String::Handle(
-          String::Concat(Symbols::InitPrefix(), field_name))));
-  const Function& init_function = Function::ZoneHandle(
-      Function::New(init_name,
-                    RawFunction::kStaticInitializer,
-                    true,  // static
-                    false,  // !const
-                    false,  // !abstract
-                    false,  // !external
-                    false,  // !native
-                    Class::Handle(field.owner()),
-                    field.token_pos()));
-  init_function.set_result_type(AbstractType::Handle(field.type()));
-  // Static initializer functions are generated by the VM and are therfore
-  // hidden from the user. Since they are only executed once, we avoid
-  // optimizing and inlining them. After the field is initialized, the
-  // optimizing compiler can eliminate the call to the static initializer
-  // via constant folding.
-  init_function.set_is_visible(false);
-  init_function.SetIsOptimizable(false);
-  init_function.set_is_inlinable(false);
-  init_function.set_saved_static_field(field);
-  return init_function.raw();
-}
-
-
 const char* Function::ToCString() const {
   const char* static_str = is_static() ? " static" : "";
   const char* abstract_str = is_abstract() ? " abstract" : "";
@@ -6741,9 +6729,6 @@
     case RawFunction::kImplicitSetter:
       kind_str = " setter";
       break;
-    case RawFunction::kStaticInitializer:
-      kind_str = " static-initializer";
-      break;
     case RawFunction::kImplicitStaticFinalGetter:
       kind_str = " static-final-getter";
       break;
@@ -6770,45 +6755,54 @@
 }
 
 
+const char* GetFunctionServiceId(const Function& f, const Class& cls) {
+  Zone* zone = Isolate::Current()->current_zone();
+  // Special kinds of functions use indices in their respective lists.
+  intptr_t id = -1;
+  const char* selector = NULL;
+  if (f.IsNonImplicitClosureFunction()) {
+    id = cls.FindClosureIndex(f);
+    selector = "closures";
+  } else if (f.IsImplicitClosureFunction()) {
+    id = cls.FindImplicitClosureFunctionIndex(f);
+    selector = "implicit_closures";
+  } else if (f.IsNoSuchMethodDispatcher() || f.IsInvokeFieldDispatcher()) {
+    id = cls.FindInvocationDispatcherFunctionIndex(f);
+    selector = "dispatchers";
+  }
+  if (id != -1) {
+    ASSERT(selector != NULL);
+    return zone->PrintToString("classes/%" Pd "/%s/%" Pd "",
+                               cls.id(), selector, id);
+  }
+  // Regular functions known to their owner use their name (percent-encoded).
+  String& name = String::Handle(f.name());
+  if (cls.LookupFunction(name) == f.raw()) {
+    name = String::EncodeIRI(name);
+    return zone->PrintToString("classes/%" Pd "/functions/%s",
+                               cls.id(), name.ToCString());
+  }
+  // Oddball functions (not known to their owner) fall back to use the object
+  // id ring. Current known examples are signature functions of closures
+  // and stubs like 'megamorphic_miss'.
+  ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+  id = ring->GetIdForObject(f.raw());
+  return zone->PrintToString("objects/%" Pd "", id);
+}
+
+
 void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  const char* internal_name = String::Handle(name()).ToCString();
-  const char* pretty_name =
-      String::Handle(PrettyName()).ToCString();
   Class& cls = Class::Handle(Owner());
   ASSERT(!cls.IsNull());
   Error& err = Error::Handle();
   err ^= cls.EnsureIsFinalized(Isolate::Current());
   ASSERT(err.IsNull());
-  intptr_t id = -1;
-  const char* selector = NULL;
-  if (IsNonImplicitClosureFunction()) {
-    id = cls.FindClosureIndex(*this);
-    selector = "closures";
-  } else if (IsImplicitClosureFunction()) {
-    id = cls.FindImplicitClosureFunctionIndex(*this);
-    selector = "implicit_closures";
-  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
-    id = cls.FindInvocationDispatcherFunctionIndex(*this);
-    selector = "dispatchers";
-  } else {
-    id = cls.FindFunctionIndex(*this);
-    selector = "functions";
-  }
-  intptr_t cid = cls.id();
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
-  // TODO(17697): Oddball functions (functions without owners) use the object
-  // id ring. Current known examples are signature functions of closures
-  // and stubs like 'megamorphic_miss'.
-  if (id < 0) {
-    ObjectIdRing* ring = Isolate::Current()->object_id_ring();
-    id = ring->GetIdForObject(raw());
-    jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  } else {
-    jsobj.AddPropertyF("id", "classes/%" Pd "/%s/%" Pd "", cid, selector, id);
-  }
-  jsobj.AddProperty("name", internal_name);
-  jsobj.AddProperty("user_name", pretty_name);
+  jsobj.AddProperty("id", GetFunctionServiceId(*this, cls));
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (cls.IsTopLevel()) {
     const Library& library = Library::Handle(cls.library());
     jsobj.AddProperty("owningLibrary", library);
@@ -6824,13 +6818,13 @@
   if (ref) {
     return;
   }
-  jsobj.AddProperty("is_static", is_static());
-  jsobj.AddProperty("is_const", is_const());
-  jsobj.AddProperty("is_optimizable", is_optimizable());
-  jsobj.AddProperty("is_inlinable", IsInlineable());
-  jsobj.AddProperty("unoptimized_code", Object::Handle(unoptimized_code()));
-  jsobj.AddProperty("usage_counter", usage_counter());
-  jsobj.AddProperty("optimized_call_site_count", optimized_call_site_count());
+  jsobj.AddProperty("static", is_static());
+  jsobj.AddProperty("const", is_const());
+  jsobj.AddProperty("optimizable", is_optimizable());
+  jsobj.AddProperty("inlinable", IsInlineable());
+  jsobj.AddProperty("unoptimizedCode", Object::Handle(unoptimized_code()));
+  jsobj.AddProperty("usageCounter", usage_counter());
+  jsobj.AddProperty("optimizedCallSiteCount", optimized_call_site_count());
   jsobj.AddProperty("code", Object::Handle(CurrentCode()));
   jsobj.AddProperty("deoptimizations",
                     static_cast<intptr_t>(deoptimization_counter()));
@@ -7146,16 +7140,15 @@
 
 void Field::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  const char* internal_field_name = String::Handle(name()).ToCString();
-  const char* field_name = String::Handle(PrettyName()).ToCString();
   Class& cls = Class::Handle(owner());
   intptr_t id = cls.FindFieldIndex(*this);
   ASSERT(id >= 0);
   intptr_t cid = cls.id();
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "classes/%" Pd "/fields/%" Pd "", cid, id);
-  jsobj.AddProperty("name", internal_field_name);
-  jsobj.AddProperty("user_name", field_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (is_static()) {
     const Instance& valueObj = Instance::Handle(value());
     jsobj.AddProperty("value", valueObj);
@@ -7169,36 +7162,36 @@
   }
 
   AbstractType& declared_type = AbstractType::Handle(type());
-  jsobj.AddProperty("declared_type", declared_type);
+  jsobj.AddProperty("declaredType", declared_type);
   jsobj.AddProperty("static", is_static());
   jsobj.AddProperty("final", is_final());
   jsobj.AddProperty("const", is_const());
   if (ref) {
     return;
   }
-  jsobj.AddProperty("guard_nullable", is_nullable());
+  jsobj.AddProperty("guardNullable", is_nullable());
   if (guarded_cid() == kIllegalCid) {
-    jsobj.AddProperty("guard_class", "unknown");
+    jsobj.AddProperty("guardClass", "unknown");
   } else if (guarded_cid() == kDynamicCid) {
-    jsobj.AddProperty("guard_class", "dynamic");
+    jsobj.AddProperty("guardClass", "dynamic");
   } else {
     ClassTable* table = Isolate::Current()->class_table();
     ASSERT(table->IsValidIndex(guarded_cid()));
     cls ^= table->At(guarded_cid());
-    jsobj.AddProperty("guard_class", cls);
+    jsobj.AddProperty("guardClass", cls);
   }
   if (guarded_list_length() == kUnknownFixedLength) {
-    jsobj.AddProperty("guard_length", "unknown");
+    jsobj.AddProperty("guardLength", "unknown");
   } else if (guarded_list_length() == kNoFixedLength) {
-    jsobj.AddProperty("guard_length", "variable");
+    jsobj.AddProperty("guardLength", "variable");
   } else {
-    jsobj.AddProperty("guard_length", guarded_list_length());
+    jsobj.AddProperty("guardLength", guarded_list_length());
   }
   const Class& origin_cls = Class::Handle(origin());
   const Script& script = Script::Handle(origin_cls.script());
   if (!script.IsNull()) {
     jsobj.AddProperty("script", script);
-    jsobj.AddProperty("token_pos", token_pos());
+    jsobj.AddProperty("tokenPos", token_pos());
   }
 }
 
@@ -7268,6 +7261,33 @@
 }
 
 
+void Field::EvaluateInitializer() const {
+  ASSERT(is_static());
+  if (value() == Object::sentinel().raw()) {
+    set_value(Object::transition_sentinel());
+    Object& value = Object::Handle(Compiler::EvaluateStaticInitializer(*this));
+    if (value.IsError()) {
+      set_value(Object::null_instance());
+      Exceptions::PropagateError(Error::Cast(value));
+      UNREACHABLE();
+    }
+    ASSERT(value.IsNull() || value.IsInstance());
+    set_value(value.IsNull() ? Instance::null_instance()
+                             : Instance::Cast(value));
+    return;
+  } else if (value() == Object::transition_sentinel().raw()) {
+    set_value(Object::null_instance());
+    const Array& ctor_args = Array::Handle(Array::New(1));
+    const String& field_name = String::Handle(name());
+    ctor_args.SetAt(0, field_name);
+    Exceptions::ThrowByType(Exceptions::kCyclicInitializationError, ctor_args);
+    UNREACHABLE();
+    return;
+  }
+  UNREACHABLE();
+}
+
+
 static intptr_t GetListLength(const Object& value) {
   if (value.IsTypedData()) {
     const TypedData& list = TypedData::Cast(value);
@@ -7732,11 +7752,13 @@
   }
   uint8_t* data = reinterpret_cast<uint8_t*>(::malloc(len));
   ASSERT(data != NULL);
+  Isolate* isolate = Isolate::Current();
   const ExternalTypedData& stream = ExternalTypedData::Handle(
+      isolate,
       ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
                              data, len, Heap::kOld));
   stream.AddFinalizer(data, DataFinalizer);
-  const TokenStream& result = TokenStream::Handle(TokenStream::New());
+  const TokenStream& result = TokenStream::Handle(isolate, TokenStream::New());
   result.SetStream(stream);
   return result.raw();
 }
@@ -8452,12 +8474,11 @@
   jsobj.AddPropertyF("id", "libraries/%" Pd "/scripts/%s",
       lib_index, encoded_url.ToCString());
   jsobj.AddProperty("name", name.ToCString());
-  jsobj.AddProperty("user_name", name.ToCString());
   jsobj.AddProperty("kind", GetKindAsCString());
   if (ref) {
     return;
   }
-  jsobj.AddProperty("owning_library", lib);
+  jsobj.AddProperty("owningLibrary", lib);
   const String& source = String::Handle(Source());
   jsobj.AddProperty("source", source.ToCString());
 
@@ -9738,7 +9759,6 @@
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
-  jsobj.AddProperty("user_name", library_name);
   jsobj.AddProperty("name", library_name);
   const char* library_url = String::Handle(url()).ToCString();
   jsobj.AddProperty("url", library_url);
@@ -10333,7 +10353,7 @@
 
   all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
-  RECOGNIZED_LIST(CHECK_FINGERPRINTS);
+  OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS);
   INLINE_WHITE_LIST(CHECK_FINGERPRINTS);
   POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS);
 
@@ -10345,6 +10365,10 @@
   all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
   TYPED_DATA_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
 
+  all_libs.Clear();
+  all_libs.Add(&Library::ZoneHandle(Library::ProfilerLibrary()));
+  PROFILER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
+
 #undef CHECK_FINGERPRINTS
 
 Class& cls = Class::Handle();
@@ -11292,6 +11316,22 @@
 }
 
 
+// Discounts any checks with usage of zero.
+intptr_t ICData::NumberOfUsedChecks() const {
+  intptr_t n = NumberOfChecks();
+  if (n == 0) {
+    return 0;
+  }
+  intptr_t count = 0;
+  for (intptr_t i = 0; i < n; i++) {
+    if (GetCountAt(i) > 0) {
+      count++;
+    }
+  }
+  return count;
+}
+
+
 void ICData::WriteSentinel(const Array& data) const {
   ASSERT(!data.IsNull());
   for (intptr_t i = 1; i <= TestEntryLength(); i++) {
@@ -11329,14 +11369,18 @@
   ASSERT(!target.IsNull());
   if (NumArgsTested() > 0) {
     // Create a fake cid entry, so that we can store the target.
-    GrowableArray<intptr_t> class_ids(NumArgsTested());
-    for (intptr_t i = 0; i < NumArgsTested(); i++) {
-      class_ids.Add(kObjectCid);
+    if (NumArgsTested() == 1) {
+      AddReceiverCheck(kObjectCid, target, 1);
+    } else {
+      GrowableArray<intptr_t> class_ids(NumArgsTested());
+      for (intptr_t i = 0; i < NumArgsTested(); i++) {
+        class_ids.Add(kObjectCid);
+      }
+      AddCheck(class_ids, target);
     }
-    AddCheck(class_ids, target);
     return;
   }
-  ASSERT(NumArgsTested() >= 0);
+  ASSERT(NumArgsTested() == 0);
   // Can add only once.
   const intptr_t old_num = NumberOfChecks();
   ASSERT(old_num == 0);
@@ -11348,6 +11392,8 @@
   intptr_t data_pos = old_num * TestEntryLength();
   ASSERT(!target.IsNull());
   data.SetAt(data_pos++, target);
+  // Set count to 0 as this is called during compilation, before the
+  // call has been executed.
   const Smi& value = Smi::Handle(Smi::New(0));
   data.SetAt(data_pos, value);
 }
@@ -11356,6 +11402,7 @@
 void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids,
                       const Function& target) const {
   ASSERT(!target.IsNull());
+  ASSERT(target.name() == target_name());
   DEBUG_ASSERT(!HasCheck(class_ids));
   ASSERT(NumArgsTested() > 1);  // Otherwise use 'AddReceiverCheck'.
   ASSERT(class_ids.length() == NumArgsTested());
@@ -11567,6 +11614,9 @@
   for (intptr_t i = 0; i < len; i++) {
     const intptr_t class_id = GetClassIdAt(i, arg_nr);
     const intptr_t count = GetCountAt(i);
+    if (count == 0) {
+      continue;
+    }
     intptr_t duplicate_class_id = -1;
     const intptr_t result_len = result.NumberOfChecks();
     for (intptr_t k = 0; k < result_len; k++) {
@@ -11599,9 +11649,11 @@
   Class& cls = Class::Handle();
   const intptr_t len = NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
-    cls = Function::Handle(GetTargetAt(i)).Owner();
-    if (cls.id() != owner_cid) {
-      return false;
+    if (IsUsedAt(i)) {
+      cls = Function::Handle(GetTargetAt(i)).Owner();
+      if (cls.id() != owner_cid) {
+        return false;
+      }
     }
   }
   return true;
@@ -11613,13 +11665,15 @@
   Class& cls = Class::Handle();
   const intptr_t len = NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
-    cls = Function::Handle(GetTargetAt(i)).Owner();
-    const intptr_t cid = cls.id();
-    if ((cid != kSmiCid) &&
-        (cid != kMintCid) &&
-        (cid != kBigintCid) &&
-        (cid != kDoubleCid)) {
-      return false;
+    if (IsUsedAt(i)) {
+      cls = Function::Handle(GetTargetAt(i)).Owner();
+      const intptr_t cid = cls.id();
+      if ((cid != kSmiCid) &&
+          (cid != kMintCid) &&
+          (cid != kBigintCid) &&
+          (cid != kDoubleCid)) {
+        return false;
+      }
     }
   }
   return true;
@@ -11630,9 +11684,11 @@
   ASSERT(NumArgsTested() > 0);
   const intptr_t len = NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
-    const intptr_t test_class_id = GetReceiverClassIdAt(i);
-    if (test_class_id == class_id) {
-      return true;
+    if (IsUsedAt(i)) {
+      const intptr_t test_class_id = GetReceiverClassIdAt(i);
+      if (test_class_id == class_id) {
+        return true;
+      }
     }
   }
   return false;
@@ -11646,7 +11702,7 @@
   const Function& first_target = Function::Handle(GetTargetAt(0));
   const intptr_t len = NumberOfChecks();
   for (intptr_t i = 1; i < len; i++) {
-    if (GetTargetAt(i) != first_target.raw()) {
+    if (IsUsedAt(i) && (GetTargetAt(i) != first_target.raw())) {
       return false;
     }
   }
@@ -11654,6 +11710,42 @@
 }
 
 
+void ICData::GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first,
+                                   GrowableArray<intptr_t>* second) const {
+  ASSERT(NumArgsTested() == 2);
+  first->Clear();
+  second->Clear();
+  Function& target = Function::Handle();
+  GrowableArray<intptr_t> class_ids;
+  const intptr_t len = NumberOfChecks();
+  for (intptr_t i = 0; i < len; i++) {
+    if (GetCountAt(i) > 0) {
+      GetCheckAt(i, &class_ids, &target);
+      ASSERT(class_ids.length() == 2);
+      first->Add(class_ids[0]);
+      second->Add(class_ids[1]);
+    }
+  }
+}
+
+
+bool ICData::IsUsedAt(intptr_t i) const {
+  if (GetCountAt(i) <= 0) {
+    // Do not mistake unoptimized static call ICData for unused.
+    // See ICData::AddTarget.
+    // TODO(srdjan): Make this test more robust.
+    if (NumArgsTested() > 0) {
+      const intptr_t cid = GetReceiverClassIdAt(i);
+      if (cid == kObjectCid) {
+        return true;
+      }
+    }
+    return false;
+  }
+  return true;
+}
+
+
 RawICData* ICData::New(const Function& owner,
                        const String& target_name,
                        const Array& arguments_descriptor,
@@ -12022,9 +12114,10 @@
 RawCode* Code::FinalizeCode(const Function& function,
                             Assembler* assembler,
                             bool optimized) {
-  // Calling ToFullyQualifiedCString is very expensive, try to avoid it.
+  // Calling ToLibNamePrefixedQualifiedCString is very expensive,
+  // try to avoid it.
   if (CodeObservers::AreActive()) {
-    return FinalizeCode(function.ToFullyQualifiedCString(),
+    return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(),
                         assembler,
                         optimized);
   } else {
@@ -12182,13 +12275,12 @@
                      EntryPoint());
   jsobj.AddPropertyF("start", "%" Px "", EntryPoint());
   jsobj.AddPropertyF("end", "%" Px "", EntryPoint() + Size());
-  jsobj.AddProperty("isOptimized", is_optimized());
-  jsobj.AddProperty("isAlive", is_alive());
+  jsobj.AddProperty("optimized", is_optimized());
+  jsobj.AddProperty("alive", is_alive());
   jsobj.AddProperty("kind", "Dart");
-  const String& name = String::Handle(Name());
-  const String& pretty_name = String::Handle(PrettyName());
-  jsobj.AddProperty("name", name.ToCString());
-  jsobj.AddProperty("user_name", pretty_name.ToCString());
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   const Object& obj = Object::Handle(owner());
   if (obj.IsFunction()) {
     jsobj.AddProperty("function", obj);
@@ -12198,14 +12290,14 @@
     func.AddProperty("type", "@Function");
     func.AddProperty("kind", "Stub");
     func.AddPropertyF("id", "functions/stub-%" Pd "", EntryPoint());
-    func.AddProperty("user_name", pretty_name.ToCString());
-    func.AddProperty("name", name.ToCString());
+    func.AddProperty("name", user_name.ToCString());
+    AddNameProperties(&func, user_name, vm_name);
   }
   if (ref) {
     return;
   }
   const Array& array = Array::Handle(ObjectPool());
-  jsobj.AddProperty("object_pool", array);
+  jsobj.AddProperty("objectPool", array);
   {
     JSONArray jsarr(&jsobj, "disassembly");
     if (is_alive()) {
@@ -14588,20 +14680,19 @@
     ASSERT(id >= 0);
     intptr_t cid = type_cls.id();
     jsobj.AddPropertyF("id", "classes/%" Pd "/types/%" Pd "", cid, id);
-    jsobj.AddProperty("type_class", type_cls);
+    jsobj.AddProperty("typeClass", type_cls);
   } else {
     ObjectIdRing* ring = Isolate::Current()->object_id_ring();
     const intptr_t id = ring->GetIdForObject(raw());
     jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   }
-  const char* name = String::Handle(Name()).ToCString();
-  const char* pretty_name = String::Handle(PrettyName()).ToCString();
-  jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", pretty_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (ref) {
     return;
   }
-  jsobj.AddProperty("type_arguments", TypeArguments::Handle(arguments()));
+  jsobj.AddProperty("typeArguments", TypeArguments::Handle(arguments()));
 }
 
 
@@ -14758,14 +14849,13 @@
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  const char* name = String::Handle(Name()).ToCString();
-  const char* pretty_name = String::Handle(PrettyName()).ToCString();
-  jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", pretty_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (ref) {
     return;
   }
-  jsobj.AddProperty("ref_type", AbstractType::Handle(type()));
+  jsobj.AddProperty("refType", AbstractType::Handle(type()));
 }
 
 
@@ -14975,18 +15065,17 @@
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  const char* name = String::Handle(Name()).ToCString();
-  const char* pretty_name = String::Handle(PrettyName()).ToCString();
-  jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", pretty_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   const Class& param_cls = Class::Handle(parameterized_class());
-  jsobj.AddProperty("parameterized_class", param_cls);
+  jsobj.AddProperty("parameterizedClass", param_cls);
   if (ref) {
     return;
   }
   jsobj.AddProperty("index", index());
   const AbstractType& upper_bound = AbstractType::Handle(bound());
-  jsobj.AddProperty("upper_bound", upper_bound);
+  jsobj.AddProperty("upperBound", upper_bound);
 }
 
 
@@ -15179,15 +15268,14 @@
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  const char* name = String::Handle(Name()).ToCString();
-  const char* pretty_name = String::Handle(PrettyName()).ToCString();
-  jsobj.AddProperty("name", name);
-  jsobj.AddProperty("user_name", pretty_name);
+  const String& user_name = String::Handle(PrettyName());
+  const String& vm_name = String::Handle(Name());
+  AddNameProperties(&jsobj, user_name, vm_name);
   if (ref) {
     return;
   }
-  jsobj.AddProperty("bounded_type", AbstractType::Handle(type()));
-  jsobj.AddProperty("upper_bound", AbstractType::Handle(bound()));
+  jsobj.AddProperty("boundedType", AbstractType::Handle(type()));
+  jsobj.AddProperty("upperBound", AbstractType::Handle(bound()));
 }
 
 
@@ -15946,6 +16034,21 @@
 }
 
 
+RawString* Number::ToString(Heap::Space space) const {
+  // Refactoring can avoid Zone::Alloc and strlen, but gains are insignificant.
+  const char* cstr = ToCString();
+  intptr_t len = strlen(cstr);
+  // Resulting string is ASCII ...
+#ifdef DEBUG
+  for (intptr_t i = 0; i < len; ++i) {
+    ASSERT(static_cast<uint8_t>(cstr[i]) < 128);
+  }
+#endif  // DEBUG
+  // ... which is a subset of Latin-1.
+  return String::FromLatin1(reinterpret_cast<const uint8_t*>(cstr), len, space);
+}
+
+
 const char* Double::ToCString() const {
   if (isnan(value())) {
     return "NaN";
@@ -17907,7 +18010,7 @@
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/bool-%s", str);
-  class Class& cls = Class::Handle(this->clazz());
+  const Class& cls = Class::Handle(this->clazz());
   jsobj.AddProperty("class", cls);
   jsobj.AddPropertyF("valueAsString", "%s", str);
 }
@@ -18806,7 +18909,9 @@
 }
 
 
-RawReceivePort* ReceivePort::New(Dart_Port id, Heap::Space space) {
+RawReceivePort* ReceivePort::New(Dart_Port id,
+                                 bool is_control_port,
+                                 Heap::Space space) {
   Isolate* isolate = Isolate::Current();
   const SendPort& send_port = SendPort::Handle(isolate, SendPort::New(id));
 
@@ -18819,7 +18924,11 @@
     result ^= raw;
     result.raw_ptr()->send_port_ = send_port.raw();
   }
-  PortMap::SetLive(id);
+  if (is_control_port) {
+    PortMap::SetPortState(id, PortMap::kControlPort);
+  } else {
+    PortMap::SetPortState(id, PortMap::kLivePort);
+  }
   return result.raw();
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index cede5f6..9608f29 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -15,6 +15,7 @@
 #include "vm/handles.h"
 #include "vm/heap.h"
 #include "vm/isolate.h"
+#include "vm/method_recognizer.h"
 #include "vm/os.h"
 #include "vm/raw_object.h"
 #include "vm/report.h"
@@ -262,6 +263,7 @@
 
   bool IsNull() const { return raw_ == null_; }
 
+  // Matches Object.toString on instances (except String::ToCString, bug 20583).
   virtual const char* ToCString() const {
     if (IsNull()) {
       return "null";
@@ -690,6 +692,54 @@
 };
 
 
+class PassiveObject : public Object {
+ public:
+  void operator=(RawObject* value) {
+    raw_ = value;
+  }
+  void operator^=(RawObject* value) {
+    raw_ = value;
+  }
+  static PassiveObject& Handle(Isolate* I, RawObject* raw_ptr) {
+    PassiveObject* obj =
+        reinterpret_cast<PassiveObject*>(VMHandles::AllocateHandle(I));
+    obj->raw_ = raw_ptr;
+    obj->set_vtable(0);
+    return *obj;
+  }
+  static PassiveObject& Handle(RawObject* raw_ptr) {
+    return Handle(Isolate::Current(), raw_ptr);
+  }
+  static PassiveObject& Handle() {
+    return Handle(Isolate::Current(), Object::null());
+  }
+  static PassiveObject& Handle(Isolate* I) {
+    return Handle(I, Object::null());
+  }
+  static PassiveObject& ZoneHandle(Isolate* I, RawObject* raw_ptr) {
+    PassiveObject* obj = reinterpret_cast<PassiveObject*>(
+        VMHandles::AllocateZoneHandle(I));
+    obj->raw_ = raw_ptr;
+    obj->set_vtable(0);
+    return *obj;
+  }
+  static PassiveObject& ZoneHandle(RawObject* raw_ptr) {
+    return ZoneHandle(Isolate::Current(), raw_ptr);
+  }
+  static PassiveObject& ZoneHandle() {
+    return ZoneHandle(Isolate::Current(), Object::null());
+  }
+  static PassiveObject& ZoneHandle(Isolate* I) {
+    return ZoneHandle(I, Object::null());
+  }
+
+ private:
+  PassiveObject() : Object() {}
+  DISALLOW_ALLOCATION();
+  DISALLOW_COPY_AND_ASSIGN(PassiveObject);
+};
+
+
 class Class : public Object {
  public:
   intptr_t instance_size() const {
@@ -1627,9 +1677,6 @@
   void set_saved_args_desc(const Array& array) const;
   RawArray* saved_args_desc() const;
 
-  void set_saved_static_field(const Field& array) const;
-  RawField* saved_static_field() const;
-
   bool IsMethodExtractor() const {
     return kind() == RawFunction::kMethodExtractor;
   }
@@ -1702,7 +1749,6 @@
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
       case RawFunction::kImplicitStaticFinalGetter:
-      case RawFunction::kStaticInitializer:
         return false;
       default:
         UNREACHABLE();
@@ -1720,7 +1766,6 @@
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
       case RawFunction::kImplicitStaticFinalGetter:
-      case RawFunction::kStaticInitializer:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
@@ -1843,10 +1888,14 @@
   }
   void set_is_intrinsic(bool value) const;
 
-  bool is_recognized() const {
-    return RecognizedBit::decode(raw_ptr()->kind_tag_);
+  MethodRecognizer::Kind recognized_kind() const {
+    return RecognizedBits::decode(raw_ptr()->kind_tag_);
   }
-  void set_is_recognized(bool value) const;
+  void set_recognized_kind(MethodRecognizer::Kind value) const;
+
+  bool IsRecognized() const {
+    return recognized_kind() != MethodRecognizer::kUnknown;
+  }
 
   bool is_redirecting() const {
     return RedirectingBit::decode(raw_ptr()->kind_tag_);
@@ -1858,6 +1907,21 @@
   }
   void set_allows_hoisting_check_class(bool value) const;
 
+  bool always_inline() const {
+    return AlwaysInlineBit::decode(raw_ptr()->kind_tag_);
+  }
+  void set_always_inline(bool value) const {
+    set_kind_tag(AlwaysInlineBit::update(value, raw_ptr()->kind_tag_));
+  }
+
+  bool is_polymorphic_target() const {
+    return PolymorphicTargetBit::decode(raw_ptr()->kind_tag_);
+  }
+  void set_is_polymorphic_target(bool value) const {
+    set_kind_tag(PolymorphicTargetBit::update(value, raw_ptr()->kind_tag_));
+  }
+
+
   bool HasOptimizedCode() const;
 
   // Returns true if the argument counts are valid for calling this function.
@@ -1879,6 +1943,8 @@
   // ast printing. The special ':' character, if present, is replaced by '_'.
   const char* ToFullyQualifiedCString() const;
 
+  const char* ToLibNamePrefixedQualifiedCString() const;
+
   const char* ToQualifiedCString() const;
 
   // Returns true if this function has parameters that are compatible with the
@@ -1933,11 +1999,6 @@
     return kind() == RawFunction::kImplicitSetter;
   }
 
-  // Returns true if this function represents an static initializer function.
-  bool IsStaticInitializerFunction() const {
-    return kind() == RawFunction::kStaticInitializer;
-  }
-
   // Returns true if this function represents a (possibly implicit) closure
   // function.
   bool IsClosureFunction() const {
@@ -2004,10 +2065,6 @@
                                       const Script& script,
                                       bool is_static);
 
-  // Creates a new static initializer function which is invoked in the implicit
-  // static getter function.
-  static RawFunction* NewStaticInitializer(const Field& field);
-
   // Allocate new function object, clone values from this function. The
   // owner of the clone is new_owner.
   RawFunction* Clone(const Class& new_owner) const;
@@ -2040,23 +2097,38 @@
   enum KindTagBits {
     kKindTagPos = 0,
     kKindTagSize = 4,
-    kStaticBit = kKindTagPos + kKindTagSize,  // = 4
-    kConstBit = 5,
-    kAbstractBit = 6,
-    kVisibleBit = 7,
-    kOptimizableBit = 8,
-    kInlinableBit = 9,
-    kIntrinsicBit = 10,
-    kRecognizedBit = 11,
-    kNativeBit = 12,
-    kRedirectingBit = 13,
-    kExternalBit = 14,
-    kAllowsHoistingCheckClassBit = 15,
-    kModifierPos = 16,
-    kAsyncClosureBit = 17,
+    kRecognizedTagPos = kKindTagPos + kKindTagSize,
+    kRecognizedTagSize = 8,
+    // Single bit sized fields start here.
+    kStaticBit = kRecognizedTagPos + kRecognizedTagSize,
+    kConstBit,
+    kAbstractBit,
+    kVisibleBit,
+    kOptimizableBit,
+    kInlinableBit,
+    kIntrinsicBit,
+    kNativeBit,
+    kRedirectingBit,
+    kExternalBit,
+    kAllowsHoistingCheckClassBit,
+    kModifierPos,
+    kAsyncClosureBit,
+    kAlwaysInlineBit,
+    kPolymorphicTargetBit,
+    kNumTagBits
   };
+
+  COMPILE_ASSERT(
+      MethodRecognizer::kNumRecognizedMethods < (1 << kRecognizedTagSize));
+  COMPILE_ASSERT(
+      kNumTagBits <=
+      (kBitsPerByte * sizeof(static_cast<RawFunction*>(0)->kind_tag_)));
+
   class KindBits :
     public BitField<RawFunction::Kind, kKindTagPos, kKindTagSize> {};  // NOLINT
+  class RecognizedBits : public BitField<MethodRecognizer::Kind,
+                                         kRecognizedTagPos,
+                                         kRecognizedTagSize> {};
   class StaticBit : public BitField<bool, kStaticBit, 1> {};
   class ConstBit : public BitField<bool, kConstBit, 1> {};
   class AbstractBit : public BitField<bool, kAbstractBit, 1> {};
@@ -2064,7 +2136,6 @@
   class OptimizableBit : public BitField<bool, kOptimizableBit, 1> {};
   class InlinableBit : public BitField<bool, kInlinableBit, 1> {};
   class IntrinsicBit : public BitField<bool, kIntrinsicBit, 1> {};
-  class RecognizedBit : public BitField<bool, kRecognizedBit, 1> {};
   class NativeBit : public BitField<bool, kNativeBit, 1> {};
   class ExternalBit : public BitField<bool, kExternalBit, 1> {};
   class RedirectingBit : public BitField<bool, kRedirectingBit, 1> {};
@@ -2073,6 +2144,9 @@
   class ModifierBits :
       public BitField<RawFunction::AsyncModifier, kModifierPos, 1> {};  // NOLINT
   class AsyncClosureBit : public BitField<bool, kAsyncClosureBit, 1> {};
+  class AlwaysInlineBit : public BitField<bool, kAlwaysInlineBit, 1> {};
+  class PolymorphicTargetBit :
+      public BitField<bool, kPolymorphicTargetBit, 1> {};  // NOLINT
 
   void set_name(const String& value) const;
   void set_kind(RawFunction::Kind value) const;
@@ -2342,6 +2416,8 @@
 
   bool IsUninitialized() const;
 
+  void EvaluateInitializer() const;
+
   // Constructs getter and setter names for fields and vice versa.
   static RawString* GetterName(const String& field_name);
   static RawString* GetterSymbol(const String& field_name);
@@ -3423,6 +3499,9 @@
 
   intptr_t NumberOfChecks() const;
 
+  // Discounts any checks with usage of zero.
+  intptr_t NumberOfUsedChecks() const;
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawICData));
   }
@@ -3472,6 +3551,7 @@
 
   // Retrieving checks.
 
+  // TODO(srdjan): GetCheckAt without target.
   void GetCheckAt(intptr_t index,
                   GrowableArray<intptr_t>* class_ids,
                   Function* target) const;
@@ -3495,11 +3575,13 @@
 
   // Returns this->raw() if num_args_tested == 1 and arg_nr == 1, otherwise
   // returns a new ICData object containing only unique arg_nr checks.
+  // Returns only used entries.
   RawICData* AsUnaryClassChecksForArgNr(intptr_t arg_nr) const;
   RawICData* AsUnaryClassChecks() const {
     return AsUnaryClassChecksForArgNr(0);
   }
 
+  // Consider only used entries.
   bool AllTargetsHaveSameOwner(intptr_t owner_cid) const;
   bool AllReceiversAreNumbers() const;
   bool HasOneTarget() const;
@@ -3521,6 +3603,11 @@
     return (num_args + 1);
   }
 
+  bool IsUsedAt(intptr_t i) const;
+
+  void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first,
+                             GrowableArray<intptr_t>* second) const;
+
  private:
   RawArray* ic_data() const {
     return raw_ptr()->ic_data_;
@@ -5004,7 +5091,8 @@
 
 class Number : public Instance {
  public:
-  // TODO(iposva): Fill in a useful Number interface.
+  // TODO(iposva): Add more useful Number methods.
+  RawString* ToString(Heap::Space space) const;
 
  private:
   OBJECT_IMPLEMENTATION(Number, Instance);
@@ -6925,7 +7013,9 @@
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawReceivePort));
   }
-  static RawReceivePort* New(Dart_Port id, Heap::Space space = Heap::kNew);
+  static RawReceivePort* New(Dart_Port id,
+                             bool is_control_port,
+                             Heap::Space space = Heap::kNew);
 
  private:
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ReceivePort, Instance);
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index c0f6715..91a420c 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -301,4 +301,73 @@
   return visitor.length();
 }
 
+
+class InboundReferencesVisitor : public ObjectVisitor,
+                                 public ObjectPointerVisitor {
+ public:
+  // We cannot use a GrowableObjectArray, since we must not trigger GC.
+  InboundReferencesVisitor(Isolate* isolate,
+                           RawObject* target,
+                           const Array& references,
+                           Object* scratch)
+    : ObjectVisitor(isolate), ObjectPointerVisitor(isolate), source_(NULL),
+      target_(target), references_(references), scratch_(scratch), length_(0) {
+    ASSERT(Isolate::Current()->no_gc_scope_depth() != 0);
+  }
+
+  intptr_t length() const { return length_; }
+
+  virtual void VisitObject(RawObject* raw_obj) {
+    source_ = raw_obj;
+    raw_obj->VisitPointers(this);
+  }
+
+  virtual void VisitPointers(RawObject** first, RawObject** last) {
+    for (RawObject** current_ptr = first; current_ptr <= last; current_ptr++) {
+      RawObject* current_obj = *current_ptr;
+      if (current_obj == target_) {
+        intptr_t obj_index = length_ * 2;
+        intptr_t offset_index = obj_index + 1;
+        if (!references_.IsNull() && offset_index < references_.Length()) {
+          *scratch_ = source_;
+          references_.SetAt(obj_index, *scratch_);
+
+          *scratch_ = Smi::New(0);
+          uword source_start = RawObject::ToAddr(source_);
+          uword current_ptr_addr = reinterpret_cast<uword>(current_ptr);
+          intptr_t offset = current_ptr_addr - source_start;
+          if (offset > 0 && offset < source_->Size()) {
+            ASSERT(Utils::IsAligned(offset, kWordSize));
+            *scratch_ = Smi::New(offset >> kWordSizeLog2);
+          } else {
+            // Some internal VM objects visit pointers not contained within the
+            // parent. For instance, RawCode::VisitCodePointers visits pointers
+            // in instructions.
+            ASSERT(!source_->IsDartInstance());
+            *scratch_ = Smi::New(-1);
+          }
+          references_.SetAt(offset_index, *scratch_);
+        }
+        ++length_;
+      }
+    }
+  }
+
+ private:
+  RawObject* source_;
+  RawObject* target_;
+  const Array& references_;
+  Object* scratch_;
+  intptr_t length_;
+};
+
+
+intptr_t ObjectGraph::InboundReferences(Object* obj, const Array& references) {
+  Object& scratch = Object::Handle();
+  NoGCScope no_gc_scope_;
+  InboundReferencesVisitor visitor(isolate(), obj->raw(), references, &scratch);
+  isolate()->heap()->IterateObjects(&visitor);
+  return visitor.length();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index 580698d..5822c7d 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -81,6 +81,14 @@
   // provided handle was the only way to reach the object), zero is returned.
   intptr_t RetainingPath(Object* obj, const Array& path);
 
+  // Find the objects that reference 'obj'. Populates the provided array with
+  // pairs of (object pointing to 'obj', offset of pointer in words), as far as
+  // there is room. Returns the number of objects found.
+  //
+  // An object for which this function answers no inbound references might still
+  // be live due to references from the stack or embedder handles.
+  intptr_t InboundReferences(Object* obj, const Array& references);
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
 };
diff --git a/runtime/vm/object_id_ring.cc b/runtime/vm/object_id_ring.cc
index fd06988..0b396e8 100644
--- a/runtime/vm/object_id_ring.cc
+++ b/runtime/vm/object_id_ring.cc
@@ -26,18 +26,26 @@
 
 
 int32_t ObjectIdRing::GetIdForObject(RawObject* object) {
+  // We do not allow inserting null because null is how we detect as entry was
+  // reclaimed by the GC.
+  ASSERT(object != Object::null());
   return AllocateNewId(object);
 }
 
 
-RawObject* ObjectIdRing::GetObjectForId(int32_t id) {
+RawObject* ObjectIdRing::GetObjectForId(int32_t id, LookupResult* kind) {
   int32_t index = IndexOfId(id);
   if (index == kInvalidId) {
-    // Return sentinel to allow caller to distinguish expired ids.
-    return Object::sentinel().raw();
+    *kind = kExpired;
+    return Object::null();
   }
   ASSERT(index >= 0);
   ASSERT(index < capacity_);
+  if (table_[index] == Object::null()) {
+    *kind = kCollected;
+    return Object::null();
+  }
+  *kind = kValid;
   return table_[index];
 }
 
diff --git a/runtime/vm/object_id_ring.h b/runtime/vm/object_id_ring.h
index ee9038d..a7acb76 100644
--- a/runtime/vm/object_id_ring.h
+++ b/runtime/vm/object_id_ring.h
@@ -19,6 +19,13 @@
 // ids will be invalidated.
 class ObjectIdRing {
  public:
+  enum LookupResult {
+    kValid = 0,
+    kInvalid,    // Malformed ring id (used in service.cc).
+    kCollected,  // Entry was reclaimed due to a full GC (entries are weak).
+    kExpired,    // Entry was evicted during an insertion into a full ring.
+  };
+
   static const int32_t kMaxId = 0x3FFFFFFF;
   static const int32_t kInvalidId = -1;
   static const int32_t kDefaultCapacity = 1024;
@@ -27,10 +34,12 @@
 
   ~ObjectIdRing();
 
+  // Adds the argument to the ring and returns its id. Note we do not allow
+  // adding Object::null().
   int32_t GetIdForObject(RawObject* raw_obj);
 
-  // Returns Object::sentinel() when the id is not valid.
-  RawObject* GetObjectForId(int32_t id);
+  // Returns Object::null() when the result is not kValid.
+  RawObject* GetObjectForId(int32_t id, LookupResult* kind);
 
   void VisitPointers(ObjectPointerVisitor* visitor);
 
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index aeae8e2..745ec14 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -45,12 +45,14 @@
   ObjectIdRing* ring = isolate->object_id_ring();
   ObjectIdRingTestHelper::SetCapacityAndMaxSerial(ring, 2, 4);
   intptr_t id;
+  ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
   id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("0"));
   EXPECT_EQ(0, id);
   id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("1"));
   EXPECT_EQ(1, id);
   // Test that id 1 gives us the "1" string.
-  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "1");
+  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "1");
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1);
   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
@@ -69,14 +71,16 @@
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3);
   id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("4"));
   EXPECT_EQ(0, id);
-  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "4");
+  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "4");
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 1);
   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 3);
   id = ring->GetIdForObject(ObjectIdRingTestHelper::MakeString("5"));
   EXPECT_EQ(1, id);
-  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id), "5");
+  ObjectIdRingTestHelper::ExpectString(ring->GetObjectForId(id, &kind), "5");
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 0);
   ObjectIdRingTestHelper::ExpectIdIsValid(ring, 1);
   ObjectIdRingTestHelper::ExpectIdIsInvalid(ring, 2);
@@ -101,6 +105,7 @@
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
   ObjectIdRing* ring = isolate->object_id_ring();
+  ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
   RawObject* raw_obj = Api::UnwrapHandle(result);
   // Located in new heap.
   EXPECT(raw_obj->IsNewObject());
@@ -109,23 +114,22 @@
   EXPECT_EQ(0, raw_obj_id1);
   intptr_t raw_obj_id2 = ring->GetIdForObject(raw_obj);
   EXPECT_EQ(1, raw_obj_id2);
-  intptr_t raw_obj_id3 = ring->GetIdForObject(Object::null());
-  RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1);
-  RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2);
-  RawObject* raw_obj3 = ring->GetObjectForId(raw_obj_id3);
+  RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
+  RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
   EXPECT_NE(Object::null(), raw_obj1);
   EXPECT_NE(Object::null(), raw_obj2);
-  EXPECT_EQ(Object::null(), raw_obj3);
   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
   EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
   // Force a scavenge.
   heap->CollectGarbage(Heap::kNew);
-  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1);
-  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2);
-  RawObject* raw_object_moved3 = ring->GetObjectForId(raw_obj_id3);
+  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
+  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
   EXPECT_NE(Object::null(), raw_object_moved1);
   EXPECT_NE(Object::null(), raw_object_moved2);
-  EXPECT_EQ(Object::null(), raw_object_moved3);
   EXPECT_EQ(RawObject::ToAddr(raw_object_moved1),
             RawObject::ToAddr(raw_object_moved2));
   // Test that objects have moved.
@@ -147,6 +151,7 @@
   Heap* heap = isolate->heap();
   ObjectIdRing* ring = isolate->object_id_ring();
 
+  ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
   intptr_t raw_obj_id1 = -1;
   intptr_t raw_obj_id2 = -1;
   {
@@ -169,8 +174,10 @@
     EXPECT_EQ(0, raw_obj_id1);
     raw_obj_id2 = ring->GetIdForObject(raw_obj);
     EXPECT_EQ(1, raw_obj_id2);
-    RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1);
-    RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2);
+    RawObject* raw_obj1 = ring->GetObjectForId(raw_obj_id1, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    RawObject* raw_obj2 = ring->GetObjectForId(raw_obj_id2, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
     EXPECT_NE(Object::null(), raw_obj1);
     EXPECT_NE(Object::null(), raw_obj2);
     EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
@@ -182,11 +189,45 @@
   // collected and the object id ring will now return the null object for
   // those ids.
   heap->CollectGarbage(Heap::kOld);
-  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1);
-  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2);
-  // Objects should now be null.
+  RawObject* raw_object_moved1 = ring->GetObjectForId(raw_obj_id1, &kind);
+  EXPECT_EQ(ObjectIdRing::kCollected, kind);
   EXPECT_EQ(Object::null(), raw_object_moved1);
+  RawObject* raw_object_moved2 = ring->GetObjectForId(raw_obj_id2, &kind);
+  EXPECT_EQ(ObjectIdRing::kCollected, kind);
   EXPECT_EQ(Object::null(), raw_object_moved2);
 }
 
+
+// Test that the ring table correctly reports an entry as expired when it is
+// overridden by new entries.
+TEST_CASE(ObjectIdRingExpiredEntryTest) {
+  Isolate* isolate = Isolate::Current();
+  ObjectIdRing* ring = isolate->object_id_ring();
+
+  // Insert an object and check we can look it up.
+  String& obj = String::Handle(String::New("I will expire"));
+  intptr_t obj_id = ring->GetIdForObject(obj.raw());
+  ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
+  RawObject* obj_lookup = ring->GetObjectForId(obj_id, &kind);
+  EXPECT_EQ(ObjectIdRing::kValid, kind);
+  EXPECT_EQ(obj.raw(), obj_lookup);
+
+  // Insert as many new objects as the ring size to bump out our first entry.
+  Object& new_obj = Object::Handle();
+  for (intptr_t i = 0; i < ObjectIdRing::kDefaultCapacity; i++) {
+    new_obj = String::New("Bump");
+    intptr_t new_obj_id = ring->GetIdForObject(new_obj.raw());
+    ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
+    RawObject* new_obj_lookup = ring->GetObjectForId(new_obj_id, &kind);
+    EXPECT_EQ(ObjectIdRing::kValid, kind);
+    EXPECT_EQ(new_obj.raw(), new_obj_lookup);
+  }
+
+  // Check our first entry reports it has expired.
+  obj_lookup = ring->GetObjectForId(obj_id, &kind);
+  EXPECT_EQ(ObjectIdRing::kExpired, kind);
+  EXPECT_NE(obj.raw(), obj_lookup);
+  EXPECT_EQ(Object::null(), obj_lookup);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 7f2b0c2..223d99e 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2934,7 +2934,7 @@
   Function& function = Function::Handle(GetDummyTarget("Bern"));
   const intptr_t id = 12;
   const intptr_t num_args_tested = 1;
-  const String& target_name = String::Handle(String::New("Thun"));
+  const String& target_name = String::Handle(Symbols::New("Thun"));
   const Array& args_descriptor =
       Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
   ICData& o1 = ICData::Handle();
@@ -2949,6 +2949,7 @@
   const Function& target1 = Function::Handle(GetDummyTarget("Thun"));
   o1.AddReceiverCheck(kSmiCid, target1);
   EXPECT_EQ(1, o1.NumberOfChecks());
+  EXPECT_EQ(1, o1.NumberOfUsedChecks());
   intptr_t test_class_id = -1;
   Function& test_target = Function::Handle();
   o1.GetOneClassCheckAt(0, &test_class_id, &test_target);
@@ -2964,11 +2965,17 @@
   const Function& target2 = Function::Handle(GetDummyTarget("Thun"));
   o1.AddReceiverCheck(kDoubleCid, target2);
   EXPECT_EQ(2, o1.NumberOfChecks());
+  EXPECT_EQ(2, o1.NumberOfUsedChecks());
   o1.GetOneClassCheckAt(1, &test_class_id, &test_target);
   EXPECT_EQ(kDoubleCid, test_class_id);
   EXPECT_EQ(target2.raw(), test_target.raw());
   EXPECT_EQ(kDoubleCid, o1.GetCidAt(1));
 
+  o1.AddReceiverCheck(kMintCid, target2);
+  EXPECT_EQ(3, o1.NumberOfUsedChecks());
+  o1.SetCountAt(o1.NumberOfChecks() - 1, 0);
+  EXPECT_EQ(2, o1.NumberOfUsedChecks());
+
   ICData& o2 = ICData::Handle();
   o2 = ICData::New(function, target_name, args_descriptor, 57, 2);
   EXPECT_EQ(2, o2.NumArgsTested());
@@ -4169,10 +4176,11 @@
 }
 
 
-class JSONTypeVerifier : public ObjectVisitor {
+class ObjectAccumulator : public ObjectVisitor {
  public:
-  JSONTypeVerifier() : ObjectVisitor(Isolate::Current()) {}
-  virtual ~JSONTypeVerifier() { }
+  explicit ObjectAccumulator(GrowableArray<Object*>* objects)
+      : ObjectVisitor(Isolate::Current()), objects_(objects) {}
+  virtual ~ObjectAccumulator() { }
   virtual void VisitObject(RawObject* obj) {
     // Free-list elements cannot even be wrapped in handles.
     if (obj->IsFreeListElement()) {
@@ -4185,18 +4193,24 @@
         handle.IsLiteralToken()) {
       return;
     }
-    JSONStream js;
-    handle.PrintJSON(&js, false);
-    EXPECT_SUBSTRING("\"type\":", js.ToCString());
+    objects_->Add(&handle);
   }
+ private:
+  GrowableArray<Object*>* objects_;
 };
 
 
 TEST_CASE(PrintJSON) {
   Heap* heap = Isolate::Current()->heap();
   heap->CollectAllGarbage();
-  JSONTypeVerifier verifier;
-  heap->IterateObjects(&verifier);
+  GrowableArray<Object*> objects;
+  ObjectAccumulator acc(&objects);
+  heap->IterateObjects(&acc);
+  for (intptr_t i = 0; i < objects.length(); ++i) {
+    JSONStream js;
+    objects[i]->PrintJSON(&js, false);
+    EXPECT_SUBSTRING("\"type\":", js.ToCString());
+  }
 }
 
 
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index d28f002..7a31892 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -151,16 +151,12 @@
     if ((file_open == NULL) || (file_write == NULL) || (file_close == NULL)) {
       return;
     }
-    // The Jitdump code observer writes all jitted code into
-    // /tmp/jit-<pid>.dump, we open the file once on initialization and close
-    // it when the VM is going down.
+    // The Jitdump code observer writes all jitted code into the file
+    // 'perf.jitdump' in the current working directory. We open the file once
+    // on initialization and close it when the VM is going down.
     {
       // Open the file.
-      const char* format = "/tmp/jit-%" Pd ".dump";
-      intptr_t pid = getpid();
-      intptr_t len = OS::SNPrint(NULL, 0, format, pid);
-      char* filename = new char[len + 1];
-      OS::SNPrint(filename, len + 1, format, pid);
+      const char* filename = "perf.jitdump";
       out_file_ = (*file_open)(filename, true);
       ASSERT(out_file_ != NULL);
       // Write the jit dump header.
@@ -202,8 +198,9 @@
   }
 
  private:
-  static const uint32_t kJitHeaderMagic = 0x4F74496A;
-  static const uint32_t kJitHeaderVersion = 0x2;
+  static const uint32_t kJitHeaderMagic = 0x4A695444;
+  static const uint32_t kJitHeaderMagicSw = 0x4454694A;
+  static const uint32_t kJitHeaderVersion = 0x1;
   static const uint32_t kElfMachIA32 = 3;
   static const uint32_t kElfMachX64 = 62;
   static const uint32_t kElfMachARM = 40;
@@ -213,34 +210,38 @@
   static const int kInvalidClockId = -1;
 
   struct jitheader {
-    uint32_t magic;
-    uint32_t version;
+    uint32_t magic;   /* characters "jItD" */
+    uint32_t version; /* header version */
+    uint32_t total_size;  /* total size of header */
+    uint32_t elf_mach;  /* elf mach target */
+    uint32_t pad1;    /* reserved */
+    uint32_t pid;   /* JIT process id */
+    uint64_t timestamp; /* timestamp */
+  };
+
+  /* record prefix (mandatory in each record) */
+  struct jr_prefix {
+    uint32_t id;
     uint32_t total_size;
-    uint32_t elf_mach;
-    uint32_t pad1;
-    uint32_t pid;
     uint64_t timestamp;
   };
 
   enum jit_record_type {
     JIT_CODE_LOAD = 0,
-    /* JIT_CODE_UNLOAD = 1, */
-    /* JIT_CODE_CLOSE = 2, */
-    /* JIT_CODE_DEBUG_INFO = 3, */
+    /* JIT_CODE_MOVE = 1, */
+    /* JIT_CODE_DEBUG_INFO = 2, */
+    /* JIT_CODE_CLOSE = 3, */
     JIT_CODE_MAX = 4,
   };
 
   struct jr_code_load {
-    uint32_t id;
-    uint32_t total_size;
-    uint64_t timestamp;
+    struct jr_prefix prefix;
     uint32_t pid;
     uint32_t tid;
     uint64_t vma;
     uint64_t code_addr;
-    uint32_t code_size;
+    uint64_t code_size;
     uint64_t code_index;
-    uint32_t align;
   };
 
   const char* GenerateCodeName(const char* name, bool optimized) {
@@ -296,7 +297,7 @@
     header.magic = kJitHeaderMagic;
     header.version = kJitHeaderVersion;
     header.total_size = sizeof(jitheader);
-    header.pad1 = 0xdeadbeef;
+    header.pad1 = 0x0;
     header.elf_mach = GetElfMach();
     header.pid = getpid();
     header.timestamp = GetKernelTimeNanos();
@@ -317,15 +318,15 @@
     uint8_t* code_pointer = reinterpret_cast<uint8_t*>(base);
 
     jr_code_load code_load;
-    code_load.id = JIT_CODE_LOAD;
-    code_load.total_size = sizeof(code_load) + code_name_size + code_size;
-    code_load.timestamp = GetKernelTimeNanos();
+    code_load.prefix.id = JIT_CODE_LOAD;
+    code_load.prefix.total_size =
+        sizeof(code_load) + code_name_size + code_size;
+    code_load.prefix.timestamp = GetKernelTimeNanos();
     code_load.pid = getpid();
     code_load.tid = gettid();
     code_load.vma = 0x0;  //  Our addresses are absolute.
     code_load.code_addr = base;
     code_load.code_size = code_size;
-    code_load.align = OS::PreferredCodeAlignment();
 
     {
       MutexLocker ml(CodeObservers::mutex());
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 3b84f80..cf6870e 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -8,7 +8,9 @@
 #include "vm/compiler_stats.h"
 #include "vm/gc_marker.h"
 #include "vm/gc_sweeper.h"
+#include "vm/lockers.h"
 #include "vm/object.h"
+#include "vm/thread.h"
 #include "vm/virtual_memory.h"
 
 namespace dart {
@@ -31,7 +33,8 @@
             "Emit a log message when pointers to unused code are dropped.");
 DEFINE_FLAG(bool, always_drop_code, false,
             "Always try to drop code if the function's usage counter is >= 0");
-DECLARE_FLAG(bool, write_protect_code);
+DEFINE_FLAG(bool, concurrent_sweep, false,
+            "Concurrent sweep for old generation.");
 
 HeapPage* HeapPage::Initialize(VirtualMemory* memory, PageType type) {
   ASSERT(memory->size() > VirtualMemory::PageSize());
@@ -120,11 +123,15 @@
 PageSpace::PageSpace(Heap* heap, intptr_t max_capacity_in_words)
     : freelist_(),
       heap_(heap),
+      pages_lock_(new Mutex()),
       pages_(NULL),
       pages_tail_(NULL),
+      exec_pages_(NULL),
+      exec_pages_tail_(NULL),
       large_pages_(NULL),
       max_capacity_in_words_(max_capacity_in_words),
-      sweeping_(false),
+      tasks_lock_(new Monitor()),
+      tasks_(0),
       page_space_controller_(heap,
                              FLAG_heap_growth_space_ratio,
                              FLAG_heap_growth_rate,
@@ -135,8 +142,17 @@
 
 
 PageSpace::~PageSpace() {
+  {
+    MonitorLocker ml(tasks_lock());
+    while (tasks() > 0) {
+      ml.Wait();
+    }
+  }
   FreePages(pages_);
+  FreePages(exec_pages_);
   FreePages(large_pages_);
+  delete pages_lock_;
+  delete tasks_lock_;
 }
 
 
@@ -149,20 +165,31 @@
 
 HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
   HeapPage* page = HeapPage::Allocate(kPageSizeInWords, type);
-  if (pages_ == NULL) {
-    pages_ = page;
+
+  bool is_exec = (type == HeapPage::kExecutable);
+
+  MutexLocker ml(pages_lock_);
+  if (!is_exec) {
+    if (pages_ == NULL) {
+      pages_ = page;
+    } else {
+      pages_tail_->set_next(page);
+    }
+    pages_tail_ = page;
   } else {
-    const bool is_protected = (pages_tail_->type() == HeapPage::kExecutable)
-        && FLAG_write_protect_code;
-    if (is_protected) {
-      pages_tail_->WriteProtect(false);
+    if (exec_pages_ == NULL) {
+      exec_pages_ = page;
+    } else {
+      if (FLAG_write_protect_code) {
+        exec_pages_tail_->WriteProtect(false);
+      }
+      exec_pages_tail_->set_next(page);
+      if (FLAG_write_protect_code) {
+        exec_pages_tail_->WriteProtect(true);
+      }
     }
-    pages_tail_->set_next(page);
-    if (is_protected) {
-      pages_tail_->WriteProtect(true);
-    }
+    exec_pages_tail_ = page;
   }
-  pages_tail_ = page;
   usage_.capacity_in_words += kPageSizeInWords;
   page->set_object_end(page->memory_->end());
   return page;
@@ -201,15 +228,31 @@
 
 
 void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) {
-  usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2);
-  // Remove the page from the list.
-  if (previous_page != NULL) {
-    previous_page->set_next(page->next());
-  } else {
-    pages_ = page->next();
-  }
-  if (page == pages_tail_) {
-    pages_tail_ = previous_page;
+  bool is_exec = (page->type() == HeapPage::kExecutable);
+  {
+    MutexLocker ml(pages_lock_);
+    usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2);
+    if (!is_exec) {
+      // Remove the page from the list of data pages.
+      if (previous_page != NULL) {
+        previous_page->set_next(page->next());
+      } else {
+        pages_ = page->next();
+      }
+      if (page == pages_tail_) {
+        pages_tail_ = previous_page;
+      }
+    } else {
+      // Remove the page from the list of executable pages.
+      if (previous_page != NULL) {
+        previous_page->set_next(page->next());
+      } else {
+        exec_pages_ = page->next();
+      }
+      if (page == exec_pages_tail_) {
+        exec_pages_tail_ = previous_page;
+      }
+    }
   }
   // TODO(iposva): Consider adding to a pool of empty pages.
   page->Deallocate();
@@ -238,18 +281,22 @@
 }
 
 
-uword PageSpace::TryAllocate(intptr_t size,
-                             HeapPage::PageType type,
-                             GrowthPolicy growth_policy) {
+uword PageSpace::TryAllocateInternal(intptr_t size,
+                            HeapPage::PageType type,
+                            GrowthPolicy growth_policy,
+                            bool is_protected,
+                            bool is_locked) {
   ASSERT(size >= kObjectAlignment);
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uword result = 0;
   SpaceUsage after_allocation = usage_;
   after_allocation.used_in_words += size >> kWordSizeLog2;
   if (size < kAllocatablePageSize) {
-    const bool is_protected = (type == HeapPage::kExecutable)
-        && FLAG_write_protect_code;
-    result = freelist_[type].TryAllocate(size, is_protected);
+    if (is_locked) {
+      result = freelist_[type].TryAllocateLocked(size, is_protected);
+    } else {
+      result = freelist_[type].TryAllocate(size, is_protected);
+    }
     if (result == 0) {
       // Can we grow by one page?
       after_allocation.capacity_in_words += kPageSizeInWords;
@@ -264,7 +311,11 @@
         uword free_start = result + size;
         intptr_t free_size = page->object_end() - free_start;
         if (free_size > 0) {
-          freelist_[type].Free(free_start, free_size);
+          if (is_locked) {
+            freelist_[type].FreeLocked(free_start, free_size);
+          } else {
+            freelist_[type].Free(free_start, free_size);
+          }
         }
       }
     }
@@ -296,6 +347,16 @@
 }
 
 
+  void PageSpace::AcquireDataLock() {
+    freelist_[HeapPage::kData].mutex()->Lock();
+  }
+
+
+  void PageSpace::ReleaseDataLock() {
+    freelist_[HeapPage::kData].mutex()->Unlock();
+  }
+
+
 void PageSpace::AllocateExternal(intptr_t size) {
   intptr_t size_in_words = size >> kWordSizeLog2;
   usage_.external_in_words += size_in_words;
@@ -310,6 +371,8 @@
 
 
 bool PageSpace::Contains(uword addr) const {
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     if (page->Contains(addr)) {
@@ -322,6 +385,8 @@
 
 
 bool PageSpace::Contains(uword addr, HeapPage::PageType type) const {
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     if ((page->type() == type) && page->Contains(addr)) {
@@ -334,7 +399,9 @@
 
 
 void PageSpace::StartEndAddress(uword* start, uword* end) const {
-  ASSERT(pages_ != NULL || large_pages_ != NULL);
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
+  ASSERT((pages_ != NULL) || (exec_pages_ != NULL) || (large_pages_ != NULL));
   *start = static_cast<uword>(~0);
   *end = 0;
   for (HeapPage* page = pages_; page != NULL; page = NextPageAnySize(page)) {
@@ -347,6 +414,8 @@
 
 
 void PageSpace::VisitObjects(ObjectVisitor* visitor) const {
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     page->VisitObjects(visitor);
@@ -356,6 +425,8 @@
 
 
 void PageSpace::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     page->VisitObjectPointers(visitor);
@@ -367,6 +438,8 @@
 RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
                                  HeapPage::PageType type) const {
   ASSERT(Isolate::Current()->no_gc_scope_depth() != 0);
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     if (page->type() == type) {
@@ -382,6 +455,8 @@
 
 
 void PageSpace::WriteProtect(bool read_only) {
+  MutexLocker ml(pages_lock_);
+  NoGCScope no_gc;
   HeapPage* page = pages_;
   while (page != NULL) {
     page->WriteProtect(read_only);
@@ -394,10 +469,10 @@
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   JSONObject space(object, "old");
-  space.AddProperty("type", "PageSpace");
+  space.AddProperty("type", "HeapSpace");
   space.AddProperty("id", "heaps/old");
-  space.AddProperty("name", "PageSpace");
-  space.AddProperty("user_name", "old");
+  space.AddProperty("name", "old");
+  space.AddProperty("vmName", "PageSpace");
   space.AddProperty("collections", collections());
   space.AddProperty("used", UsedInWords() * kWordSize);
   space.AddProperty("capacity", CapacityInWords() * kWordSize);
@@ -446,6 +521,8 @@
   {
     // "pages" is an array [page0, page1, ..., pageN], each page of the form
     // {"object_start": "0x...", "objects": [size, class id, size, ...]}
+    MutexLocker ml(pages_lock_);
+    NoGCScope no_gc;
     JSONArray all_pages(&heap_map, "pages");
     for (HeapPage* page = pages_; page != NULL; page = page->next()) {
       JSONObject page_container(&all_pages);
@@ -455,6 +532,14 @@
       HeapMapAsJSONVisitor printer(&page_map);
       page->VisitObjects(&printer);
     }
+    for (HeapPage* page = exec_pages_; page != NULL; page = page->next()) {
+      JSONObject page_container(&all_pages);
+      page_container.AddPropertyF("object_start",
+                                  "0x%" Px "", page->object_start());
+      JSONArray page_map(&page_container, "objects");
+      HeapMapAsJSONVisitor printer(&page_map);
+      page->VisitObjects(&printer);
+    }
   }
 }
 
@@ -479,22 +564,38 @@
 
 void PageSpace::WriteProtectCode(bool read_only) {
   if (FLAG_write_protect_code) {
-    HeapPage* current_page = pages_;
-    while (current_page != NULL) {
-      if (current_page->type() == HeapPage::kExecutable) {
-        current_page->WriteProtect(read_only);
+    MutexLocker ml(pages_lock_);
+    NoGCScope no_gc;
+    // No need to go through all of the data pages first.
+    HeapPage* page = exec_pages_;
+    while (page != NULL) {
+      ASSERT(page->type() == HeapPage::kExecutable);
+      page->WriteProtect(read_only);
+      page = page->next();
+    }
+    page = large_pages_;
+    while (page != NULL) {
+      if (page->type() == HeapPage::kExecutable) {
+        page->WriteProtect(read_only);
       }
-      current_page = NextPageAnySize(current_page);
+      page = page->next();
     }
   }
 }
 
 
 void PageSpace::MarkSweep(bool invoke_api_callbacks) {
-  // MarkSweep is not reentrant. Make sure that is the case.
-  ASSERT(!sweeping_);
-  sweeping_ = true;
-  Isolate* isolate = Isolate::Current();
+  Isolate* isolate = heap_->isolate();
+  ASSERT(isolate == Isolate::Current());
+
+  // Wait for pending tasks to complete and then account for the driver task.
+  {
+    MonitorLocker locker(tasks_lock());
+    while (tasks() > 0) {
+      locker.Wait();
+    }
+    set_tasks(1);
+  }
 
   NoHandleScope no_handles(isolate);
 
@@ -533,38 +634,69 @@
   freelist_[HeapPage::kExecutable].Reset();
 
   int64_t mid2 = OS::GetCurrentTimeMicros();
+  int64_t mid3 = 0;
 
-  GCSweeper sweeper(heap_);
+  {
+    GCSweeper sweeper(heap_);
 
-  HeapPage* prev_page = NULL;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    HeapPage* next_page = page->next();
-    bool page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
-    if (page_in_use) {
-      prev_page = page;
-    } else {
-      FreePage(page, prev_page);
+    // During stop-the-world phases we should use bulk lock when adding elements
+    // to the free list.
+    MutexLocker mld(freelist_[HeapPage::kData].mutex());
+    MutexLocker mle(freelist_[HeapPage::kExecutable].mutex());
+
+    // Large and executable pages are always swept immediately.
+    HeapPage* prev_page = NULL;
+    HeapPage* page = large_pages_;
+    while (page != NULL) {
+      HeapPage* next_page = page->next();
+      const intptr_t words_to_end = sweeper.SweepLargePage(page);
+      if (words_to_end == 0) {
+        FreeLargePage(page, prev_page);
+      } else {
+        TruncateLargePage(page, words_to_end << kWordSizeLog2);
+        prev_page = page;
+      }
+      // Advance to the next page.
+      page = next_page;
     }
-    // Advance to the next page.
-    page = next_page;
-  }
 
-  int64_t mid3 = OS::GetCurrentTimeMicros();
-
-  prev_page = NULL;
-  page = large_pages_;
-  while (page != NULL) {
-    HeapPage* next_page = page->next();
-    const intptr_t words_to_end = sweeper.SweepLargePage(page);
-    if (words_to_end == 0) {
-      FreeLargePage(page, prev_page);
-    } else {
-      TruncateLargePage(page, words_to_end << kWordSizeLog2);
-      prev_page = page;
+    prev_page = NULL;
+    page = exec_pages_;
+    FreeList* freelist = &freelist_[HeapPage::kExecutable];
+    while (page != NULL) {
+      HeapPage* next_page = page->next();
+      bool page_in_use = sweeper.SweepPage(page, freelist);
+      if (page_in_use) {
+        prev_page = page;
+      } else {
+        FreePage(page, prev_page);
+      }
+      // Advance to the next page.
+      page = next_page;
     }
-    // Advance to the next page.
-    page = next_page;
+
+    mid3 = OS::GetCurrentTimeMicros();
+
+    if (!FLAG_concurrent_sweep) {
+      // Sweep all regular sized pages now.
+      prev_page = NULL;
+      page = pages_;
+      while (page != NULL) {
+        HeapPage* next_page = page->next();
+        bool page_in_use = sweeper.SweepPage(page, &freelist_[page->type()]);
+        if (page_in_use) {
+          prev_page = page;
+        } else {
+          FreePage(page, prev_page);
+        }
+        // Advance to the next page.
+        page = next_page;
+      }
+    } else {
+      // Start the concurrent sweeper task now.
+      GCSweeper::SweepConcurrent(
+          isolate, pages_, pages_tail_, &freelist_[HeapPage::kData]);
+    }
   }
 
   // Make code pages read-only.
@@ -594,9 +726,12 @@
     OS::PrintErr(" done.\n");
   }
 
-  // Done, reset the marker.
-  ASSERT(sweeping_);
-  sweeping_ = false;
+  // Done, reset the task count.
+  {
+    MonitorLocker ml(tasks_lock());
+    set_tasks(tasks() - 1);
+    ml.Notify();
+  }
 }
 
 
@@ -626,8 +761,10 @@
     return false;
   }
   intptr_t capacity_increase_in_words =
-    after.capacity_in_words - last_usage_.capacity_in_words;
-  ASSERT(capacity_increase_in_words >= 0);
+      after.capacity_in_words - last_usage_.capacity_in_words;
+  // The concurrent sweeper might have freed more capacity than was allocated.
+  capacity_increase_in_words =
+      Utils::Maximum<intptr_t>(0, capacity_increase_in_words);
   capacity_increase_in_words =
       Utils::RoundUp(capacity_increase_in_words, PageSpace::kPageSizeInWords);
   intptr_t capacity_increase_in_pages =
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index a8eda2c..225e0a1 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -16,6 +16,7 @@
 DECLARE_FLAG(bool, collect_code);
 DECLARE_FLAG(bool, log_code_drop);
 DECLARE_FLAG(bool, always_drop_code);
+DECLARE_FLAG(bool, write_protect_code);
 
 // Forward declarations.
 class Heap;
@@ -199,7 +200,13 @@
 
   uword TryAllocate(intptr_t size,
                     HeapPage::PageType type = HeapPage::kData,
-                    GrowthPolicy growth_policy = kControlGrowth);
+                    GrowthPolicy growth_policy = kControlGrowth) {
+    bool is_protected =
+        (type == HeapPage::kExecutable) && FLAG_write_protect_code;
+    bool is_locked = false;
+    return TryAllocateInternal(
+        size, type, growth_policy, is_protected, is_locked);
+  }
 
   bool NeedsGarbageCollection() const {
     return page_space_controller_.NeedsGarbageCollection(usage_) ||
@@ -276,6 +283,26 @@
   void AllocateExternal(intptr_t size);
   void FreeExternal(intptr_t size);
 
+  // Bulk data allocation.
+  void AcquireDataLock();
+  void ReleaseDataLock();
+
+  uword TryAllocateDataLocked(intptr_t size, GrowthPolicy growth_policy) {
+    bool is_protected = false;
+    bool is_locked = true;
+    return TryAllocateInternal(size,
+                               HeapPage::kData,
+                               growth_policy,
+                               is_protected, is_locked);
+  }
+
+  Monitor* tasks_lock() const { return tasks_lock_; }
+  intptr_t tasks() const { return tasks_; }
+  void set_tasks(intptr_t val) {
+    ASSERT(val >= 0);
+    tasks_ = val;
+  }
+
  private:
   // Ids for time and data records in Heap::GCStats.
   enum {
@@ -293,6 +320,11 @@
 
   static const intptr_t kAllocatablePageSize = 64 * KB;
 
+  uword TryAllocateInternal(intptr_t size,
+                            HeapPage::PageType type,
+                            GrowthPolicy growth_policy,
+                            bool is_protected,
+                            bool is_locked);
   HeapPage* AllocatePage(HeapPage::PageType type);
   void FreePage(HeapPage* page, HeapPage* previous_page);
   HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
@@ -300,8 +332,12 @@
   void FreeLargePage(HeapPage* page, HeapPage* previous_page);
   void FreePages(HeapPage* pages);
   HeapPage* NextPageAnySize(HeapPage* page) const {
-    ASSERT(pages_tail_ == NULL || pages_tail_->next() == NULL);
-    return page == pages_tail_ ? large_pages_ : page->next();
+    ASSERT((pages_tail_ == NULL) || (pages_tail_->next() == NULL));
+    ASSERT((exec_pages_tail_ == NULL) || (exec_pages_tail_->next() == NULL));
+    if (page == pages_tail_) {
+      return (exec_pages_ != NULL) ? exec_pages_ : large_pages_;
+    }
+    return page == exec_pages_tail_ ? large_pages_ : page->next();
   }
 
   static intptr_t LargePageSizeInWordsFor(intptr_t size);
@@ -315,16 +351,20 @@
 
   Heap* heap_;
 
+  Mutex* pages_lock_;
   HeapPage* pages_;
   HeapPage* pages_tail_;
+  HeapPage* exec_pages_;
+  HeapPage* exec_pages_tail_;
   HeapPage* large_pages_;
 
   // Various sizes being tracked for this generation.
   intptr_t max_capacity_in_words_;
   SpaceUsage usage_;
 
-  // Keep track whether a MarkSweep is currently running.
-  bool sweeping_;
+  // Keep track of running MarkSweep tasks.
+  Monitor* tasks_lock_;
+  intptr_t tasks_;
 
   PageSpaceController page_space_controller_;
 
@@ -332,6 +372,7 @@
   intptr_t collections_;
 
   friend class PageSpaceController;
+  friend class SweeperTask;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(PageSpace);
 };
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index f87763f..43d909f 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -6,6 +6,7 @@
 
 #include "lib/invocation_mirror.h"
 #include "platform/utils.h"
+#include "vm/ast_transformer.h"
 #include "vm/bootstrap.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -285,6 +286,7 @@
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
       is_top_level_(false),
+      await_is_keyword_(false),
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(NULL),
@@ -311,6 +313,7 @@
       token_kind_(Token::kILLEGAL),
       current_block_(NULL),
       is_top_level_(false),
+      await_is_keyword_(false),
       current_member_(NULL),
       allow_function_literals_(true),
       parsed_function_(parsed_function),
@@ -827,10 +830,6 @@
       node_sequence = parser.ParseStaticFinalGetter(func);
       CompilerStats::num_implicit_final_getters++;
       break;
-    case RawFunction::kStaticInitializer:
-      node_sequence = parser.ParseStaticInitializer(func);
-      CompilerStats::num_static_initializer_funcs++;
-      break;
     case RawFunction::kMethodExtractor:
       node_sequence = parser.ParseMethodExtractor(func);
       break;
@@ -1002,6 +1001,74 @@
 }
 
 
+SequenceNode* Parser::ParseStaticInitializer() {
+  ExpectIdentifier("field name expected");
+  CheckToken(Token::kASSIGN, "field initialier expected");
+  ConsumeToken();
+  OpenFunctionBlock(parsed_function()->function());
+  intptr_t expr_pos = TokenPos();
+  AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
+  ReturnNode* ret = new(I) ReturnNode(expr_pos, expr);
+  current_block_->statements->Add(ret);
+  return CloseBlock();
+}
+
+
+ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
+  ASSERT(field.is_static());
+  ASSERT(field.value() == Object::transition_sentinel().raw());
+  Isolate* isolate = Isolate::Current();
+
+  const Class& script_cls = Class::Handle(isolate, field.origin());
+  const Script& script = Script::Handle(isolate, script_cls.script());
+
+  const String& field_name = String::Handle(isolate, field.name());
+  String& init_name = String::Handle(isolate,
+      String::Concat(Symbols::InitPrefix(), field_name));
+  init_name = Symbols::New(init_name);
+
+  const Function& initializer = Function::ZoneHandle(isolate,
+      Function::New(init_name,
+                    RawFunction::kRegularFunction,
+                    true,   // static
+                    false,  // !const
+                    false,  // !abstract
+                    false,  // !external
+                    false,  // !native
+                    Class::Handle(field.owner()),
+                    field.token_pos()));
+  initializer.set_result_type(AbstractType::Handle(isolate, field.type()));
+  // Static initializer functions are hidden from the user.
+  // Since they are only executed once, we avoid optimizing
+  // and inlining them. After the field is initialized, the
+  // compiler can eliminate the call to the static initializer.
+  initializer.set_is_visible(false);
+  initializer.SetIsOptimizable(false);
+  initializer.set_is_inlinable(false);
+
+  ParsedFunction* parsed_function = new ParsedFunction(isolate, initializer);
+  Parser parser(script, parsed_function, field.token_pos());
+
+  SequenceNode* body = parser.ParseStaticInitializer();
+  parsed_function->SetNodeSequence(body);
+  parsed_function->set_default_parameter_values(Object::null_array());
+
+  if (parsed_function->has_expression_temp_var()) {
+    body->scope()->AddVariable(parsed_function->expression_temp_var());
+  }
+  if (parsed_function->has_saved_current_context_var()) {
+    body->scope()->AddVariable(parsed_function->saved_current_context_var());
+  }
+  if (parsed_function->has_finally_return_temp_var()) {
+    body->scope()->AddVariable(parsed_function->finally_return_temp_var());
+  }
+  // The instantiator is not required in a static expression.
+  ASSERT(!parser.IsInstantiatorRequired());
+
+  return parsed_function;
+}
+
+
 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) {
   TRACE_PARSER("ParseStaticFinalGetter");
   ParamList params;
@@ -1038,188 +1105,20 @@
     current_block_->statements->Add(return_node);
   } else {
     // This getter may be called each time the static field is accessed.
-    // The following generated code lazily initializes the field:
-    // if (field.value === transition_sentinel) {
-    //   field.value = null;
-    //   throw("circular dependency in field initialization");
-    // }
-    // if (field.value === sentinel) {
-    //   field.value = transition_sentinel;
-    //   field.value = expr;
-    // }
-    // return field.value;  // Type check is executed here in checked mode.
-
-    // Generate code checking for circular dependency in field initialization.
-    AstNode* compare_circular = new ComparisonNode(
-        ident_pos,
-        Token::kEQ_STRICT,
-        new LoadStaticFieldNode(ident_pos, field),
-        new LiteralNode(ident_pos, Object::transition_sentinel()));
-    // Set field to null prior to throwing exception, so that subsequent
-    // accesses to the field do not throw again, since initializers should only
-    // be executed once.
-    SequenceNode* report_circular = new SequenceNode(ident_pos, NULL);
-    report_circular->Add(
-        new StoreStaticFieldNode(
-            ident_pos,
-            field,
-            new LiteralNode(ident_pos, Instance::ZoneHandle(I))));
-    // Call CyclicInitializationError._throwNew(field_name).
-    ArgumentListNode* error_arguments = new ArgumentListNode(ident_pos);
-    error_arguments->Add(new LiteralNode(ident_pos, field_name));
-    report_circular->Add(
-        MakeStaticCall(Symbols::CyclicInitializationError(),
-                       Library::PrivateCoreLibName(Symbols::ThrowNew()),
-                       error_arguments));
-    AstNode* circular_check =
-        new IfNode(ident_pos, compare_circular, report_circular, NULL);
-    current_block_->statements->Add(circular_check);
-
-    // Generate code checking for uninitialized field.
-    AstNode* compare_uninitialized = new ComparisonNode(
-        ident_pos,
-        Token::kEQ_STRICT,
-        new LoadStaticFieldNode(ident_pos, field),
-        new LiteralNode(ident_pos, Object::sentinel()));
-    SequenceNode* initialize_field = new SequenceNode(ident_pos, NULL);
-    initialize_field->Add(
-        new StoreStaticFieldNode(
-            ident_pos,
-            field,
-            new LiteralNode(ident_pos, Object::transition_sentinel())));
-    const String& init_name = String::Handle(I, Symbols::New(
-        String::Handle(I, String::Concat(
-            Symbols::InitPrefix(), String::Handle(I, field.name())))));
-    const Function& init_function = Function::ZoneHandle(I,
-        field_class.LookupStaticFunction(init_name));
-    ASSERT(!init_function.IsNull());
-    ArgumentListNode* arguments = new ArgumentListNode(expr_pos);
-    StaticCallNode* init_call =
-        new StaticCallNode(expr_pos, init_function, arguments);
-    initialize_field->Add(init_call);
-
-    AstNode* uninitialized_check =
-        new IfNode(ident_pos, compare_uninitialized, initialize_field, NULL);
-    current_block_->statements->Add(uninitialized_check);
-
-    // Generate code returning the field value.
+    // Call runtime support to parse and evaluate the initializer expression.
+    // The runtime function will detect circular dependencies in expressions
+    // and handle errors while evaluating the expression.
+    current_block_->statements->Add(
+        new (I) InitStaticFieldNode(ident_pos, field));
     ReturnNode* return_node =
-        new ReturnNode(ident_pos, new LoadStaticFieldNode(ident_pos, field));
+        new ReturnNode(ident_pos,
+                       new LoadStaticFieldNode(ident_pos, field));
     current_block_->statements->Add(return_node);
   }
   return CloseBlock();
 }
 
 
-SequenceNode* Parser::ParseStaticInitializer(const Function& func) {
-  TRACE_PARSER("ParseStaticInitializer");
-  ParamList params;
-  ASSERT(func.num_fixed_parameters() == 0);  // static.
-  ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
-
-  // Build local scope for function and populate with the formal parameters.
-  OpenFunctionBlock(func);
-  AddFormalParamsToScope(&params, current_block_->scope);
-
-  // Move forward to the start of the initializer expression.
-  intptr_t ident_pos = TokenPos();
-  ExpectIdentifier("identifier expected");
-  ExpectToken(Token::kASSIGN);
-  intptr_t token_pos = TokenPos();
-
-  // Synthesize a try-catch block to wrap the initializer expression.
-  LocalVariable* context_var =
-      current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
-  if (context_var == NULL) {
-    context_var = new(I) LocalVariable(
-        token_pos,
-        Symbols::SavedTryContextVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
-    current_block_->scope->AddVariable(context_var);
-  }
-  LocalVariable* catch_excp_var =
-      current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
-  if (catch_excp_var == NULL) {
-    catch_excp_var = new (I) LocalVariable(
-        token_pos,
-        Symbols::ExceptionVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
-    current_block_->scope->AddVariable(catch_excp_var);
-  }
-  LocalVariable* catch_trace_var =
-      current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
-  if (catch_trace_var == NULL) {
-    catch_trace_var = new (I) LocalVariable(
-        token_pos,
-        Symbols::StackTraceVar(),
-        Type::ZoneHandle(I, Type::DynamicType()));
-    current_block_->scope->AddVariable(catch_trace_var);
-  }
-
-  OpenBlock();  // Start try block.
-  AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-  const Field& field = Field::ZoneHandle(I, func.saved_static_field());
-  ASSERT(!field.is_const());
-  if (FLAG_enable_type_checks) {
-    expr = new AssignableNode(
-        field.token_pos(),
-        expr,
-        AbstractType::ZoneHandle(I, field.type()),
-        String::ZoneHandle(I, field.name()));
-  }
-  StoreStaticFieldNode* store = new StoreStaticFieldNode(field.token_pos(),
-                                                         field,
-                                                         expr);
-  current_block_->statements->Add(store);
-  SequenceNode* try_block = CloseBlock();  // End try block.
-
-  OpenBlock();  // Start catch handler list.
-  OpenBlock();  // Start catch clause.
-  AstNode* compare_transition_sentinel = new ComparisonNode(
-      token_pos,
-      Token::kEQ_STRICT,
-      new LoadStaticFieldNode(ident_pos, field),
-      new LiteralNode(field.token_pos(), Object::transition_sentinel()));
-
-  SequenceNode* store_null = new SequenceNode(token_pos, NULL);
-  store_null->Add(new StoreStaticFieldNode(
-      field.token_pos(),
-      field,
-      new LiteralNode(token_pos, Instance::ZoneHandle(I))));
-  AstNode* transition_sentinel_check =
-      new IfNode(token_pos, compare_transition_sentinel, store_null, NULL);
-  current_block_->statements->Add(transition_sentinel_check);
-
-  current_block_->statements->Add(
-      new ThrowNode(token_pos,
-                    new LoadLocalNode(token_pos, catch_excp_var),
-                    new LoadLocalNode(token_pos, catch_trace_var)));
-  SequenceNode* catch_clause = CloseBlock();  // End catch clause.
-
-  current_block_->statements->Add(catch_clause);
-  SequenceNode* catch_handler_list = CloseBlock();  // End catch handler list.
-  CatchClauseNode* catch_block =
-      new CatchClauseNode(token_pos,
-                          catch_handler_list,
-                          Array::ZoneHandle(I, Object::empty_array().raw()),
-                          context_var,
-                          catch_excp_var,
-                          catch_trace_var,
-                          CatchClauseNode::kInvalidTryIndex,
-                          false);  // No stack trace needed.
-
-  AstNode* try_catch_node = new TryCatchNode(token_pos,
-                                             try_block,
-                                             context_var,
-                                             catch_block,
-                                             NULL,  // No finally block.
-                                             AllocateTryIndex());
-  current_block_->statements->Add(try_catch_node);
-  return CloseBlock();
-}
-
-
 // Create AstNodes for an implicit instance getter method:
 //   LoadLocalNode 0 ('this');
 //   LoadInstanceFieldNode (field_name);
@@ -1625,7 +1524,7 @@
   }
 
   if (params->has_optional_named_parameters &&
-      (parameter.name->CharAt(0) == '_')) {
+      (parameter.name->CharAt(0) == Library::kPrivateIdentifierStart)) {
     ReportError(parameter.name_pos, "named parameter must not be private");
   }
 
@@ -2296,10 +2195,15 @@
     ReportError(field_pos, "unresolved reference to instance field '%s'",
                 field_name.ToCString());
   }
-  CheckDuplicateFieldInit(field_pos, initialized_fields, &field);
-  AstNode* instance = new LoadLocalNode(field_pos, receiver);
   EnsureExpressionTemp();
-  return new StoreInstanceFieldNode(field_pos, instance, field, init_expr);
+  AstNode* instance = new(I) LoadLocalNode(field_pos, receiver);
+  AstNode* initializer = CheckDuplicateFieldInit(field_pos,
+      initialized_fields, instance, &field, init_expr);
+  if (initializer == NULL) {
+    initializer =
+        new(I) StoreInstanceFieldNode(field_pos, instance, field, init_expr);
+  }
+  return initializer;
 }
 
 
@@ -2420,23 +2324,107 @@
       current_block_->statements->Add(field_init);
     }
   }
+  initialized_fields->Add(NULL);  // End of inline initializers.
   SetPosition(saved_pos);
 }
 
 
-void Parser::CheckDuplicateFieldInit(intptr_t init_pos,
-                                    GrowableArray<Field*>* initialized_fields,
-                                    Field* field) {
+AstNode* Parser::CheckDuplicateFieldInit(
+    intptr_t init_pos,
+    GrowableArray<Field*>* initialized_fields,
+    AstNode* instance,
+    Field* field,
+    AstNode* init_value) {
   ASSERT(!field->is_static());
-  for (int i = 0; i < initialized_fields->length(); i++) {
-    Field* initialized_field = (*initialized_fields)[i];
+  AstNode* result = NULL;
+
+  // The initializer_list is divided into two sections. The sections
+  // are separated by a NULL entry: [f0, ... fn, NULL, fn+1, ...]
+  // The first fields f0 .. fn are final fields of the class that
+  // have an initializer expression inlined in the class declaration.
+  // The remaining fields are those initialized by the constructor's
+  // initializing formals and initializer list
+  int initializer_idx = 0;
+  while (initializer_idx < initialized_fields->length()) {
+    Field* initialized_field = (*initialized_fields)[initializer_idx];
+    initializer_idx++;
+    if (initialized_field == NULL) {
+      break;
+    }
+    if (initialized_field->raw() == field->raw()) {
+      // This final field has been initialized by an inlined
+      // initializer expression. This is a runtime error.
+      // Throw a NoSuchMethodError for the missing setter.
+      ASSERT(field->is_final());
+
+      // Build a call to NoSuchMethodError::_throwNew(
+      //     Object receiver,
+      //     String memberName,
+      //     int invocation_type,
+      //     List arguments,
+      //     List argumentNames,
+      //     List existingArgumentNames);
+
+      ArgumentListNode* nsm_args = new(I) ArgumentListNode(init_pos);
+      // Object receiver.
+      nsm_args->Add(instance);
+
+      // String memberName.
+      String& setter_name = String::ZoneHandle(field->name());
+      setter_name = Field::SetterSymbol(setter_name);
+      nsm_args->Add(new(I) LiteralNode(init_pos, setter_name));
+
+      // Smi invocation_type.
+      const int invocation_type =
+          InvocationMirror::EncodeType(InvocationMirror::kDynamic,
+                                       InvocationMirror::kSetter);
+      nsm_args->Add(new(I) LiteralNode(
+          init_pos, Smi::ZoneHandle(I, Smi::New(invocation_type))));
+
+      // List arguments.
+      GrowableArray<AstNode*> setter_args;
+      setter_args.Add(init_value);
+      ArrayNode* setter_args_array = new(I) ArrayNode(
+          init_pos,
+          Type::ZoneHandle(I, Type::ArrayType()),
+          setter_args);
+      nsm_args->Add(setter_args_array);
+
+      // List argumentNames.
+      // The missing implicit setter of the field has no argument names.
+      nsm_args->Add(new(I) LiteralNode(init_pos, Array::ZoneHandle(I)));
+
+      // List existingArgumentNames.
+      // There is no setter for the final field, thus there are
+      // no existing names.
+      nsm_args->Add(new(I) LiteralNode(init_pos, Array::ZoneHandle(I)));
+
+      AstNode* nsm_call =
+          MakeStaticCall(Symbols::NoSuchMethodError(),
+          Library::PrivateCoreLibName(Symbols::ThrowNew()),
+          nsm_args);
+
+      LetNode* let = new(I) LetNode(init_pos);
+      let->AddNode(init_value);
+      let->AddNode(nsm_call);
+      result = let;
+    }
+  }
+  // The remaining elements in initialized_fields are fields that
+  // are initialized through initializing formal parameters, or
+  // in the constructor's initializer list. If there is a duplicate,
+  // it is a compile time error.
+  while (initializer_idx < initialized_fields->length()) {
+    Field* initialized_field = (*initialized_fields)[initializer_idx];
+    initializer_idx++;
     if (initialized_field->raw() == field->raw()) {
       ReportError(init_pos,
-                  "duplicate initialization for field %s",
+                  "duplicate initializer for field %s",
                   String::Handle(I, field->name()).ToCString());
     }
   }
   initialized_fields->Add(field);
+  return result;
 }
 
 
@@ -2713,7 +2701,6 @@
                       "redirecting constructors may not have "
                       "initializing formal parameters");
         }
-        CheckDuplicateFieldInit(param.name_pos, &initialized_fields, &field);
 
         if (!param.has_explicit_type) {
           const AbstractType& field_type =
@@ -2733,8 +2720,16 @@
         ASSERT(p->is_invisible());
         AstNode* value = new LoadLocalNode(param.name_pos, p);
         EnsureExpressionTemp();
-        AstNode* initializer = new StoreInstanceFieldNode(
-            param.name_pos, instance, field, value);
+        AstNode* initializer =
+            CheckDuplicateFieldInit(param.name_pos,
+                                    &initialized_fields,
+                                    instance,
+                                    &field,
+                                    value);
+        if (initializer == NULL) {
+          initializer = new(I) StoreInstanceFieldNode(
+              param.name_pos, instance, field, value);
+        }
         current_block_->statements->Add(initializer);
       }
     }
@@ -2988,13 +2983,25 @@
     // we are compiling a getter this will at most populate the receiver.
     AddFormalParamsToScope(&params, current_block_->scope);
   } else if (func.is_async_closure()) {
+    // Async closures have one optional parameter for continuation results.
+    ParamDesc result_param;
+    result_param.name = &Symbols::AsyncOperationParam();
+    result_param.default_value = &Object::null_instance();
+    result_param.type = &Type::ZoneHandle(I, Type::DynamicType());
+    params.parameters->Add(result_param);
+    params.num_optional_parameters++;
+    params.has_optional_positional_parameters = true;
+    SetupDefaultsForOptionalParams(&params, default_parameter_values);
     AddFormalParamsToScope(&params, current_block_->scope);
     ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
     if (!Function::Handle(func.parent_function()).IsGetterFunction()) {
       // Parse away any formal parameters, as they are accessed as as context
       // variables.
-      ParseFormalParameterList(allow_explicit_default_values, false, &params);
+      ParamList parse_away;
+      ParseFormalParameterList(allow_explicit_default_values,
+                               false,
+                               &parse_away);
     }
   } else {
     ParseFormalParameterList(allow_explicit_default_values, false, &params);
@@ -3044,6 +3051,13 @@
   Function& async_closure = Function::ZoneHandle(I);
   if (func.IsAsyncFunction() && !func.is_async_closure()) {
     async_closure = OpenAsyncFunction(formal_params_pos);
+  } else if (func.is_async_closure()) {
+    OpenAsyncClosure();
+  }
+
+  bool saved_await_is_keyword = await_is_keyword_;
+  if (func.IsAsyncFunction() || func.is_async_closure()) {
+    await_is_keyword_ = true;
   }
 
   intptr_t end_token_pos = 0;
@@ -3114,6 +3128,7 @@
   current_block_->statements->Add(body);
   innermost_function_ = saved_innermost_function.raw();
   last_used_try_index_ = saved_try_index;
+  await_is_keyword_ = saved_await_is_keyword;
   return CloseBlock();
 }
 
@@ -3680,13 +3695,6 @@
                                field->name_pos);
         getter.set_result_type(*field->type);
         members->AddFunction(getter);
-
-        // Create initializer function for non-const fields.
-        if (!class_field.is_const()) {
-          const Function& init_function = Function::ZoneHandle(I,
-              Function::NewStaticInitializer(class_field));
-          members->AddFunction(init_function);
-        }
       }
     }
 
@@ -4221,8 +4229,7 @@
   cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  const Array& array = Array::Handle(I,
-                                     Array::MakeArray(members.functions()));
+  const Array& array = Array::Handle(I, Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
   // Add an implicit constructor if no explicit constructor is present.
@@ -4845,13 +4852,6 @@
                                name_pos);
         getter.set_result_type(type);
         top_level->functions.Add(getter);
-
-        // Create initializer function.
-        if (!field.is_const()) {
-          const Function& init_function = Function::ZoneHandle(I,
-              Function::NewStaticInitializer(field));
-          top_level->functions.Add(init_function);
-        }
       }
     } else if (is_final) {
       ReportError(name_pos, "missing initializer for final or const variable");
@@ -5526,7 +5526,14 @@
 }
 
 
+void Parser::OpenAsyncClosure() {
+  TRACE_PARSER("OpenAsyncClosure");
+  parsed_function()->set_await_temps_scope(current_block_->scope);
+}
+
+
 RawFunction* Parser::OpenAsyncFunction(intptr_t formal_param_pos) {
+  TRACE_PARSER("OpenAsyncFunction");
   // Create the closure containing the old body of this function.
   Class& sig_cls = Class::ZoneHandle(I);
   Type& sig_type = Type::ZoneHandle(I);
@@ -5537,6 +5544,13 @@
       formal_param_pos,
       &Symbols::ClosureParameter(),
       &Type::ZoneHandle(I, Type::DynamicType()));
+  ParamDesc result_param;
+  result_param.name = &Symbols::AsyncOperationParam();
+  result_param.default_value = &Object::null_instance();
+  result_param.type = &Type::ZoneHandle(I, Type::DynamicType());
+  closure_params.parameters->Add(result_param);
+  closure_params.has_optional_positional_parameters = true;
+  closure_params.num_optional_parameters++;
   closure = Function::NewClosureFunction(
       Symbols::AnonymousClosure(),
       innermost_function(),
@@ -5578,8 +5592,19 @@
 }
 
 
+static inline String& BuildAsyncSavedTryContextName(Isolate* isolate,
+                                                    int16_t id) {
+  const char* async_saved_prefix = ":async_saved_try_ctx_var_";
+  // Can be a regular handle since we only use it to build an actual symbol.
+  const String& cnt_str = String::Handle(
+      String::NewFormatted("%s%d", async_saved_prefix, id));
+  return String::ZoneHandle(isolate, Symbols::New(cnt_str));
+}
+
+
 SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
                                          SequenceNode* closure_body) {
+  TRACE_PARSER("CloseAsyncFunction");
   ASSERT(!closure.IsNull());
   ASSERT(closure_body != NULL);
   // The block for the async closure body has already been closed. Close the
@@ -5589,8 +5614,6 @@
   // Create and return a new future that executes a closure with the current
   // body.
 
-  bool found = false;
-
   // No need to capture parameters or other variables, since they have already
   // been captured in the corresponding scope as the body has been parsed within
   // a nested block (contained in the async funtion's block).
@@ -5607,28 +5630,49 @@
       completer.LookupFunction(Symbols::CompleterConstructor()));
   ASSERT(!completer_constructor.IsNull());
 
+  bool found = false;
   // Add to AST:
   //   var :async_op;
   //   var :async_completer;
+  //   var :await_jump_var;
+  //   var :await_ctx_var;
+  // Add as many variables to saved the try block ctx as there were try blocks.
+  //   var :async_saved_try_ctx_var_<x>;
+  const Type& dynamic_type = Type::ZoneHandle(I, Type::DynamicType());
   LocalVariable* async_op_var = new (I) LocalVariable(
-      Scanner::kNoSourcePos,
-      Symbols::AsyncOperation(),
-      Type::ZoneHandle(I, Type::DynamicType()));
+      Scanner::kNoSourcePos, Symbols::AsyncOperation(), dynamic_type);
   current_block_->scope->AddVariable(async_op_var);
   found = closure_body->scope()->CaptureVariable(Symbols::AsyncOperation());
   ASSERT(found);
   LocalVariable* async_completer = new (I) LocalVariable(
-      Scanner::kNoSourcePos,
-      Symbols::AsyncCompleter(),
-      Type::ZoneHandle(I, Type::DynamicType()));
+      Scanner::kNoSourcePos, Symbols::AsyncCompleter(), dynamic_type);
   current_block_->scope->AddVariable(async_completer);
   found = closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter());
   ASSERT(found);
+  LocalVariable* await_jump_var = new (I) LocalVariable(
+      Scanner::kNoSourcePos, Symbols::AwaitJumpVar(), dynamic_type);
+  current_block_->scope->AddVariable(await_jump_var);
+  found = closure_body->scope()->CaptureVariable(Symbols::AwaitJumpVar());
+  ASSERT(found);
+  LocalVariable* await_ctx_var = new (I) LocalVariable(
+      Scanner::kNoSourcePos, Symbols::AwaitContextVar(), dynamic_type);
+  current_block_->scope->AddVariable(await_ctx_var);
+  found = closure_body->scope()->CaptureVariable(Symbols::AwaitContextVar());
+  ASSERT(found);
+  LocalVariable* async_saved_try_ctx_var;
+  for (int16_t i = 0; i < last_used_try_index_; i++) {
+    String& async_saved_try_ctx_name = BuildAsyncSavedTryContextName(I, i);
+    async_saved_try_ctx_var = new (I) LocalVariable(
+        Scanner::kNoSourcePos, async_saved_try_ctx_name, dynamic_type);
+    current_block_->scope->AddVariable(async_saved_try_ctx_var);
+    found = closure_body->scope()->CaptureVariable(async_saved_try_ctx_name);
+    ASSERT(found);
+  }
 
   // Add to AST:
   //   :async_completer = new Completer();
-  ArgumentListNode* empty_args = new (I) ArgumentListNode(
-      Scanner::kNoSourcePos);
+  ArgumentListNode* empty_args =
+      new (I) ArgumentListNode(Scanner::kNoSourcePos);
   ConstructorCallNode* completer_constructor_node = new (I) ConstructorCallNode(
       Scanner::kNoSourcePos,
       TypeArguments::ZoneHandle(I),
@@ -5676,8 +5720,16 @@
 
 
 void Parser::CloseAsyncClosure(SequenceNode* body) {
+  TRACE_PARSER("CloseAsyncClosure");
   // We need a temporary expression to store intermediate return values.
   parsed_function()->EnsureExpressionTemp();
+  // Implicitly mark those variables below as captured. We currently mark all
+  // variables of all scopes as captured (below), but as soon as we do something
+  // smarter we rely on these internal variables to be available.
+  body->scope()->LookupVariable(Symbols::Completer(), false);
+  body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
+  body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
+  body->scope()->RecursivelyCaptureAllVariables();
 }
 
 
@@ -5878,7 +5930,7 @@
     // Variable initialization.
     const intptr_t assign_pos = TokenPos();
     ConsumeToken();
-    AstNode* expr = ParseExpr(is_const, kConsumeCascades);
+    AstNode* expr = ParseAwaitableExpr(is_const, kConsumeCascades);
     initialization = new(I) StoreLocalNode(
         assign_pos, variable, expr);
     if (is_const) {
@@ -6309,7 +6361,7 @@
 
 // Returns true if the current token is kIDENT or a pseudo-keyword.
 bool Parser::IsIdentifier() {
-  return Token::IsIdentifier(CurrentToken());
+  return Token::IsIdentifier(CurrentToken()) && !IsAwaitAsKeyword();
 }
 
 
@@ -7212,6 +7264,19 @@
   TRACE_PARSER("ParseFinallyBlock");
   OpenBlock();
   ExpectToken(Token::kLBRACE);
+
+  // In case of async closures we need to restore the saved try index of an
+  // outer try block (if it exists).  The current try block has already been
+  // removed from the stack of try blocks.
+  if (current_function().is_async_closure() && (try_blocks_list_ != NULL)) {
+    // We need two unchain two scopes: finally clause, and the try block level.
+    SetupSavedTryContext(current_block_->scope->parent()->parent(),
+                         try_blocks_list_->try_index(),
+                         current_block_->statements);
+  } else {
+    parsed_function()->reset_saved_try_ctx_vars();
+  }
+
   ParseStatementSequence();
   ExpectToken(Token::kRBRACE);
   SequenceNode* finally_block = CloseBlock();
@@ -7357,6 +7422,21 @@
     // Add nested block with user-defined code.  This blocks allows
     // declarations in the body to shadow the catch parameters.
     CheckToken(Token::kLBRACE);
+
+    // In case of async closures we need to restore the saved try index of an
+    // outer try block (if it exists).
+    ASSERT(try_blocks_list_ != NULL);
+    if (current_function().is_async_closure() &&
+        (try_blocks_list_->outer_try_block() != NULL)) {
+      // We need to unchain three scope levels: catch clause, catch parameters,
+      // and the general try block.
+      SetupSavedTryContext(current_block_->scope->parent()->parent()->parent(),
+                           try_blocks_list_->outer_try_block()->try_index(),
+                           current_block_->statements);
+    } else {
+      parsed_function()->reset_saved_try_ctx_vars();
+    }
+
     current_block_->statements->Add(ParseNestedStatement(false, NULL));
     catch_blocks.Add(CloseBlock());
 
@@ -7452,6 +7532,33 @@
 }
 
 
+// Set up the currently relevant :saved_try_context_var on the stack:
+// * Try blocks: Set the context variable for this try block.
+// * Catch/finally blocks: Set the context variable for any outer try block (if
+//   existent).
+//
+// Also save the captured variable and the stack variable to be able to set
+// it after a function continues execution (await).
+void Parser::SetupSavedTryContext(LocalScope* saved_try_context_scope,
+                                  int16_t try_index,
+                                  SequenceNode* target) {
+  LocalVariable* saved_try_ctx = saved_try_context_scope->LookupVariable(
+      Symbols::SavedTryContextVar(), false);
+  ASSERT((saved_try_ctx != NULL) && !saved_try_ctx->is_captured());
+  const String& async_saved_try_ctx_name =
+      BuildAsyncSavedTryContextName(I, try_index);
+  LocalVariable* async_saved_try_ctx =
+      target->scope()->LookupVariable(async_saved_try_ctx_name, false);
+  ASSERT((async_saved_try_ctx != NULL) && async_saved_try_ctx->is_captured());
+  target->Add(new (I) StoreLocalNode(
+      Scanner::kNoSourcePos, saved_try_ctx, new (I) LoadLocalNode(
+          Scanner::kNoSourcePos, async_saved_try_ctx)));
+
+  parsed_function()->set_saved_try_ctx(saved_try_ctx);
+  parsed_function()->set_async_saved_try_ctx(async_saved_try_ctx);
+}
+
+
 AstNode* Parser::ParseTryStatement(String* label_name) {
   TRACE_PARSER("ParseTryStatement");
 
@@ -7510,6 +7617,22 @@
   OpenBlock();
   PushTryBlock(current_block_);
   ExpectToken(Token::kLBRACE);
+
+  if (current_function().is_async_closure()) {
+    const String& async_saved_try_ctx_name =
+        BuildAsyncSavedTryContextName(I, last_used_try_index_ - 1);
+    LocalVariable* async_saved_try_ctx =
+        current_block_->scope->LookupVariable(
+            async_saved_try_ctx_name, false);
+    ASSERT(async_saved_try_ctx != NULL);
+    ASSERT(context_var != NULL);
+    current_block_->statements->Add(new (I) StoreLocalNode(
+        Scanner::kNoSourcePos, async_saved_try_ctx, new (I) LoadLocalNode(
+            Scanner::kNoSourcePos, context_var)));
+    parsed_function()->set_saved_try_ctx(context_var);
+    parsed_function()->set_async_saved_try_ctx(async_saved_try_ctx);
+  }
+
   ParseStatementSequence();
   ExpectToken(Token::kRBRACE);
   SequenceNode* try_block = CloseBlock();
@@ -7582,6 +7705,21 @@
     sequence->set_label(try_label);
     try_catch_node = sequence;
   }
+
+  // In case of async closures we need to restore the saved try index of an
+  // outer try block (if it exists).
+  if (current_function().is_async_closure() &&
+      (outer_try_index != CatchClauseNode::kInvalidTryIndex)) {
+    SequenceNode* try_catch_and_restore_try_ctx = new (I) SequenceNode(
+        Scanner::kNoSourcePos, current_block_->scope);
+    try_catch_and_restore_try_ctx->Add(try_catch_node);
+    SetupSavedTryContext(
+        current_block_->scope, outer_try_index, try_catch_and_restore_try_ctx);
+    return try_catch_and_restore_try_ctx;
+  } else {
+    parsed_function()->reset_saved_try_ctx_vars();
+  }
+
   return try_catch_node;
 }
 
@@ -7751,7 +7889,7 @@
         new(I) LoadLocalNode(statement_pos, excp_var),
         new(I) LoadLocalNode(statement_pos, trace_var));
   } else {
-    statement = ParseExpr(kAllowConst, kConsumeCascades);
+    statement = ParseAwaitableExpr(kAllowConst, kConsumeCascades);
     ExpectSemicolon();
   }
   return statement;
@@ -7872,6 +8010,12 @@
 }
 
 
+bool Parser::IsAwaitAsKeyword() {
+  return await_is_keyword_ &&
+         (CurrentLiteral()->raw() == Symbols::Await().raw());
+}
+
+
 static bool IsIncrementOperator(Token::Kind token) {
   return token == Token::kINCR || token == Token::kDECR;
 }
@@ -8407,6 +8551,31 @@
 }
 
 
+AstNode* Parser::ParseAwaitableExpr(bool require_compiletime_const,
+                                    bool consume_cascades) {
+  TRACE_PARSER("ParseAwaitableExpr");
+  parsed_function()->reset_have_seen_await();
+  AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
+  if (parsed_function()->have_seen_await()) {
+    if (!current_block_->scope->LookupVariable(
+          Symbols::AsyncOperation(), true)) {
+      // Async operations are always encapsulated into a local function. We only
+      // need to transform the expression when generating code for this inner
+      // function.
+      return expr;
+    }
+    SequenceNode* intermediates_block = new(I) SequenceNode(
+        Scanner::kNoSourcePos, current_block_->scope);
+    AwaitTransformer at(intermediates_block, library_, parsed_function());
+    AstNode* result = at.Transform(expr);
+    current_block_->statements->Add(intermediates_block);
+    parsed_function()->reset_have_seen_await();
+    return result;
+  }
+  return expr;
+}
+
+
 AstNode* Parser::ParseExpr(bool require_compiletime_const,
                            bool consume_cascades) {
   TRACE_PARSER("ParseExpr");
@@ -9615,6 +9784,15 @@
                                            const String& ident) {
   TRACE_PARSER("ResolveIdentInPrefixScope");
   HANDLESCOPE(I);
+  if (ident.CharAt(0) == Library::kPrivateIdentifierStart) {
+    // Private names are not exported by libraries. The name mangling
+    // of private names with a library-specific suffix usually ensures
+    // that _x in library A is not found when looked up from library B.
+    // In the pathological case where a library includes itself with
+    // a prefix, the name mangling would not help in hiding the private
+    // name, so we need to explicitly reject private names here.
+    return NULL;
+  }
   Object& obj = Object::Handle(I);
   if (prefix.is_loaded()) {
     obj = prefix.LookupObject(ident);
@@ -10775,6 +10953,16 @@
     OpenBlock();
     primary = ParseFunctionStatement(true);
     CloseBlock();
+  } else if (IsAwaitAsKeyword()) {
+    // The body of an async function is parsed multiple times. The first time
+    // when setting up an AsyncFunction() for generating relevant scope
+    // information. The second time the body is parsed for actually generating
+    // code.
+    TRACE_PARSER("ParseAwaitExpr");
+    ConsumeToken();
+    parsed_function()->record_await();
+    primary = new(I) AwaitNode(
+        TokenPos(), ParseExpr(kAllowConst, kConsumeCascades));
   } else if (IsIdentifier()) {
     intptr_t qual_ident_pos = TokenPos();
     const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(I, ParsePrefix());
@@ -10961,8 +11149,7 @@
     // Compile time constant expressions cannot reference anything from a
     // local scope.
     LocalScope* empty_scope = new(I) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new(I) SequenceNode(expr->token_pos(),
-                                                    empty_scope);
+    SequenceNode* seq = new(I) SequenceNode(expr->token_pos(), empty_scope);
     seq->Add(ret);
 
     Object& result = Object::Handle(I, Compiler::ExecuteOnce(seq));
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 2c5acf3..d249655 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -48,11 +48,15 @@
         saved_entry_context_var_(NULL),
         expression_temp_var_(NULL),
         finally_return_temp_var_(NULL),
+        await_temps_scope_(NULL),
         deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
         first_parameter_index_(0),
         first_stack_local_index_(0),
         num_copied_params_(0),
         num_stack_locals_(0),
+        have_seen_await_expr_(false),
+        saved_try_ctx_(NULL),
+        async_saved_try_ctx_(NULL),
         isolate_(isolate) {
     ASSERT(function.IsZoneHandle());
   }
@@ -138,6 +142,38 @@
 
   void AllocateVariables();
 
+  void set_await_temps_scope(LocalScope* scope) {
+    ASSERT(await_temps_scope_ == NULL);
+    await_temps_scope_ = scope;
+  }
+  LocalScope* await_temps_scope() const {
+    ASSERT(await_temps_scope_ != NULL);
+    return await_temps_scope_;
+  }
+
+  void record_await() {
+    have_seen_await_expr_ = true;
+  }
+  void reset_have_seen_await() { have_seen_await_expr_ = false; }
+  bool have_seen_await() const { return have_seen_await_expr_; }
+
+  void set_saved_try_ctx(LocalVariable* saved_try_ctx) {
+    ASSERT((saved_try_ctx != NULL) && !saved_try_ctx->is_captured());
+    saved_try_ctx_ = saved_try_ctx;
+  }
+  LocalVariable* saved_try_ctx() const { return saved_try_ctx_; }
+
+  void set_async_saved_try_ctx(LocalVariable* async_saved_try_ctx) {
+    ASSERT((async_saved_try_ctx != NULL) && async_saved_try_ctx->is_captured());
+    async_saved_try_ctx_ = async_saved_try_ctx;
+  }
+  LocalVariable* async_saved_try_ctx() const { return async_saved_try_ctx_; }
+
+  void reset_saved_try_ctx_vars() {
+    saved_try_ctx_ = NULL;
+    async_saved_try_ctx_ = NULL;
+  }
+
   Isolate* isolate() const { return isolate_; }
 
  private:
@@ -150,12 +186,16 @@
   LocalVariable* saved_entry_context_var_;
   LocalVariable* expression_temp_var_;
   LocalVariable* finally_return_temp_var_;
+  LocalScope* await_temps_scope_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
 
   int first_parameter_index_;
   int first_stack_local_index_;
   int num_copied_params_;
   int num_stack_locals_;
+  bool have_seen_await_expr_;
+  LocalVariable* saved_try_ctx_;
+  LocalVariable* async_saved_try_ctx_;
 
   Isolate* isolate_;
 
@@ -180,6 +220,10 @@
   // class if the metadata is at the top-level).
   static RawObject* ParseMetadata(const Class& cls, intptr_t token_pos);
 
+  // Build a function containing the initializer expression of the
+  // given static field.
+  static ParsedFunction* ParseStaticFieldInitializer(const Field& field);
+
   // Parse a function to retrieve parameter information that is not retained in
   // the dart::Function object. Returns either an error if the parse fails
   // (which could be the case for local functions), or a flat array of entries
@@ -298,6 +342,7 @@
   String* ExpectUserDefinedTypeIdentifier(const char* msg);
   String* ExpectIdentifier(const char* msg);
   bool IsLiteral(const char* literal);
+  bool IsAwaitAsKeyword();
 
   void SkipIf(Token::Kind);
   void SkipBlock();
@@ -426,9 +471,12 @@
       const Class& cls,
       LocalVariable* receiver,
       GrowableArray<Field*>* initialized_fields);
-  void CheckDuplicateFieldInit(intptr_t init_pos,
-                               GrowableArray<Field*>* initialized_fields,
-                               Field* field);
+  AstNode* CheckDuplicateFieldInit(
+      intptr_t init_pos,
+      GrowableArray<Field*>* initialized_fields,
+      AstNode* instance,
+      Field* field,
+      AstNode* init_value);
   void GenerateSuperConstructorCall(const Class& cls,
                                     intptr_t supercall_pos,
                                     LocalVariable* receiver,
@@ -488,12 +536,13 @@
   SequenceNode* ParseInstanceGetter(const Function& func);
   SequenceNode* ParseInstanceSetter(const Function& func);
   SequenceNode* ParseStaticFinalGetter(const Function& func);
-  SequenceNode* ParseStaticInitializer(const Function& func);
+  SequenceNode* ParseStaticInitializer();
   SequenceNode* ParseMethodExtractor(const Function& func);
   SequenceNode* ParseNoSuchMethodDispatcher(const Function& func,
                                             Array* default_values);
   SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
                                            Array* default_values);
+
   void BuildDispatcherScope(const Function& func,
                             const ArgumentsDescriptor& desc,
                             Array* default_values);
@@ -502,6 +551,7 @@
   void OpenBlock();
   void OpenLoopBlock();
   void OpenFunctionBlock(const Function& func);
+  void OpenAsyncClosure();
   RawFunction* OpenAsyncFunction(intptr_t formal_param_pos);
   SequenceNode* CloseBlock();
   SequenceNode* CloseAsyncFunction(const Function& closure,
@@ -586,6 +636,8 @@
   static const bool kAllowConst = false;
   static const bool kConsumeCascades = true;
   static const bool kNoCascades = false;
+  AstNode* ParseAwaitableExpr(bool require_compiletime_const,
+                              bool consume_cascades);
   AstNode* ParseExpr(bool require_compiletime_const, bool consume_cascades);
   AstNode* ParseExprList();
   AstNode* ParseConditionalExpr();
@@ -679,6 +731,10 @@
                                   InvocationMirror::Type type,
                                   const Function* func);
 
+  void SetupSavedTryContext(LocalScope* saved_try_context_scope,
+                            int16_t try_index,
+                            SequenceNode* target);
+
   void CheckOperatorArity(const MemberDesc& member);
 
   void EnsureExpressionTemp();
@@ -718,6 +774,10 @@
   // global variables.
   bool is_top_level_;
 
+  // await_is_keyword_ is true if we are parsing an async function. In this
+  // context async is not treated as identifier but as a keyword.
+  bool await_is_keyword_;
+
   // The member currently being parsed during "top level" parsing.
   MemberDesc* current_member_;
 
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index be86195..f39cba0 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -63,6 +63,21 @@
 }
 
 
+const char* PortMap::PortStateString(PortState kind) {
+  switch (kind) {
+    case kNewPort:
+      return "new";
+    case kLivePort:
+      return "live";
+    case kControlPort:
+      return "control";
+    default:
+      UNREACHABLE();
+      return "UNKNOWN";
+  }
+}
+
+
 Dart_Port PortMap::AllocatePort() {
   const Dart_Port kMASK = 0x3fffffff;
   Dart_Port result = prng_->NextUInt32() & kMASK;
@@ -79,16 +94,21 @@
 }
 
 
-void PortMap::SetLive(Dart_Port port) {
+void PortMap::SetPortState(Dart_Port port, PortState state) {
   MutexLocker ml(mutex_);
   intptr_t index = FindPort(port);
   ASSERT(index >= 0);
-  map_[index].live = true;
-  map_[index].handler->increment_live_ports();
+  PortState old_state = map_[index].state;
+  ASSERT(old_state == kNewPort);
+  map_[index].state = state;
+  if (state == kLivePort) {
+    map_[index].handler->increment_live_ports();
+  }
   if (FLAG_trace_isolates) {
-    OS::Print("[^] Live port: \n"
+    OS::Print("[^] Port (%s) -> (%s): \n"
               "\thandler:    %s\n"
               "\tport:       %" Pd64 "\n",
+              PortStateString(old_state), PortStateString(state),
               map_[index].handler->name(), port);
   }
 }
@@ -117,7 +137,7 @@
   Entry entry;
   entry.port = AllocatePort();
   entry.handler = handler;
-  entry.live = false;
+  entry.state = kNewPort;
 
   // Search for the first unused slot. Make use of the knowledge that here is
   // currently no port with this id in the port map.
@@ -179,7 +199,7 @@
     // pending messages below.
     map_[index].port = 0;
     map_[index].handler = deleted_entry_;
-    if (map_[index].live) {
+    if (map_[index].state == kLivePort) {
       handler->decrement_live_ports();
     }
 
@@ -203,7 +223,7 @@
         // Mark the slot as deleted.
         map_[i].port = 0;
         map_[i].handler = deleted_entry_;
-        if (map_[i].live) {
+        if (map_[i].state == kLivePort) {
           handler->decrement_live_ports();
         }
         used_--;
diff --git a/runtime/vm/port.h b/runtime/vm/port.h
index 5a0f177..f62ac8b 100644
--- a/runtime/vm/port.h
+++ b/runtime/vm/port.h
@@ -20,12 +20,18 @@
 
 class PortMap: public AllStatic {
  public:
+  enum PortState {
+    kNewPort = 0,      // a newly allocated port
+    kLivePort = 1,     // a regular port (has a ReceivePort)
+    kControlPort = 2,  // a special control port (has a ReceivePort)
+  };
+
   // Allocate a port for the provided handler and return its VM-global id.
   static Dart_Port CreatePort(MessageHandler* handler);
 
   // Indicates that a port has had a ReceivePort created for it at the
   // dart language level.  The port remains live until it is closed.
-  static void SetLive(Dart_Port id);
+  static void SetPortState(Dart_Port id, PortState kind);
 
   // Close the port with id. All pending messages will be dropped.
   //
@@ -59,9 +65,11 @@
   typedef struct {
     Dart_Port port;
     MessageHandler* handler;
-    bool live;
+    PortState state;
   } Entry;
 
+  static const char* PortStateString(PortState state);
+
   // Allocate a new unique port.
   static Dart_Port AllocatePort();
 
diff --git a/runtime/vm/port_test.cc b/runtime/vm/port_test.cc
index 64252dc..34272d1 100644
--- a/runtime/vm/port_test.cc
+++ b/runtime/vm/port_test.cc
@@ -25,7 +25,7 @@
     if (index < 0) {
       return false;
     }
-    return PortMap::map_[index].live;
+    return PortMap::map_[index].state == PortMap::kLivePort;
   }
 };
 
@@ -100,20 +100,36 @@
 }
 
 
-TEST_CASE(PortMap_SetLive) {
+TEST_CASE(PortMap_SetPortState) {
   PortTestMessageHandler handler;
+
+  // Regular port.
   Dart_Port port = PortMap::CreatePort(&handler);
   EXPECT_NE(0, port);
   EXPECT(PortMapTestPeer::IsActivePort(port));
   EXPECT(!PortMapTestPeer::IsLivePort(port));
 
-  PortMap::SetLive(port);
+  PortMap::SetPortState(port, PortMap::kLivePort);
   EXPECT(PortMapTestPeer::IsActivePort(port));
   EXPECT(PortMapTestPeer::IsLivePort(port));
 
   PortMap::ClosePort(port);
   EXPECT(!PortMapTestPeer::IsActivePort(port));
   EXPECT(!PortMapTestPeer::IsLivePort(port));
+
+  // Control port.
+  port = PortMap::CreatePort(&handler);
+  EXPECT_NE(0, port);
+  EXPECT(PortMapTestPeer::IsActivePort(port));
+  EXPECT(!PortMapTestPeer::IsLivePort(port));
+
+  PortMap::SetPortState(port, PortMap::kControlPort);
+  EXPECT(PortMapTestPeer::IsActivePort(port));
+  EXPECT(!PortMapTestPeer::IsLivePort(port));
+
+  PortMap::ClosePort(port);
+  EXPECT(!PortMapTestPeer::IsActivePort(port));
+  EXPECT(!PortMapTestPeer::IsLivePort(port));
 }
 
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 6b118a0..c4786b0 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -467,7 +467,6 @@
     obj.AddProperty("type", "@Code");
     obj.AddProperty("kind", "Native");
     obj.AddProperty("name", name());
-    obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
     obj.AddPropertyF("id", "code/native-%" Px "", start());
@@ -477,7 +476,6 @@
       func.AddProperty("type", "@Function");
       func.AddPropertyF("id", "functions/native-%" Px "", start());
       func.AddProperty("name", name());
-      func.AddProperty("user_name", name());
       func.AddProperty("kind", "Native");
     }
   }
@@ -488,7 +486,6 @@
     obj.AddProperty("type", "@Code");
     obj.AddProperty("kind", "Collected");
     obj.AddProperty("name", name());
-    obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
     obj.AddPropertyF("id", "code/collected-%" Px "", start());
@@ -498,7 +495,6 @@
       func.AddProperty("type", "@Function");
       obj.AddPropertyF("id", "functions/collected-%" Px "", start());
       func.AddProperty("name", name());
-      func.AddProperty("user_name", name());
       func.AddProperty("kind", "Collected");
     }
   }
@@ -509,7 +505,6 @@
     obj.AddProperty("type", "@Code");
     obj.AddProperty("kind", "Reused");
     obj.AddProperty("name", name());
-    obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
     obj.AddPropertyF("id", "code/reused-%" Px "", start());
@@ -519,7 +514,6 @@
       func.AddProperty("type", "@Function");
       obj.AddPropertyF("id", "functions/reused-%" Px "", start());
       func.AddProperty("name", name());
-      func.AddProperty("user_name", name());
       func.AddProperty("kind", "Reused");
     }
   }
@@ -531,7 +525,6 @@
     obj.AddProperty("kind", "Tag");
     obj.AddPropertyF("id", "code/tag-%" Px "", start());
     obj.AddProperty("name", name());
-    obj.AddProperty("user_name", name());
     obj.AddPropertyF("start", "%" Px "", start());
     obj.AddPropertyF("end", "%" Px "", end());
     {
@@ -541,7 +534,6 @@
       func.AddProperty("kind", "Tag");
       obj.AddPropertyF("id", "functions/tag-%" Px "", start());
       func.AddProperty("name", name());
-      func.AddProperty("user_name", name());
     }
   }
 
@@ -2008,7 +2000,7 @@
 
   uword stack_lower = 0;
   uword stack_upper = 0;
-  isolate->GetStackBounds(&stack_lower, &stack_upper);
+  isolate->GetProfilerStackBounds(&stack_lower, &stack_upper);
   if ((stack_lower == 0) || (stack_upper == 0)) {
     // Could not get stack boundary.
     return;
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index b571174..630dd7d 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -18,7 +18,7 @@
 const intptr_t RawPcDescriptors::kFullRecSize =
     sizeof(RawPcDescriptors::PcDescriptorRec);
 const intptr_t RawPcDescriptors::kCompressedRecSize =
-    kFullRecSize - sizeof(int16_t);
+    sizeof(RawPcDescriptors::CompressedPcDescriptorRec);
 
 bool RawObject::IsVMHeapObject() const {
   return Dart::vm_isolate()->heap()->Contains(ToAddr(this));
@@ -59,10 +59,13 @@
   // Only reasonable to be called on heap objects.
   ASSERT(IsHeapObject());
 
-  RawClass* raw_class = isolate->class_table()->At(GetClassId());
+  intptr_t class_id = GetClassId();
+  RawClass* raw_class = isolate->class_table()->At(class_id);
+  ASSERT(raw_class->ptr()->id_ == class_id);
+
+  // Get the instance size out of the class.
   intptr_t instance_size =
       raw_class->ptr()->instance_size_in_words_ << kWordSizeLog2;
-  intptr_t class_id = raw_class->ptr()->id_;
 
   if (instance_size == 0) {
     switch (class_id) {
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 86db68a..ebd0f2d 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -72,7 +72,7 @@
     V(JSRegExp)                                                                \
     V(WeakProperty)                                                            \
     V(MirrorReference)                                                         \
-    V(LinkedHashMap)                                                         \
+    V(LinkedHashMap)                                                           \
     V(UserTag)                                                                 \
 
 #define CLASS_LIST_ARRAYS(V)                                                   \
@@ -292,19 +292,31 @@
     uword value = reinterpret_cast<uword>(this);
     return (value & kSmiTagMask) == kHeapObjectTag;
   }
-
+  // Assumes this is a heap object.
   bool IsNewObject() const {
     ASSERT(IsHeapObject());
     uword addr = reinterpret_cast<uword>(this);
     return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset;
   }
+  // Assumes this is a heap object.
   bool IsOldObject() const {
     ASSERT(IsHeapObject());
     uword addr = reinterpret_cast<uword>(this);
     return (addr & kNewObjectAlignmentOffset) == kOldObjectAlignmentOffset;
   }
+  // Assumes this is a heap object.
   bool IsVMHeapObject() const;
 
+  // Like !IsHeapObject() || IsOldObject(), but compiles to a single branch.
+  bool IsSmiOrOldObject() const {
+    COMPILE_ASSERT(kHeapObjectTag == 1);
+    COMPILE_ASSERT(kNewObjectAlignmentOffset == kWordSize);
+    static const uword kNewObjectBits =
+        (kNewObjectAlignmentOffset | kHeapObjectTag);
+    const uword addr = reinterpret_cast<uword>(this);
+    return (addr & kNewObjectBits) != kNewObjectBits;
+  }
+
   // Support for GC marking bit.
   bool IsMarked() const {
     return MarkBit::decode(ptr()->tags_);
@@ -610,7 +622,6 @@
     kImplicitSetter,     // represents an implicit setter for fields.
     kImplicitStaticFinalGetter,  // represents an implicit getter for static
                                  // final fields (incl. static const fields).
-    kStaticInitializer,  // used in implicit static getters.
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,  // invokes a field as a closure.
@@ -972,6 +983,14 @@
     int16_t try_index_;
   };
 
+  // This structure is only used to compute what the size of PcDescriptorRec
+  // should be when the try_index_ field is omitted.
+  struct CompressedPcDescriptorRec {
+    uword pc_;
+    int32_t deopt_id_and_kind_;
+    int32_t token_pos_;
+  };
+
   static intptr_t RecordSize(bool has_try_index);
 
  private:
@@ -1619,6 +1638,7 @@
   friend class Api;
   friend class Object;
   friend class Instance;
+  friend class SnapshotReader;
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index fa25656..5a3dcaf 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -149,9 +149,9 @@
   intptr_t num_flds = (unresolved_class.raw()->to() -
                        unresolved_class.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     unresolved_class.StorePointer((unresolved_class.raw()->from() + i),
-                                  reader->ObjectHandle()->raw());
+                                  reader->PassiveObjectHandle()->raw());
   }
   return unresolved_class.raw();
 }
@@ -213,8 +213,9 @@
   // allocations may happen.
   intptr_t num_flds = (type.raw()->to() - type.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectImpl();
-    type.StorePointer((type.raw()->from() + i), reader->ObjectHandle()->raw());
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectImpl();
+    type.StorePointer((type.raw()->from() + i),
+                      reader->PassiveObjectHandle()->raw());
   }
 
   // If object needs to be a canonical object, Canonicalize it.
@@ -286,9 +287,9 @@
   // allocations may happen.
   intptr_t num_flds = (type_ref.raw()->to() - type_ref.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     type_ref.StorePointer((type_ref.raw()->from() + i),
-                          reader->ObjectHandle()->raw());
+                          reader->PassiveObjectHandle()->raw());
   }
 
   return type_ref.raw();
@@ -338,9 +339,9 @@
   intptr_t num_flds = (type_parameter.raw()->to() -
                        type_parameter.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     type_parameter.StorePointer((type_parameter.raw()->from() + i),
-                                reader->ObjectHandle()->raw());
+                                reader->PassiveObjectHandle()->raw());
   }
 
   return type_parameter.raw();
@@ -393,9 +394,9 @@
   intptr_t num_flds = (bounded_type.raw()->to() -
                        bounded_type.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     bounded_type.StorePointer((bounded_type.raw()->from() + i),
-                              reader->ObjectHandle()->raw());
+                              reader->PassiveObjectHandle()->raw());
   }
 
   return bounded_type.raw();
@@ -451,8 +452,8 @@
 
   // Set the instantiations field, which is only read from a full snapshot.
   if (kind == Snapshot::kFull) {
-    *reader->ArrayHandle() ^= reader->ReadObjectImpl();
-    type_arguments.set_instantiations(*reader->ArrayHandle());
+    *(reader->ArrayHandle()) ^= reader->ReadObjectImpl();
+    type_arguments.set_instantiations(*(reader->ArrayHandle()));
   } else {
     type_arguments.set_instantiations(Object::zero_array());
   }
@@ -712,7 +713,7 @@
 
   // Initialize all fields that are not part of the snapshot.
   func.ClearCode();
-  func.set_ic_data_array(Array::Handle());
+  func.set_ic_data_array(Object::null_array());
   return func.raw();
 }
 
@@ -832,8 +833,8 @@
   literal_token.set_kind(token_kind);
   *reader->StringHandle() ^= reader->ReadObjectImpl();
   literal_token.set_literal(*reader->StringHandle());
-  *reader->ObjectHandle() = reader->ReadObjectImpl();
-  literal_token.set_value(*reader->ObjectHandle());
+  *reader->PassiveObjectHandle() = reader->ReadObjectImpl();
+  literal_token.set_value(*reader->PassiveObjectHandle());
 
   return literal_token.raw();
 }
@@ -1335,16 +1336,16 @@
   context.set_tags(tags);
 
   // Set the isolate implicitly.
-  context.set_isolate(Isolate::Current());
+  context.set_isolate(reader->isolate());
 
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
   // allocations may happen.
   intptr_t num_flds = (context.raw()->to(num_vars) - context.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     context.StorePointer((context.raw()->from() + i),
-                         reader->ObjectHandle()->raw());
+                         reader->PassiveObjectHandle()->raw());
   }
 
   return context.raw();
@@ -1473,9 +1474,9 @@
   // allocations may happen.
   intptr_t num_flds = (api_error.raw()->to() - api_error.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     api_error.StorePointer((api_error.raw()->from() + i),
-                           reader->ObjectHandle()->raw());
+                           reader->PassiveObjectHandle()->raw());
   }
 
   return api_error.raw();
@@ -1524,9 +1525,9 @@
   intptr_t num_flds =
       (language_error.raw()->to() - language_error.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
-    (*reader->ObjectHandle()) = reader->ReadObjectRef();
+    (*reader->PassiveObjectHandle()) = reader->ReadObjectRef();
     language_error.StorePointer((language_error.raw()->from() + i),
-                                reader->ObjectHandle()->raw());
+                                reader->PassiveObjectHandle()->raw());
   }
 
   return language_error.raw();
@@ -1718,7 +1719,7 @@
 
   // Read in the HexCString representation of the bigint.
   intptr_t len = reader->ReadIntptrValue();
-  char* str = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+  char* str = reader->isolate()->current_zone()->Alloc<char>(len + 1);
   str[len] = '\0';
   reader->ReadBytes(reinterpret_cast<uint8_t*>(str), len);
 
@@ -1870,9 +1871,10 @@
   ASSERT(reader != NULL);
   if (RawObject::IsCanonical(tags)) {
     // Set up canonical string object.
+    Isolate* isolate = reader->isolate();
     ASSERT(reader != NULL);
     CharacterType* ptr =
-        Isolate::Current()->current_zone()->Alloc<CharacterType>(len);
+        isolate->current_zone()->Alloc<CharacterType>(len);
     for (intptr_t i = 0; i < len; i++) {
       ptr[i] = reader->Read<CharacterType>();
     }
@@ -2163,12 +2165,10 @@
   reader->AddBackRef(object_id, &array, kIsDeserialized);
   intptr_t length = reader->ReadSmiValue();
   array.SetLength(length);
-  Array& contents = Array::Handle(reader->isolate());
-  contents ^= reader->ReadObjectImpl();
-  array.SetData(contents);
-  const TypeArguments& type_arguments =
-      TypeArguments::Handle(reader->isolate(), contents.GetTypeArguments());
-  array.SetTypeArguments(type_arguments);
+  *(reader->ArrayHandle()) ^= reader->ReadObjectImpl();
+  array.SetData(*(reader->ArrayHandle()));
+  *(reader->TypeArgumentsHandle()) = reader->ArrayHandle()->GetTypeArguments();
+  array.SetTypeArguments(*(reader->TypeArgumentsHandle()));
   return array.raw();
 }
 
@@ -2209,12 +2209,10 @@
     map = LinkedHashMap::New(HEAP_SPACE(kind));
   }
   reader->AddBackRef(object_id, &map, kIsDeserialized);
-  Array& contents = Array::Handle(reader->isolate());
-  contents ^= reader->ReadObjectImpl();
-  map.SetData(contents);
-  const TypeArguments& type_arguments =
-      TypeArguments::Handle(reader->isolate(), contents.GetTypeArguments());
-  map.SetTypeArguments(type_arguments);
+  *(reader->ArrayHandle()) ^= reader->ReadObjectImpl();
+  map.SetData(*(reader->ArrayHandle()));
+  *(reader->TypeArgumentsHandle()) = reader->ArrayHandle()->GetTypeArguments();
+  map.SetTypeArguments(*(reader->TypeArgumentsHandle()));
   return map.raw();
 }
 
@@ -2391,8 +2389,9 @@
 
   intptr_t cid = RawObject::ClassIdTag::decode(tags);
   intptr_t len = reader->ReadSmiValue();
-  TypedData& result = TypedData::ZoneHandle(
-      reader->isolate(), TypedData::New(cid, len, HEAP_SPACE(kind)));
+  TypedData& result = TypedData::ZoneHandle(reader->isolate(),
+      (kind == Snapshot::kFull) ? reader->NewTypedData(cid, len)
+                                : TypedData::New(cid, len, HEAP_SPACE(kind)));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
 
   // Set the object tags.
diff --git a/runtime/vm/report_test.cc b/runtime/vm/report_test.cc
index 88b6839..e10bd5b 100644
--- a/runtime/vm/report_test.cc
+++ b/runtime/vm/report_test.cc
@@ -31,8 +31,8 @@
       EXPECT_SUBSTRING("\"message\":{\"type\":\"JSCompatibilityWarning\","
                        "\"script\":{\"type\":\"@Script\",\"id\":"
                        "\"libraries\\/-1\\/scripts\\/Plug\","
-                       "\"name\":\"Plug\",\"user_name\":"
-                       "\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                       "\"name\":\"Plug\","
+                       "\"kind\":\"script\"},\"tokenPos\":0,"
                        "\"message\":{\"type\":\"@String\"",
                        js.ToCString());
       // Skip private _OneByteString.
@@ -49,7 +49,7 @@
   EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
                    "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
                    "\"name\":\"Plug\","
-                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                   "\"kind\":\"script\"},\"tokenPos\":0,"
                    "\"message\":{\"type\":\"@String\"",
                    trace_buffer->At(0)->message);
   // Skip private _OneByteString.
@@ -59,7 +59,7 @@
   EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
                    "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
                    "\"name\":\"Plug\","
-                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":1,"
+                   "\"kind\":\"script\"},\"tokenPos\":1,"
                    "\"message\":{\"type\":\"@String\"",
                    trace_buffer->At(1)->message);
   // Skip private _OneByteString.
@@ -70,4 +70,3 @@
 }
 
 }  // namespace dart
-
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index f930d93..ec4881c 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -13,12 +13,12 @@
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/object.h"
+#include "vm/object_id_ring.h"
 #include "vm/stack_frame.h"
 #include "vm/store_buffer.h"
 #include "vm/verifier.h"
 #include "vm/visitor.h"
 #include "vm/weak_table.h"
-#include "vm/object_id_ring.h"
 
 namespace dart {
 
@@ -52,10 +52,10 @@
 }
 
 
-static inline void ForwardTo(uword orignal, uword target) {
+static inline void ForwardTo(uword original, uword target) {
   // Make sure forwarding can be encoded.
   ASSERT((target & kForwardingMask) == 0);
-  *reinterpret_cast<uword*>(orignal) = target | kForwarded;
+  *reinterpret_cast<uword*>(original) = target | kForwarded;
 }
 
 
@@ -79,10 +79,11 @@
   explicit ScavengerVisitor(Isolate* isolate, Scavenger* scavenger)
       : ObjectPointerVisitor(isolate),
         scavenger_(scavenger),
+        from_start_(scavenger_->from_->start()),
+        from_size_(scavenger_->from_->end() - scavenger_->from_->start()),
         heap_(scavenger->heap_),
         vm_heap_(Dart::vm_isolate()->heap()),
-        visited_count_(0),
-        handled_count_(0),
+        page_space_(scavenger->heap_->old_space()),
         delayed_weak_stack_(),
         bytes_promoted_(0),
         visiting_old_object_(NULL),
@@ -122,8 +123,6 @@
     }
   }
 
-  intptr_t visited_count() const { return visited_count_; }
-  intptr_t handled_count() const { return handled_count_; }
   intptr_t bytes_promoted() const { return bytes_promoted_; }
 
  private:
@@ -148,24 +147,26 @@
     BoolScope bs(&in_scavenge_pointer_, true);
 #endif
 
-    visited_count_++;
     RawObject* raw_obj = *p;
 
-    // Fast exit if the raw object is a Smi or an old object.
-    if (!raw_obj->IsHeapObject() || raw_obj->IsOldObject()) {
+    if (raw_obj->IsSmiOrOldObject()) {
+      return;
+    }
+
+    // Objects should be contained in the heap.
+    // TODO(iposva): Add an appropriate assert here or in the return block
+    // below.
+
+    // The scavenger is only interested in objects located in the from space.
+    //
+    // We are using address math here and relying on the unsigned underflow
+    // in the code below to avoid having two checks.
+    uword obj_offset = reinterpret_cast<uword>(raw_obj) - from_start_;
+    if (obj_offset > from_size_) {
       return;
     }
 
     uword raw_addr = RawObject::ToAddr(raw_obj);
-    // Objects should be contained in the heap.
-    // TODO(iposva): Add an appropriate assert here or in the return block
-    // below.
-    // The scavenger is only interested in objects located in the from space.
-    if (!scavenger_->from_->Contains(raw_addr)) {
-      return;
-    }
-
-    handled_count_++;
     // Read the header word of the object and determine if the object has
     // already been copied.
     uword header = *reinterpret_cast<uword*>(raw_addr);
@@ -204,8 +205,8 @@
         //
         // This object is a survivor of a previous scavenge. Attempt to promote
         // the object.
-        new_addr =
-            heap_->TryAllocate(size, Heap::kOld, PageSpace::kForceGrowth);
+        new_addr = page_space_->TryAllocateDataLocked(size,
+                                                      PageSpace::kForceGrowth);
         if (new_addr != 0) {
           // If promotion succeeded then we need to remember it so that it can
           // be traversed later.
@@ -238,10 +239,11 @@
   }
 
   Scavenger* scavenger_;
+  uword from_start_;
+  uword from_size_;
   Heap* heap_;
   Heap* vm_heap_;
-  intptr_t visited_count_;
-  intptr_t handled_count_;
+  PageSpace* page_space_;
   typedef std::multimap<RawObject*, RawWeakProperty*> DelaySet;
   DelaySet delay_set_;
   GrowableArray<RawObject*> delayed_weak_stack_;
@@ -321,7 +323,7 @@
 SemiSpace::~SemiSpace() {
   if (reserved_ != NULL) {
 #if defined(DEBUG)
-    memset(reserved_->address(), 0xf3, size_in_words() << kWordSizeLog2);
+    memset(reserved_->address(), kZapValue, size_in_words() << kWordSizeLog2);
 #endif  // defined(DEBUG)
     delete reserved_;
   }
@@ -360,7 +362,7 @@
       return NULL;
     }
 #if defined(DEBUG)
-    memset(reserved->address(), 0xf3, size_in_bytes);
+    memset(reserved->address(), kZapValue, size_in_bytes);
 #endif  // defined(DEBUG)
     return new SemiSpace(reserved);
   }
@@ -368,6 +370,11 @@
 
 
 void SemiSpace::Delete() {
+#ifdef DEBUG
+  if (reserved_ != NULL) {
+    memset(reserved_->address(), kZapValue, size_in_words() << kWordSizeLog2);
+  }
+#endif
   SemiSpace* old_cache = NULL;
   {
     MutexLocker locker(mutex_);
@@ -480,8 +487,17 @@
   }
 
 #if defined(DEBUG)
-  VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_);
-  heap_->IterateOldPointers(&verify_store_buffer_visitor);
+  // We can only safely verify the store buffers from old space if there is no
+  // concurrent old space task. At the same time we prevent new tasks from
+  // being spawned.
+  {
+    PageSpace* page_space = heap_->old_space();
+    MonitorLocker ml(page_space->tasks_lock());
+    if (page_space->tasks() == 0) {
+      VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_);
+      heap_->IterateOldPointers(&verify_store_buffer_visitor);
+    }
+  }
 #endif  // defined(DEBUG)
   from_->Delete();
   from_ = NULL;
@@ -499,8 +515,6 @@
   // Iterating through the store buffers.
   // Grab the deduplication sets out of the store buffer.
   StoreBufferBlock* pending = isolate->store_buffer()->Blocks();
-  intptr_t visited_count_before = visitor->visited_count();
-  intptr_t handled_count_before = visitor->handled_count();
   while (pending != NULL) {
     StoreBufferBlock* next = pending->next();
     intptr_t count = pending->Count();
@@ -514,10 +528,8 @@
     delete pending;
     pending = next;
   }
-  heap_->RecordData(kStoreBufferVisited,
-                    visitor->visited_count() - visited_count_before);
-  heap_->RecordData(kStoreBufferPointers,
-                    visitor->handled_count() - handled_count_before);
+  heap_->RecordData(kDataUnused1, 0);
+  heap_->RecordData(kDataUnused2, 0);
   // Done iterating through old objects remembered in the store buffers.
   visitor->VisitingOldObject(NULL);
 }
@@ -781,6 +793,7 @@
   ASSERT(!scavenging_);
   scavenging_ = true;
   Isolate* isolate = heap_->isolate();
+  PageSpace* page_space = heap_->old_space();
   NoHandleScope no_handles(isolate);
 
   if (FLAG_verify_before_gc) {
@@ -789,13 +802,16 @@
     OS::PrintErr(" done.\n");
   }
 
-  // Setup the visitor and run a scavenge.
-  ScavengerVisitor visitor(isolate, this);
+  // Prepare for a scavenge.
   SpaceUsage usage_before = GetCurrentUsage();
   intptr_t promo_candidate_words =
       (survivor_end_ - FirstObjectStart()) / kWordSize;
   Prologue(isolate, invoke_api_callbacks);
   const bool prologue_weak_are_strong = !invoke_api_callbacks;
+
+  // Setup the visitor and run the scavenge.
+  ScavengerVisitor visitor(isolate, this);
+  page_space->AcquireDataLock();
   IterateRoots(isolate, &visitor, prologue_weak_are_strong);
   int64_t start = OS::GetCurrentTimeMicros();
   ProcessToSpace(&visitor);
@@ -807,6 +823,9 @@
   IterateWeakRoots(isolate, &weak_visitor, visit_prologue_weak_handles);
   visitor.Finalize();
   ProcessWeakTables();
+  page_space->ReleaseDataLock();
+
+  // Scavenge finished. Run accounting and epilogue.
   int64_t end = OS::GetCurrentTimeMicros();
   heap_->RecordTime(kProcessToSpace, middle - start);
   heap_->RecordTime(kIterateWeaks, end - middle);
@@ -839,10 +858,10 @@
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   JSONObject space(object, "new");
-  space.AddProperty("type", "Scavenger");
+  space.AddProperty("type", "HeapSpace");
   space.AddProperty("id", "heaps/new");
-  space.AddProperty("name", "Scavenger");
-  space.AddProperty("user_name", "new");
+  space.AddProperty("name", "new");
+  space.AddProperty("vmName", "Scavenger");
   space.AddProperty("collections", collections());
   if (collections() > 0) {
     int64_t run_time = OS::GetCurrentTimeMicros() - isolate->start_time();
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 1b74aa7..1b5e550 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -61,6 +61,10 @@
 
   static SemiSpace* cache_;
   static Mutex* mutex_;
+
+#ifdef DEBUG
+  static const intptr_t kZapValue = 0xf3;
+#endif
 };
 
 
@@ -219,8 +223,8 @@
     kIterateWeaks = 3,
     // Data
     kStoreBufferEntries = 0,
-    kStoreBufferVisited = 1,
-    kStoreBufferPointers = 2,
+    kDataUnused1 = 1,
+    kDataUnused2 = 2,
     kToKBAfterStoreBuffer = 3
   };
 
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index d9f2df1..72a30023 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -602,6 +602,27 @@
 }
 
 
+void LocalScope::RecursivelyCaptureAllVariables() {
+  bool found = false;
+  for (intptr_t i = 0; i < num_variables(); i++) {
+    if ((VariableAt(i)->name().raw() == Symbols::StackTraceVar().raw()) ||
+        (VariableAt(i)->name().raw() == Symbols::ExceptionVar().raw()) ||
+        (VariableAt(i)->name().raw() == Symbols::SavedTryContextVar().raw())) {
+      // Don't capture those variables because the VM expects them to be on the
+      // stack.
+      continue;
+    }
+    found = CaptureVariable(VariableAt(i)->name());
+    // Also manually set the variable as captured as CaptureVariable() does not
+    // handle capturing variables on the same scope level.
+    VariableAt(i)->set_is_captured();
+    ASSERT(found);
+  }
+  if (sibling() != NULL) { sibling()->RecursivelyCaptureAllVariables(); }
+  if (child() != NULL) { child()->RecursivelyCaptureAllVariables(); }
+}
+
+
 RawContextScope* LocalScope::CreateImplicitClosureScope(const Function& func) {
   static const intptr_t kNumCapturedVars = 1;
 
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 6cb2030..3e38932 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -318,6 +318,11 @@
   // from this scope and belonging to outer scopes.
   RawContextScope* PreserveOuterScope(int current_context_level) const;
 
+
+  // Recursively traverses all siblings and children and marks all variables as
+  // captured.
+  void RecursivelyCaptureAllVariables();
+
   // Creates a LocalScope representing the outer scope of a local function to be
   // compiled. This outer scope contains the variables captured by the function
   // as specified by the given ContextScope, which was created during the
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 195f017..0b6b443 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -27,6 +27,7 @@
 #include "vm/reusable_handles.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/unicode.h"
 #include "vm/version.h"
 
 
@@ -407,7 +408,7 @@
   if (isolate == NULL) {
     return NULL;
   }
-  Isolate::SetCurrent(isolate);
+  StartIsolateScope isolate_scope(isolate);
   {
     // Install the dart:vmservice library.
     StackZone zone(isolate);
@@ -472,7 +473,6 @@
     RegisterRunningIsolatesVisitor register_isolates(isolate);
     Isolate::VisitIsolates(&register_isolates);
   }
-  Isolate::SetCurrent(NULL);
   service_isolate_ = reinterpret_cast<Isolate*>(isolate);
   return service_isolate_;
 }
@@ -789,14 +789,39 @@
 }
 
 
-static bool HandleIsolateEcho(Isolate* isolate, JSONStream* js) {
-  JSONObject jsobj(js);
-  jsobj.AddProperty("type", "message");
-  PrintArgumentsAndOptions(jsobj, js);
+static bool HandleCommonEcho(JSONObject* jsobj, JSONStream* js) {
+  jsobj->AddProperty("type", "message");
+  PrintArgumentsAndOptions(*jsobj, js);
   return true;
 }
 
 
+void Service::SendEchoEvent(Isolate* isolate) {
+  JSONStream js;
+  {
+    JSONObject jsobj(&js);
+    jsobj.AddProperty("type", "ServiceEvent");
+    jsobj.AddPropertyF("id", "_echoEvent");
+    jsobj.AddProperty("eventType", "_Echo");
+    jsobj.AddProperty("isolate", isolate);
+  }
+  const String& message = String::Handle(String::New(js.ToCString()));
+  uint8_t data[] = {0, 128, 255};
+  // TODO(koda): Add 'testing' event family.
+  SendEvent(kEventFamilyDebug, message, data, sizeof(data));
+}
+
+
+bool HandleIsolateEcho(Isolate* isolate, JSONStream* js) {
+  JSONObject jsobj(js);
+  jsobj.AddProperty("id", "_echo");
+  if (js->num_arguments() == 2 && strcmp(js->GetArgument(1), "event") == 0) {
+    Service::SendEchoEvent(isolate);
+  }
+  return HandleCommonEcho(&jsobj, js);
+}
+
+
 // Print an error message if there is no ID argument.
 #define REQUIRE_COLLECTION_ID(collection)                                      \
   if (js->num_arguments() == 1) {                                              \
@@ -929,7 +954,7 @@
     Object& element = Object::Handle();
     for (intptr_t i = 0; i < array.Length(); ++i) {
       element = array.At(i);
-      if (!element.IsInstance()) {
+      if (!(element.IsInstance() || element.IsNull())) {
         return true;
       }
     }
@@ -939,17 +964,66 @@
     Object& element = Object::Handle();
     for (intptr_t i = 0; i < array.Length(); ++i) {
       element = array.At(i);
-      if (!element.IsInstance()) {
+      if (!(element.IsInstance() || element.IsNull())) {
         return true;
       }
     }
     return false;
   } else {
-    return !obj.IsInstance();
+    return !(obj.IsInstance() || obj.IsNull());
   }
 }
 
 
+static bool HandleInboundReferences(Isolate* isolate,
+                                    Object* target,
+                                    intptr_t limit,
+                                    JSONStream* js) {
+  ObjectGraph graph(isolate);
+  Array& path = Array::Handle(Array::New(limit * 2));
+  intptr_t length = graph.InboundReferences(target, path);
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "InboundReferences");
+  jsobj.AddProperty("id", "inbound_references");
+  {
+    JSONArray elements(&jsobj, "references");
+    Object& source = Object::Handle();
+    Smi& slot_offset = Smi::Handle();
+    Class& source_class = Class::Handle();
+    Field& field = Field::Handle();
+    Array& parent_field_map = Array::Handle();
+    limit = Utils::Minimum(limit, length);
+    for (intptr_t i = 0; i < limit; ++i) {
+      JSONObject jselement(&elements);
+      source = path.At(i * 2);
+      slot_offset ^= path.At((i * 2) + 1);
+
+      jselement.AddProperty("source", source);
+      jselement.AddProperty("slot", "<unknown>");
+      if (source.IsArray()) {
+        intptr_t element_index = slot_offset.Value() -
+            (Array::element_offset(0) >> kWordSizeLog2);
+        jselement.AddProperty("slot", element_index);
+      } else if (source.IsInstance()) {
+        source_class ^= source.clazz();
+        parent_field_map = source_class.OffsetToFieldMap();
+        intptr_t offset = slot_offset.Value();
+        if (offset > 0 && offset < parent_field_map.Length()) {
+          field ^= parent_field_map.At(offset);
+          jselement.AddProperty("slot", field);
+        }
+      }
+
+      // We nil out the array after generating the response to prevent
+      // reporting suprious references when repeatedly looking for the
+      // references to an object.
+      path.SetAt(i * 2, Object::null_object());
+    }
+  }
+  return true;
+}
+
+
 static bool HandleRetainingPath(Isolate* isolate,
                                 Object* obj,
                                 intptr_t limit,
@@ -995,15 +1069,26 @@
       }
     }
   }
+
+  // We nil out the array after generating the response to prevent
+  // reporting suprious references when looking for inbound references
+  // after looking for a retaining path.
+  for (intptr_t i = 0; i < limit; ++i) {
+    path.SetAt(i * 2, Object::null_object());
+  }
+
   return true;
 }
 
+
 // Takes an Object* only because RetainingPath temporarily clears it.
 static bool HandleInstanceCommands(Isolate* isolate,
                                    Object* obj,
+                                   ObjectIdRing::LookupResult kind,
                                    JSONStream* js,
                                    intptr_t arg_pos) {
   ASSERT(js->num_arguments() > arg_pos);
+  ASSERT(kind != ObjectIdRing::kInvalid);
   const char* action = js->GetArgument(arg_pos);
   if (strcmp(action, "eval") == 0) {
     if (js->num_arguments() > (arg_pos + 1)) {
@@ -1012,13 +1097,13 @@
                  js->num_arguments());
       return true;
     }
-    if (obj->IsNull()) {
+    if (kind == ObjectIdRing::kCollected) {
       PrintErrorWithKind(js, "EvalCollected",
                          "attempt to evaluate against collected object\n",
                          js->num_arguments());
       return true;
     }
-    if (obj->raw() == Object::sentinel().raw()) {
+    if (kind == ObjectIdRing::kExpired) {
       PrintErrorWithKind(js, "EvalExpired",
                          "attempt to evaluate against expired object\n",
                          js->num_arguments());
@@ -1044,12 +1129,40 @@
     result.PrintJSON(js, true);
     return true;
   } else if (strcmp(action, "retained") == 0) {
+    if (kind == ObjectIdRing::kCollected) {
+      PrintErrorWithKind(
+          js, "RetainedCollected",
+          "attempt to calculate size retained by a collected object\n",
+          js->num_arguments());
+      return true;
+    }
+    if (kind == ObjectIdRing::kExpired) {
+      PrintErrorWithKind(
+          js, "RetainedExpired",
+          "attempt to calculate size retained by an expired object\n",
+          js->num_arguments());
+      return true;
+    }
     ObjectGraph graph(isolate);
     intptr_t retained_size = graph.SizeRetainedByInstance(*obj);
     const Object& result = Object::Handle(Integer::New(retained_size));
     result.PrintJSON(js, true);
     return true;
   } else if (strcmp(action, "retaining_path") == 0) {
+    if (kind == ObjectIdRing::kCollected) {
+      PrintErrorWithKind(
+          js, "RetainingPathCollected",
+          "attempt to find a retaining path for a collected object\n",
+          js->num_arguments());
+      return true;
+    }
+    if (kind == ObjectIdRing::kExpired) {
+      PrintErrorWithKind(
+          js, "RetainingPathExpired",
+          "attempt to find a retaining path for an expired object\n",
+          js->num_arguments());
+      return true;
+    }
     intptr_t limit;
     if (!GetIntegerId(js->LookupOption("limit"), &limit)) {
       PrintError(js, "retaining_path expects a 'limit' option\n",
@@ -1057,6 +1170,28 @@
       return true;
     }
     return HandleRetainingPath(isolate, obj, limit, js);
+  } else if (strcmp(action, "inbound_references") == 0) {
+    if (kind == ObjectIdRing::kCollected) {
+      PrintErrorWithKind(
+          js, "InboundReferencesCollected",
+          "attempt to find inbound references for a collected object\n",
+          js->num_arguments());
+      return true;
+    }
+    if (kind == ObjectIdRing::kExpired) {
+      PrintErrorWithKind(
+          js, "InboundReferencesExpired",
+          "attempt to find inbound references for an expired object\n",
+          js->num_arguments());
+      return true;
+    }
+    intptr_t limit;
+    if (!GetIntegerId(js->LookupOption("limit"), &limit)) {
+      PrintError(js, "inbound_references expects a 'limit' option\n",
+                 js->num_arguments());
+      return true;
+    }
+    return HandleInboundReferences(isolate, obj, limit, js);
   }
 
   PrintError(js, "unrecognized action '%s'\n", action);
@@ -1139,19 +1274,20 @@
 
 static bool HandleClassesFunctions(Isolate* isolate, const Class& cls,
                                    JSONStream* js) {
-  intptr_t id;
-  if (js->num_arguments() > 5) {
-    PrintError(js, "Command too long");
+  if (js->num_arguments() != 4 && js->num_arguments() != 5) {
+    PrintError(js, "Command should have 4 or 5 arguments");
     return true;
   }
-  if (!GetIntegerId(js->GetArgument(3), &id)) {
-    PrintError(js, "Must specify collection object id: functions/id");
+  const char* encoded_id = js->GetArgument(3);
+  String& id = String::Handle(isolate, String::New(encoded_id));
+  id = String::DecodeIRI(id);
+  if (id.IsNull()) {
+    PrintError(js, "Function id %s is malformed", encoded_id);
     return true;
   }
-  Function& func = Function::Handle();
-  func ^= cls.FunctionFromIndex(id);
+  Function& func = Function::Handle(cls.LookupFunction(id));
   if (func.IsNull()) {
-    PrintError(js, "Function %" Pd " not found", id);
+    PrintError(js, "Function %s not found", encoded_id);
     return true;
   }
   if (js->num_arguments() == 4) {
@@ -1244,7 +1380,7 @@
     type.PrintJSON(js, false);
     return true;
   }
-  return HandleInstanceCommands(isolate, &type, js, 4);
+  return HandleInstanceCommands(isolate, &type, ObjectIdRing::kValid, js, 4);
 }
 
 
@@ -1548,35 +1684,39 @@
 
 static RawObject* LookupObjectId(Isolate* isolate,
                                  const char* arg,
-                                 bool* error) {
-  *error = false;
+                                 ObjectIdRing::LookupResult* kind) {
+  *kind = ObjectIdRing::kValid;
   if (strncmp(arg, "int-", 4) == 0) {
     arg += 4;
     int64_t value = 0;
     if (!OS::StringToInt64(arg, &value) ||
         !Smi::IsValid(value)) {
-      *error = true;
+      *kind = ObjectIdRing::kInvalid;
       return Object::null();
     }
     const Integer& obj =
         Integer::Handle(isolate, Smi::New(static_cast<intptr_t>(value)));
     return obj.raw();
-
   } else if (strcmp(arg, "bool-true") == 0) {
     return Bool::True().raw();
-
   } else if (strcmp(arg, "bool-false") == 0) {
     return Bool::False().raw();
+  } else if (strcmp(arg, "null") == 0) {
+    return Object::null();
+  } else if (strcmp(arg, "not-initialized") == 0) {
+    return Object::sentinel().raw();
+  } else if (strcmp(arg, "being-initialized") == 0) {
+    return Object::transition_sentinel().raw();
   }
 
   ObjectIdRing* ring = isolate->object_id_ring();
   ASSERT(ring != NULL);
   intptr_t id = -1;
   if (!GetIntegerId(arg, &id)) {
-    *error = true;
-    return Instance::null();
+    *kind = ObjectIdRing::kInvalid;
+    return Object::null();
   }
-  return ring->GetObjectForId(id);
+  return ring->GetObjectForId(id, kind);
 }
 
 
@@ -1594,6 +1734,40 @@
 }
 
 
+static bool HandleIsolateMetricsList(Isolate* isolate, JSONStream* js) {
+  JSONObject obj(js);
+  obj.AddProperty("type", "MetricList");
+  obj.AddProperty("id", "metrics/vm");
+  {
+    JSONArray members(&obj, "members");
+    Metric* current = isolate->metrics_list_head();
+    while (current != NULL) {
+      members.AddValue(current);
+      current = current->next();
+    }
+  }
+  return true;
+}
+
+
+static bool HandleIsolateMetric(Isolate* isolate,
+                                JSONStream* js,
+                                const char* id) {
+  Metric* current = isolate->metrics_list_head();
+  while (current != NULL) {
+    const char* name = current->name();
+    ASSERT(name != NULL);
+    if (strcmp(name, id) == 0) {
+      current->PrintJSON(js);
+      return true;
+    }
+    current = current->next();
+  }
+  PrintError(js, "Metric %s not found\n", id);
+  return true;
+}
+
+
 static bool HandleMetricsList(Isolate* isolate, JSONStream* js) {
   const Class& metrics_cls = Class::Handle(isolate, GetMetricsClass(isolate));
   const String& print_metrics_name =
@@ -1645,11 +1819,23 @@
   if (js->num_arguments() == 1) {
     return HandleMetricsList(isolate, js);
   }
+  ASSERT(js->num_arguments() > 1);
+  const char* arg = js->GetArgument(1);
+  if (strcmp(arg, "vm") == 0) {
+    if (js->num_arguments() == 2) {
+      return HandleIsolateMetricsList(isolate, js);
+    } else {
+      if (js->num_arguments() > 3) {
+        PrintError(js, "Command too long");
+        return true;
+      }
+      return HandleIsolateMetric(isolate, js, js->GetArgument(2));
+    }
+  }
   if (js->num_arguments() > 2) {
     PrintError(js, "Command too long");
     return true;
   }
-  const char* arg = js->GetArgument(1);
   return HandleMetric(isolate, js, arg);
 }
 
@@ -1663,35 +1849,8 @@
   }
   const char* arg = js->GetArgument(1);
 
-  // Handle special objects first.
-  if (strcmp(arg, "null") == 0) {
-    if (js->num_arguments() > 2) {
-      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
-                 js->num_arguments());
-    } else {
-      Instance::null_instance().PrintJSON(js, false);
-    }
-    return true;
-
-  } else if (strcmp(arg, "not-initialized") == 0) {
-    if (js->num_arguments() > 2) {
-      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
-                 js->num_arguments());
-    } else {
-      Object::sentinel().PrintJSON(js, false);
-    }
-    return true;
-
-  } else if (strcmp(arg, "being-initialized") == 0) {
-    if (js->num_arguments() > 2) {
-      PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
-                 js->num_arguments());
-    } else {
-      Object::transition_sentinel().PrintJSON(js, false);
-    }
-    return true;
-
-  } else if (strcmp(arg, "optimized-out") == 0) {
+  // Handle special non-objects first.
+  if (strcmp(arg, "optimized-out") == 0) {
     if (js->num_arguments() > 2) {
       PrintError(js, "expected at most 2 arguments but found %" Pd "\n",
                  js->num_arguments());
@@ -1721,19 +1880,19 @@
 
   // Lookup the object.
   Object& obj = Object::Handle(isolate);
-  bool error = false;
-  obj = LookupObjectId(isolate, arg, &error);
-  if (error) {
+  ObjectIdRing::LookupResult kind = ObjectIdRing::kInvalid;
+  obj = LookupObjectId(isolate, arg, &kind);
+  if (kind == ObjectIdRing::kInvalid) {
     PrintError(js, "unrecognized object id '%s'", arg);
     return true;
   }
   if (js->num_arguments() == 2) {
     // Print.
-    if (obj.IsNull()) {
+    if (kind == ObjectIdRing::kCollected) {
       // The object has been collected by the gc.
       PrintPseudoNull(js, "objects/collected", "<collected>");
       return true;
-    } else if (obj.raw() == Object::sentinel().raw()) {
+    } else if (kind == ObjectIdRing::kExpired) {
       // The object id has expired.
       PrintPseudoNull(js, "objects/expired", "<expired>");
       return true;
@@ -1741,7 +1900,7 @@
     obj.PrintJSON(js, false);
     return true;
   }
-  return HandleInstanceCommands(isolate, &obj, js, 2);
+  return HandleInstanceCommands(isolate, &obj, kind, js, 2);
 }
 
 
@@ -2276,9 +2435,8 @@
 
 static bool HandleRootEcho(JSONStream* js) {
   JSONObject jsobj(js);
-  jsobj.AddProperty("type", "message");
-  PrintArgumentsAndOptions(jsobj, js);
-  return true;
+  jsobj.AddProperty("id", "_echo");
+  return HandleCommonEcho(&jsobj, js);
 }
 
 
@@ -2391,7 +2549,7 @@
 }
 
 
-void Service::SendEvent(intptr_t eventId, const String& eventMessage) {
+void Service::SendEvent(intptr_t eventId, const Object& eventMessage) {
   if (!IsRunning()) {
     return;
   }
@@ -2419,6 +2577,33 @@
 }
 
 
+void Service::SendEvent(intptr_t eventId,
+                        const String& meta,
+                        const uint8_t* data,
+                        intptr_t size) {
+  // Bitstream: [meta data size (big-endian 64 bit)] [meta data (UTF-8)] [data]
+  const intptr_t meta_bytes = Utf8::Length(meta);
+  const intptr_t total_bytes = sizeof(uint64_t) + meta_bytes + size;
+  const TypedData& message = TypedData::Handle(
+      TypedData::New(kTypedDataUint8ArrayCid, total_bytes));
+  intptr_t offset = 0;
+  // TODO(koda): Rename these methods SetHostUint64, etc.
+  message.SetUint64(0, Utils::HostToBigEndian64(meta_bytes));
+  offset += sizeof(uint64_t);
+  {
+    NoGCScope no_gc;
+    meta.ToUTF8(static_cast<uint8_t*>(message.DataAddr(offset)), meta_bytes);
+    offset += meta_bytes;
+  }
+  // TODO(koda): It would be nice to avoid this copy (requires changes to
+  // MessageWriter code).
+  memmove(message.DataAddr(offset), data, size);
+  offset += size;
+  ASSERT(offset == total_bytes);
+  SendEvent(eventId, message);
+}
+
+
 void Service::HandleGCEvent(GCEvent* event) {
   JSONStream js;
   event->PrintJSON(&js);
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 7767369..7270e24 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -11,13 +11,14 @@
 
 namespace dart {
 
+class Array;
 class DebuggerEvent;
-class GCEvent;
 class EmbedderServiceHandler;
+class GCEvent;
 class Instance;
 class Isolate;
 class JSONStream;
-class Array;
+class Object;
 class RawInstance;
 class String;
 
@@ -65,6 +66,8 @@
     return isolate == service_isolate_;
   }
 
+  static void SendEchoEvent(Isolate* isolate);
+
  private:
   // These must be kept in sync with service/constants.dart
   static const int kEventFamilyDebug = 0;
@@ -79,7 +82,12 @@
   static Dart_Handle GetSource(const char* name);
   static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, Dart_Handle library,
                                        Dart_Handle url);
-  static void SendEvent(intptr_t eventId, const String& eventMessage);
+  static void SendEvent(intptr_t eventId, const Object& eventMessage);
+  // Does not take ownership of 'data'.
+  static void SendEvent(intptr_t eventId,
+                        const String& meta,
+                        const uint8_t* data,
+                        intptr_t size);
 
   static EmbedderServiceHandler* isolate_service_handler_head_;
   static EmbedderServiceHandler* root_service_handler_head_;
diff --git a/runtime/vm/service/client.dart b/runtime/vm/service/client.dart
index ba34f1c..a9cbd38 100644
--- a/runtime/vm/service/client.dart
+++ b/runtime/vm/service/client.dart
@@ -34,7 +34,7 @@
   }
 
   /// When implementing, responsible for sending [response] to the client.
-  void post(var seq, String response);
+  void post(var seq, dynamic response);
 
   dynamic toJson() {
     return {
diff --git a/runtime/vm/service/protocol.md b/runtime/vm/service/protocol.md
new file mode 100644
index 0000000..6500ebd
--- /dev/null
+++ b/runtime/vm/service/protocol.md
@@ -0,0 +1,447 @@
+# Dart VM Service Protocol
+
+NOTE: The service api is still changing rapidly.  If you use the
+service api, expect to encounter non-compatible changes.
+
+Description
+How to start
+JSON
+Websocket
+
+## Types
+
+Every response returned by the VM Service has the <code>type</code>
+property.  This allows the client distinguish between different kinds
+of responses.  For example, global information about the VM is encoded
+in an response of type [VM](#VM) and information about an isolate is
+encoded in an response of type [Isolate](#Isolate).
+
+If the type name of a response begins with an <code>@</code> character
+then that response is a _reference_.  If the type name of a response
+does not begin with an <code>@</code> character then that response is
+an _object_ (or sometimes _full object_).  A reference is meant to be
+a subset of a full object with just enough information for the client
+to generate a reasonable-looking link.
+
+For example, an isolate reference may look like this...
+
+    {
+      type: "@Isolate",
+      id: "isolates/123",
+      name: "worker"
+    }
+
+... and a full isolate object would have additional properties:
+
+    {
+      type: "Isolate",
+      id: "isolates/123",
+      name: "worker"
+      entry: ...
+      heaps: ...
+      topFrame: ...
+      ...
+    }
+
+## IDs
+
+Most responses returned by the VM Service have an <code>id</code>
+property.  An id is used to request an object from the VM.  Each id is
+unique; that is to say, If two responses have the same id, they refer
+to the same object.  The converse is not true: the same object may
+occasionally be returned with two different ids.
+
+An id is either _global_ or _relative_.  Global ids can be requested
+from the VM directly by requesting the uri <code>/{global id}</code>.
+
+The following is a list of known,  fixed global ids:
+
+| id | uri | type
+| --- | --- | ---
+| vm | /vm | [VM](#VM)
+| flags | /flags | [FlagList](#FlagList)
+
+In addition, all isolates have global ids, but these ids are
+dynamically generated.  An isolate with an id like
+<code>isolates/123</code> would be available at the uri
+<code>/isolates/123</code>.
+
+Relative ids are used to refer to objects that are owned by an
+isolate.  Relative ids can be requested from the VM directly by
+requesting the uri <code>/{isolate&nbsp;id}/{relative&nbsp;id}</code>.
+
+For example, we can get information about a class with id
+<code>classes/Foo</code> from isolate <code>isolates/123</code> by
+requesting the uri <code>/isolates/123/classes/Foo</code> from the VM.
+
+The client must not parse ids -- they must be treated as opaque
+strings.  We reserve the right to change the ids of objects.
+
+## Names
+
+Many responses have the <code>name</code> property.  Names are
+provided so that objects can be displayed in a way that a Dart
+language programmer would find sensible.
+
+Note that names are not in any way unique.  Many objects will have the
+same name.
+
+Occasionally responses will have the <code>vmName</code> property.
+This represents the internal names used to refer to an object inside
+the VM itself.  The <code>vmName</code> of an object is only provided
+when it differs from the <code>name</code> property; when
+<code>vmName</code> is not present, the client may assume the
+<code>name</code> and <code>vmName</code> are the same.
+
+## Events
+
+TODO
+
+## Catalog of Types
+
+### <a name="atAbstractType"></a>@AbstractType
+
+### <a name="AbstractType"></a>AbstractType
+
+### <a name="Breakpoint"></a>Breakpoint
+
+TODO: Get rid of Location or else use it more generally.
+
+| keys | values | comments
+| --- | --- | ---
+| type | "Breakpoint" |
+| id | String |
+| breakpointNumber | int |
+| enabled | bool |
+| resolved | bool |
+| location | [Location](#Location) |
+
+### <a name="atClass"></a>@Class
+| keys | values | comments
+| --- | --- | ---
+| type | "@Class" |
+| id | String |
+| name | String |
+| vmName? | String |
+
+### <a name="Class"></a>Class
+| keys | values | comments
+| --- | --- | ---
+| type | "@Class" |
+| id | String |
+| name | String |
+| vmName? | String |
+| error? | [Error](#Error) | Error encountered during class finalization
+| implemented | bool |
+| abstract | bool |
+| patch | bool |
+| finalized | bool |
+| const | bool |
+| super? | [@Class](#atClass) | Super class
+| library | [@Library](#atLibrary) | Owning library
+| script? | [@Script](#atScript) | Script containing class source
+| tokenPos? | int | starting token position of class source in script
+| endTokenPos? | int | end token position of class source in script
+| interfaces | List of [@Class](#atClass) | interfaces this class has implemented
+| fields | List of [@Field](#atField) |
+| functions | List of [@Function](#atFunction) |
+| subclasses | List of [@Class](#atClass) | classes which extend this class.
+| canonicalTypes | [@TypeList] | kill?
+| allocationStats | ClassHeapStats |
+
+### <a name="ClassHeapStats"></a>ClassHeapStats
+| keys | values | comments
+| --- | --- | ---
+| type | "ClassHeapStats" |
+| id | String |
+| class | [@Class](#atClass) |
+| new | List of int | Allocation statistics for new space. See note below on allocation statistics list format.
+| old | List of int | Allocation statistics for old space. See note below on allocation statistics list format.
+| promotedInstances | int | number of instances promoted at last new-space GC.
+| promotedBytes | int | number of bytes promoted at last new-space GC.
+
+*Allocation statistics list format*
+| index | value | description
+| --- | --- | --- |
+| 0 | int | Instances allocated before last GC |
+| 1 | int | Bytes allocated before last GC |
+| 2 | int | Instances alive after last GC |
+| 3 | int | Bytes alive after last GC |
+| 4 | int | Instances allocated since last GC |
+| 5 | int | Bytes allocated since last GC |
+| 6 | int | Instances allocated since last accumulator reset |
+| 7 | int | Bytes allocated since last accumulator reset |
+
+### <a name="atCode"></a>@Code
+| keys | values | comments
+| --- | --- | ---
+| type | "@Code" |
+| id | String |
+| name | String |
+| vmName? | String |
+| start | String | starting address of code
+| end | String | ending address of code
+| isOptimized | bool |
+| isAlive | bool |
+| kind | String
+| function | [@Function](#atFunction) |
+
+### <a name="Code"></a>Code
+| keys | values | comments
+| --- | --- | ---
+| type | "@Code" |
+| id | String |
+| name | String |
+| vmName? | String |
+| start | String | starting address of code
+| end | String | ending address of code
+| isOptimized | bool |
+| isAlive | bool |
+| kind | String
+| function | [@Function](#atFunction) |
+| object_pool | List of [@Object](Object) |
+| disassembly | List of String | See note below on disassembly list format
+
+*Disassembly list format*
+| index | value | description
+| --- | --- | --- |
+| 0 | String | Address of instruction
+| 1 | String | Hex encoding of instruction
+| 2 | String | Human encoding of instruction
+| 0 + (3 * K) | String | Address of Kth instruction
+| 1 + (3 * K) | String | Hex encoding of instruction of Kth instruction
+| 2 + (3 * K) | String | Human encoding of instruction of Kth instruction
+
+### <a name="DebuggerEvent"></a>DebuggerEvent
+
+| keys | values | comments
+| --- | --- | ---
+| type | "DebuggerEvent" |
+| id | String | TODO: Remove |
+| eventType | String | "BreakpointReached", "BreakpointResolved", "ExceptionThrown", "IsolateCreated", "IsolateShutdown", or "IsolateInterrupted" |
+| isolate | [@Isolate](#atIsolate) |
+| breakpoint? | [Breakpoint](#atBreakpoint) | for eventTypes "BreakpointResolved" and "BreakpointReached<br><br>TODO: Maybe make this @Breakpoint?
+| exception? | [@Instance](#atInstance) | for eventType "ExceptionThrown"
+
+### <a name="Error"></a>Error
+
+TODO: Drop id from Error.
+
+| keys | values | comments
+| --- | --- | ---
+| type | "Error" |
+| id | String | always empty
+| kind | String |
+| message | String |
+
+### <a name="atField"></a>@Field
+| keys | values | comments
+| --- | --- | ---
+| type | "@Field" |
+| id | String |
+| name | String |
+| vmName? | String |
+| value? | Instance | value associated with static field <-- do we want to include this in a field reference?
+| owner | [@Library](#atLibrary),[@Class](#atClass) | Owning library or class <-- handling of owner is inconsistent with Function
+| declared_type | [@AbstractType](#atAbstractType) |
+| static | bool |
+| final | bool |
+| const | bool |
+
+### <a name="Field"></a>Field
+| keys | values | comments
+| --- | --- | ---
+| type | "Field" |
+| id | String |
+| name | String |
+| vmName? | String |
+| value? | Instance | value associated with static field
+| owner | [@Library](#atLibrary) | Owning library <-- handling of owner is inconsistent with Function
+| owner | [@Class](#atClass) | Owning class <-- handling of owner is inconsistent with Function
+| declared_type | [@AbstractType](#atAbstractType) |
+| static | bool |
+| final | bool |
+| const | bool |
+| guard_nullable | bool | can this field hold a null?
+| guard_class | String OR [@Class](#atClass) | "unknown", "dynamic", or a class
+| guard_length | String OR int | "unknown", "variable", or length of array
+| script? | [@Script](#atScript) | Script containing field source
+| tokenPos? | int | starting token position of field source in script
+
+### <a name="Frame"></a>Frame
+
+TODO: Add type and id?<br>
+
+| keys | values | comments
+| --- | --- | ---
+| script | [@Script](#atScript) |
+| tokenPos | int |
+| function | [@Function](#atFunction) |
+| code | [@Code](#atCode) |
+| vars | List of [FrameVar](#FrameVar) |
+
+### <a name="FrameVar"></a>FrameVar
+
+| keys | values | comments
+| --- | --- | ---
+| name | String |
+| value | [@Instance](#atInstance) |
+
+### <a name="atFunction"></a>@Function
+| keys | values | comments
+| --- | --- | ---
+| type | "@Function" |
+| id | String |
+| name | String |
+| vmName? | String |
+| owningLibrary? | [@Library](#atLibrary) | Set for non-top level functions
+| owningClass? | [@Class](#atClass) | Set for non-top level functions
+| parent? | [@Function](#atFunction) | Parent function
+| kind | String |
+
+### <a name="Function"></a>Function
+| keys | values | comments
+| --- | --- | ---
+| type | "@Function" |
+| id | String |
+| name | String |
+| vmName? | String |
+| owningLibrary | [@Library](#atLibrary) | Set for non-top level functions
+| owningClass | [@Class](#atClass) | Set for non-top level functions
+| parent? | [@Function](#atFunction) | Parent function
+| kind | String |
+| static | bool |
+| const | bool |
+| optimizable | bool |
+| inlinable | bool |
+| usage_counter | int |
+| optimized_call_site_count | int |
+| deoptimizations | int |
+| script? | [@Script](#atScript) | Script containing function source
+| tokenPos? | int | starting token position of function source in script
+| endTokenPos? | int | end token position of function source in script
+| unoptimized_code | [@Code](#atCode) |
+| code | [@Code](#atCode) | Current code
+
+### <a name="atIsolate"></a>@Isolate
+
+| keys | values | comments
+| --- | --- | ---
+| type | "@Isolate" |
+| id | String |
+| mainPort | String | kill? |
+| name | String |
+
+### Isolate
+
+| keys | values | comments
+| --- | --- | ---
+| type | "Isolate" |
+| id | String |
+| mainPort | String | kill? |
+| name | String |
+| entry? | [@Function](#atFunction) |
+| heaps | ??? |
+| topFrame? | [Frame](#Frame) |
+| livePorts | int |
+| pauseOnExit | bool |
+| pauseEvent? | [DebuggerEvent](#DebuggerEvent) |
+| rootLib | [@Library](#atLibrary) |
+| timers | ??? |
+| tagCounters | ??? |
+| error? | [Error](#Error) |
+| canonicalTypeArguments | | kill? |
+| libs | List of [@Library](#atLibrary) |
+| features | List of String |
+
+### <a name="atLibrary"></a>@Library
+
+| keys | values | comments
+| --- | --- | ---
+| type | "@Library" |
+| id | String |
+| name | String |
+| vmName? | String | Internal vm name.  Provided only when different from 'name'.
+| url | String
+
+### <a name="Library"></a>Library
+
+| keys | values | comments
+| --- | --- | ---
+| type | "Library" |
+| id | String |
+| name | String |
+| vmName? | String | Internal vm name.  Provided only when different from 'name'.
+| classes | List of [@Class](#atClass) |
+| imports | List of [@Library](#atLibrary) |
+| variables | List of ... |
+| functions | List of [@Function](#atFunction) |
+| scripts | List of [@Script](#atScript) |
+
+### <a name="Location"></a>Location
+
+| keys | values | comments
+| --- | --- | ---
+| type | "Location" |
+| script | [@Script](#atScript) |
+| tokenPos | int |
+
+### <a name="@Null"></a>@Null
+
+TODO: Split Null from the other Sentinel types.
+
+| keys | values | comments
+| --- | --- | ---
+| type | "@Null" |
+| id | String | |
+| valueAsString | String |
+
+### <a name="PcDescriptor"></a>PcDescriptor
+
+### <a name="atScript"></a>@Script
+| keys | values | comments | example |
+| --- | --- | ---
+| type | "@Script" |
+| id | String
+| name | String
+| vmName? | String | Internal vm name.  Provided only when different from 'name'.
+| kind | String
+
+### <a name="Script"></a>Script
+| keys | values | comments
+| --- | --- | ---
+| type | "@Script" |
+| id | String
+| name | String
+| vmName? | String | Internal vm name.  Provided only when different from 'name'.
+| kind | String
+| owningLibrary | [@Library](#atLibrary) |
+| source | String
+| tokenPosTable | List of list of int. See note below about token line format.
+
+*Token line format*
+| index | value | comments
+| --- | --- | ---
+| 0   | int | line number
+| 1   | int | first token position
+| 2   | int | first column number
+| ... | ... | ...
+| 1 + (2 * k) | int | kth token position
+| 2 + (2 * k) | int | kth column number
+
+### <a name="VM"></a>VM
+
+| keys | values | comments
+| --- | --- | ---
+| type | "VM" |
+| id | String |
+| targetCPU | String |
+| hostCPU | String |
+| date | String | kill? |
+| version | String |
+| pid | int |
+| assertsEnabled | bool | TODO: move to features? |
+| typeChecksEnabled | bool | TODO: move to features? |
+| uptime | double | seconds since vm started |
+| "isolates"    | List of [@Isolate](#atIsolate)  |
+
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart
index 8ea38d7..3f53dbe 100644
--- a/runtime/vm/service/vmservice.dart
+++ b/runtime/vm/service/vmservice.dart
@@ -82,7 +82,7 @@
     }
   }
 
-  void _eventMessageHandler(int eventType, String eventMessage) {
+  void _eventMessageHandler(int eventType, dynamic eventMessage) {
     var subscribers = eventMap[eventType];
     if (subscribers == null) {
       return;
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 4e69563..5a0f5b2 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -292,7 +292,7 @@
       "\"location\":{\"type\":\"Location\","
       "\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"name\":\"test-lib\",\"kind\":\"script\"},"
       "\"tokenPos\":5}}",
       vmlib.index());
 
@@ -309,7 +309,7 @@
       "\"location\":{\"type\":\"Location\","
       "\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"name\":\"test-lib\",\"kind\":\"script\"},"
       "\"tokenPos\":5}}]}",
       vmlib.index());
 
@@ -324,7 +324,7 @@
       "\"location\":{\"type\":\"Location\","
       "\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"name\":\"test-lib\",\"kind\":\"script\"},"
       "\"tokenPos\":5}}",
       vmlib.index());
 
@@ -468,7 +468,7 @@
       "\"location\":{\"type\":\"Location\","
       "\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"},"
+      "\"name\":\"test-lib\",\"kind\":\"script\"},"
       "\"tokenPos\":11}}",
       vmlib.index());
 
@@ -522,17 +522,17 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'null'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
-  EXPECT_STREQ(
+  handler.filterMsg("vmName");
+  EXPECT_SUBSTRING(
       "{\"type\":\"Null\",\"id\":\"objects\\/null\","
-      "\"valueAsString\":\"null\"}",
+      "\"valueAsString\":\"null\",\"class\":",
       handler.msg());
 
   // not initialized
   service_msg = Eval(lib, "[0, port, ['objects', 'not-initialized'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/not-initialized\","
       "\"valueAsString\":\"<not initialized>\"}",
@@ -543,7 +543,7 @@
                      "[0, port, ['objects', 'being-initialized'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/being-initialized\","
       "\"valueAsString\":\"<being initialized>\"}",
@@ -553,7 +553,7 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'optimized-out'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/optimized-out\","
       "\"valueAsString\":\"<optimized out>\"}",
@@ -563,7 +563,7 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'collected'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/collected\","
       "\"valueAsString\":\"<collected>\"}",
@@ -573,7 +573,7 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'expired'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
       "\"valueAsString\":\"<expired>\"}",
@@ -583,22 +583,22 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'bool-true'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Bool\",\"id\":\"objects\\/bool-true\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\","
-      "\"user_name\":\"bool\"},\"valueAsString\":\"true\"}",
+      "\"name\":\"bool\"},\"valueAsString\":\"true\"}",
       handler.msg());
 
   // int
   service_msg = Eval(lib, "[0, port, ['objects', 'int-123'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"_Smi\"},"
+      "\"name\":\"_Smi\",},"
       "\"fields\":[],"
       "\"id\":\"objects\\/int-123\","
       "\"valueAsString\":\"123\"}",
@@ -608,18 +608,18 @@
   service_msg = Eval(lib, "[0, port, ['objects', '$validId'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   handler.filterMsg("size");
   handler.filterMsg("id");
   EXPECT_STREQ(
       "{\"type\":\"Array\","
-      "\"class\":{\"type\":\"@Class\",\"user_name\":\"_List\"},"
+      "\"class\":{\"type\":\"@Class\",\"name\":\"_List\",},"
       "\"fields\":[],"
       "\"length\":1,"
       "\"elements\":[{"
           "\"index\":0,"
           "\"value\":{\"type\":\"@String\","
-          "\"class\":{\"type\":\"@Class\",\"user_name\":\"_OneByteString\"},"
+          "\"class\":{\"type\":\"@Class\",\"name\":\"_OneByteString\",},"
           "\"valueAsString\":\"\\\"value\\\"\"}}]}",
       handler.msg());
 
@@ -627,7 +627,7 @@
   service_msg = Eval(lib, "[0, port, ['objects', '99999999'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
       "\"valueAsString\":\"<expired>\"}",
@@ -637,7 +637,7 @@
   service_msg = Eval(lib, "[0, port, ['objects', 'expired', 'eval'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Error\",\"id\":\"\","
       "\"message\":\"expected at most 2 arguments but found 3\\n\","
@@ -651,11 +651,11 @@
                      "['expr'], ['this+99']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"_Smi\"},"
+      "\"name\":\"_Smi\",},"
       "\"id\":\"objects\\/int-222\","
       "\"valueAsString\":\"222\"}",
       handler.msg());
@@ -666,7 +666,7 @@
                      "['expr'], ['null']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"@Null\",\"id\":\"objects\\/null\","
       "\"valueAsString\":\"null\"}",
@@ -677,7 +677,7 @@
                      "['expr'], ['this']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Error\",\"id\":\"\",\"kind\":\"EvalExpired\","
       "\"message\":\"attempt to evaluate against expired object\\n\","
@@ -691,7 +691,7 @@
                      "['expr'], ['this+99']]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"Error\",\"id\":\"\","
       "\"message\":\"expected at most 3 arguments but found 4\\n\","
@@ -704,7 +704,7 @@
                      "[0, port, ['objects', '$validId', 'retained'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"objects\\/int-%" Pd "\"",
                    arr.raw()->Size() + arr.At(0)->Size());
@@ -897,11 +897,11 @@
                       vmlib.index());
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"_Smi\"},\"id\":\"objects\\/int-54320\","
+      "\"name\":\"_Smi\",},\"id\":\"objects\\/int-54320\","
       "\"valueAsString\":\"54320\"}",
       handler.msg());
 }
@@ -976,25 +976,25 @@
                       "['expr'], ['cobra + 100000']]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  handler.filterMsg("name");
+  handler.filterMsg("vmName");
   EXPECT_STREQ(
       "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"_Smi\"},"
+      "\"name\":\"_Smi\",},"
       "\"id\":\"objects\\/int-111235\","
       "\"valueAsString\":\"111235\"}",
       handler.msg());
 
-  // Request function 0 from class A.
+  // Request function 'b' from class A.
   service_msg = EvalF(lib,
-                      "[0, port, ['classes', '%" Pd "', 'functions', '0'],"
+                      "[0, port, ['classes', '%" Pd "', 'functions', 'b'],"
                       "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg());
   ExpectSubstringF(handler.msg(),
-                   "\"id\":\"classes\\/%" Pd "\\/functions\\/0\","
-                   "\"name\":\"get:a\",", cid);
+                   "\"id\":\"classes\\/%" Pd "\\/functions\\/b\","
+                   "\"name\":\"b\",", cid);
 
   // Request field 0 from class A.
   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '0'],"
@@ -1058,21 +1058,22 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\","
+    "{\"type\":\"Error\",\"id\":\"\","
+    "\"message\":\"Command should have 4 or 5 arguments\","
     "\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\",\"y\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Invalid function subcommand with valid function id.
   service_msg = EvalF(lib,
-                      "[0, port, ['classes', '%" Pd "', 'functions', '0',"
+                      "[0, port, ['classes', '%" Pd "', 'functions', 'b',"
                       "'x'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
     "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection x\","
     "\"request\":"
-    "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\"],"
+    "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"b\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Retained size of all instances of class B.
@@ -1100,7 +1101,8 @@
   ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2",
                    kInstanceListId);
   Array& list = Array::Handle();
-  list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId);
+  ObjectIdRing::LookupResult kind;
+  list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId, &kind);
   EXPECT_EQ(2, list.Length());
   // The list should contain {b0, b1}.
   EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) ||
@@ -1323,9 +1325,9 @@
                       address);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ("{\"type\":\"Null\",\"id\":\"objects\\/null\","
-               "\"valueAsString\":\"null\"}",
-               handler.msg());
+  EXPECT_SUBSTRING("{\"type\":\"Null\",\"id\":\"objects\\/null\","
+                   "\"valueAsString\":\"null\"",
+                   handler.msg());
 
   // Request malformed native code.
   service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]",
@@ -1450,10 +1452,10 @@
   OS::SNPrint(buf, sizeof(buf),
       "{\"type\":\"Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\","
-      "\"owning_library\":{\"type\":\"@Library\","
-      "\"id\":\"libraries\\/%" Pd "\",\"user_name\":\"\",\"name\":\"\","
+      "\"owningLibrary\":{\"type\":\"@Library\","
+      "\"id\":\"libraries\\/%" Pd "\",\"name\":\"\","
       "\"url\":\"test-lib\"},"
       "\"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]]}",
@@ -1500,7 +1502,7 @@
   OS::SNPrint(buf, sizeof(buf),
               "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
               "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"name\":\"test-lib\","
               "\"kind\":\"script\"},\"hits\":"
               "[5,1,6,1]}",
               vmlib.index());
@@ -1548,7 +1550,7 @@
       "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
@@ -1593,7 +1595,7 @@
               "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
               "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
               "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"name\":\"test-lib\","
               "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}",
               vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
@@ -1657,7 +1659,7 @@
               "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
               "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
               "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-              "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+              "\"name\":\"test-lib\","
               "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}",
               vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
@@ -1715,14 +1717,11 @@
   const Function& func = Function::Handle(
       cls.LookupFunction(String::Handle(String::New("bar"))));
   ASSERT(!func.IsNull());
-  intptr_t function_id = -1;
-  function_id = cls.FindFunctionIndex(func);
-  ASSERT(function_id != -1);
 
   char buf[1024];
   OS::SNPrint(buf, sizeof(buf),
               "[0, port, ['classes', '%" Pd "', 'functions',"
-              "'% " Pd "', 'coverage'], [], []]", i,  function_id);
+              "'bar', 'coverage'], [], []]", i);
 
   Array& service_msg = Array::Handle();
   service_msg = Eval(lib, buf);
@@ -1732,7 +1731,7 @@
       "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
       "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
-      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", vmlib.index());
   EXPECT_STREQ(buf, handler.msg());
 }
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 8ddaff9..24ce8c6 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -15,6 +15,7 @@
 #include "vm/object_store.h"
 #include "vm/snapshot_ids.h"
 #include "vm/symbols.h"
+#include "vm/version.h"
 
 namespace dart {
 
@@ -165,8 +166,11 @@
     : BaseReader(buffer, size),
       kind_(kind),
       isolate_(isolate),
+      heap_(isolate->heap()),
+      old_space_(isolate->heap()->old_space()),
       cls_(Class::Handle(isolate)),
       obj_(Object::Handle(isolate)),
+      pobj_(PassiveObject::Handle(isolate)),
       array_(Array::Handle(isolate)),
       field_(Field::Handle(isolate)),
       str_(String::Handle(isolate)),
@@ -293,7 +297,7 @@
     intptr_t instance_size = cls_.instance_size();
     ASSERT(instance_size > 0);
     if (kind_ == Snapshot::kFull) {
-      result ^= AllocateUninitialized(cls_, instance_size);
+      result ^= AllocateUninitialized(cls_.id(), instance_size);
     } else {
       result ^= Object::Allocate(cls_.id(), instance_size, HEAP_SPACE(kind_));
     }
@@ -334,7 +338,7 @@
   switch (class_id) {
 #define SNAPSHOT_READ(clazz)                                                   \
     case clazz::kClassId: {                                                    \
-      obj_ = clazz::ReadFrom(this, object_id, tags, kind_);                    \
+      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_);                   \
       break;                                                                   \
     }
     CLASS_LIST_NO_OBJECT(SNAPSHOT_READ)
@@ -344,7 +348,7 @@
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(class_id, tags);
-      obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
+      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
 #undef SNAPSHOT_READ
@@ -353,16 +357,16 @@
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(class_id, tags);
-      obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
+      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
 #undef SNAPSHOT_READ
     default: UNREACHABLE(); break;
   }
   if (kind_ == Snapshot::kFull) {
-    obj_.SetCreatedFromSnapshot();
+    pobj_.SetCreatedFromSnapshot();
   }
-  return obj_.raw();
+  return pobj_.raw();
 }
 
 
@@ -386,94 +390,163 @@
 }
 
 
-void SnapshotReader::ReadFullSnapshot() {
+class HeapLocker : public StackResource {
+ public:
+  HeapLocker(Isolate* isolate, PageSpace* page_space)
+      : StackResource(isolate), page_space_(page_space) {
+        page_space_->AcquireDataLock();
+  }
+  ~HeapLocker() {
+    page_space_->ReleaseDataLock();
+  }
+
+ private:
+  PageSpace* page_space_;
+};
+
+
+RawApiError* SnapshotReader::ReadFullSnapshot() {
   ASSERT(kind_ == Snapshot::kFull);
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   ObjectStore* object_store = isolate->object_store();
   ASSERT(object_store != NULL);
-  NoGCScope no_gc;
 
   // TODO(asiva): Add a check here to ensure we have the right heap
   // size for the full snapshot being read.
 
-  // Read in all the objects stored in the object store.
-  intptr_t num_flds = (object_store->to() - object_store->from());
-  for (intptr_t i = 0; i <= num_flds; i++) {
-    *(object_store->from() + i) = ReadObjectImpl();
-  }
-  for (intptr_t i = 0; i < backward_references_.length(); i++) {
-    if (!backward_references_[i].is_deserialized()) {
-      ReadObjectImpl();
-      backward_references_[i].set_state(kIsDeserialized);
-    }
-  }
+  {
+    NoGCScope no_gc;
+    HeapLocker hl(isolate, old_space());
 
-  // Validate the class table.
+    // First read the version string, and check that it matches.
+    obj_ = ReadObject();
+
+    // If the version string doesn't match, return an error.
+    // NB: New things are allocated only if we're going to return an error.
+    if (!obj_.IsString() ||
+        !String::Cast(obj_).Equals(Version::SnapshotString())) {
+      const intptr_t kMessageBufferSize = 128;
+      char message_buffer[kMessageBufferSize];
+      OS::SNPrint(message_buffer,
+                  kMessageBufferSize,
+                  "Wrong full snapshot version. Found %s expected %s",
+                  obj_.ToCString(),
+                  Version::SnapshotString());
+      const String& msg = String::Handle(String::New(message_buffer));
+      return ApiError::New(msg);
+    }
+
+    // The version string matches. Read the rest of the snapshot.
+
+    // Read in all the objects stored in the object store.
+    intptr_t num_flds = (object_store->to() - object_store->from());
+    for (intptr_t i = 0; i <= num_flds; i++) {
+      *(object_store->from() + i) = ReadObjectImpl();
+    }
+    for (intptr_t i = 0; i < backward_references_.length(); i++) {
+      if (!backward_references_[i].is_deserialized()) {
+        ReadObjectImpl();
+        backward_references_[i].set_state(kIsDeserialized);
+      }
+    }
+
+    // Validate the class table.
 #if defined(DEBUG)
-  isolate->ValidateClassTable();
+    isolate->ValidateClassTable();
 #endif
 
-  // Setup native resolver for bootstrap impl.
-  Bootstrap::SetupNativeResolver();
+    // Setup native resolver for bootstrap impl.
+    Bootstrap::SetupNativeResolver();
+    return ApiError::null();
+  }
 }
 
 
-#define ALLOC_NEW_OBJECT_WITH_LEN(type, class_obj, length)                     \
+RawObject* SnapshotReader::ReadScriptSnapshot() {
+  ASSERT(kind_ == Snapshot::kScript);
+
+  // First read the version string, and check that it matches.
+  obj_ = ReadObject();
+
+  // If the version string doesn't match, return an error.
+  // NB: New things are allocated only if we're going to return an error.
+  if (!obj_.IsString() ||
+      !String::Cast(obj_).Equals(Version::SnapshotString())) {
+    const intptr_t kMessageBufferSize = 256;
+    char message_buffer[kMessageBufferSize];
+    OS::SNPrint(message_buffer,
+                kMessageBufferSize,
+                "Wrong script snapshot version. Found %s expected '%s'",
+                obj_.ToCString(),
+                Version::SnapshotString());
+    const String& msg = String::Handle(String::New(message_buffer));
+    return ApiError::New(msg);
+  }
+
+  // The version string matches. Read the rest of the snapshot.
+  obj_ = ReadObject();
+  if (!obj_.IsLibrary()) {
+    if (!obj_.IsError()) {
+      const intptr_t kMessageBufferSize = 128;
+      char message_buffer[kMessageBufferSize];
+      OS::SNPrint(message_buffer,
+                  kMessageBufferSize,
+                  "Invalid object %s found in script snapshot",
+                  obj_.ToCString());
+      const String& msg = String::Handle(String::New(message_buffer));
+      obj_ = ApiError::New(msg);
+    }
+  }
+  return obj_.raw();
+}
+
+
+#define ALLOC_NEW_OBJECT_WITH_LEN(type, length)                                \
   ASSERT(kind_ == Snapshot::kFull);                                            \
   ASSERT(isolate()->no_gc_scope_depth() != 0);                                 \
-  cls_ = class_obj;                                                            \
   Raw##type* obj = reinterpret_cast<Raw##type*>(                               \
-      AllocateUninitialized(cls_, type::InstanceSize(length)));                \
+      AllocateUninitialized(k##type##Cid, type::InstanceSize(length)));        \
   obj->ptr()->length_ = Smi::New(length);                                      \
   return obj;                                                                  \
 
 
 RawArray* SnapshotReader::NewArray(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(Array, object_store()->array_class(), len);
+  ALLOC_NEW_OBJECT_WITH_LEN(Array, len);
 }
 
 
 RawImmutableArray* SnapshotReader::NewImmutableArray(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(ImmutableArray,
-                            object_store()->immutable_array_class(),
-                            len);
+  ALLOC_NEW_OBJECT_WITH_LEN(ImmutableArray, len);
 }
 
 
 RawOneByteString* SnapshotReader::NewOneByteString(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(OneByteString,
-                            object_store()->one_byte_string_class(),
-                            len);
+  ALLOC_NEW_OBJECT_WITH_LEN(OneByteString, len);
 }
 
 
 RawTwoByteString* SnapshotReader::NewTwoByteString(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(TwoByteString,
-                            object_store()->two_byte_string_class(),
-                            len);
+  ALLOC_NEW_OBJECT_WITH_LEN(TwoByteString, len);
 }
 
 
 RawTypeArguments* SnapshotReader::NewTypeArguments(intptr_t len) {
-  ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments,
-                            Object::type_arguments_class(),
-                            len);
+  ALLOC_NEW_OBJECT_WITH_LEN(TypeArguments, len);
 }
 
 
 RawTokenStream* SnapshotReader::NewTokenStream(intptr_t len) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = Object::token_stream_class();
   stream_ = reinterpret_cast<RawTokenStream*>(
-      AllocateUninitialized(cls_, TokenStream::InstanceSize()));
-  cls_ = isolate()->class_table()->At(kExternalTypedDataUint8ArrayCid);
+      AllocateUninitialized(kTokenStreamCid, TokenStream::InstanceSize()));
   uint8_t* array = const_cast<uint8_t*>(CurrentBufferAddress());
   ASSERT(array != NULL);
   Advance(len);
   data_ = reinterpret_cast<RawExternalTypedData*>(
-      AllocateUninitialized(cls_, ExternalTypedData::InstanceSize()));
+      AllocateUninitialized(kExternalTypedDataUint8ArrayCid,
+                            ExternalTypedData::InstanceSize()));
   data_.SetData(array);
   data_.SetLength(len);
   stream_.SetStream(data_);
@@ -484,9 +557,8 @@
 RawContext* SnapshotReader::NewContext(intptr_t num_variables) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = Object::context_class();
   RawContext* obj = reinterpret_cast<RawContext*>(
-      AllocateUninitialized(cls_, Context::InstanceSize(num_variables)));
+      AllocateUninitialized(kContextCid, Context::InstanceSize(num_variables)));
   obj->ptr()->num_variables_ = num_variables;
   return obj;
 }
@@ -500,9 +572,8 @@
            (class_id <= kNullCid));
     return isolate()->class_table()->At(class_id);
   }
-  cls_ = Object::class_class();
   RawClass* obj = reinterpret_cast<RawClass*>(
-      AllocateUninitialized(cls_, Class::InstanceSize()));
+      AllocateUninitialized(kClassCid, Class::InstanceSize()));
   Instance fake;
   obj->ptr()->handle_vtable_ = fake.vtable();
   cls_ = obj;
@@ -515,9 +586,8 @@
 RawInstance* SnapshotReader::NewInstance() {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->object_class();
   RawInstance* obj = reinterpret_cast<RawInstance*>(
-      AllocateUninitialized(cls_, Instance::InstanceSize()));
+      AllocateUninitialized(kObjectCid, Instance::InstanceSize()));
   return obj;
 }
 
@@ -525,9 +595,8 @@
 RawMint* SnapshotReader::NewMint(int64_t value) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->mint_class();
   RawMint* obj = reinterpret_cast<RawMint*>(
-      AllocateUninitialized(cls_, Mint::InstanceSize()));
+      AllocateUninitialized(kMintCid, Mint::InstanceSize()));
   obj->ptr()->value_ = value;
   return obj;
 }
@@ -536,10 +605,9 @@
 RawBigint* SnapshotReader::NewBigint(const char* hex_string) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->bigint_class();
   intptr_t bigint_length = BigintOperations::ComputeChunkLength(hex_string);
   RawBigint* obj = reinterpret_cast<RawBigint*>(
-      AllocateUninitialized(cls_, Bigint::InstanceSize(bigint_length)));
+      AllocateUninitialized(kBigintCid, Bigint::InstanceSize(bigint_length)));
   obj->ptr()->allocated_length_ = bigint_length;
   obj->ptr()->signed_length_ = bigint_length;
   BigintOperations::FromHexCString(hex_string, Bigint::Handle(obj));
@@ -550,105 +618,113 @@
 RawDouble* SnapshotReader::NewDouble(double value) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->double_class();
   RawDouble* obj = reinterpret_cast<RawDouble*>(
-      AllocateUninitialized(cls_, Double::InstanceSize()));
+      AllocateUninitialized(kDoubleCid, Double::InstanceSize()));
   obj->ptr()->value_ = value;
   return obj;
 }
 
 
-#define ALLOC_NEW_OBJECT(type, class_obj)                                      \
+RawTypedData* SnapshotReader::NewTypedData(intptr_t class_id, intptr_t len) {
+  ASSERT(kind_ == Snapshot::kFull);
+  ASSERT(isolate()->no_gc_scope_depth() != 0);
+  const intptr_t lengthInBytes = len * TypedData::ElementSizeInBytes(class_id);
+  RawTypedData* obj = reinterpret_cast<RawTypedData*>(
+      AllocateUninitialized(class_id, TypedData::InstanceSize(lengthInBytes)));
+  obj->ptr()->length_ = Smi::New(len);
+  return obj;
+}
+
+
+#define ALLOC_NEW_OBJECT(type)                                                 \
   ASSERT(kind_ == Snapshot::kFull);                                            \
   ASSERT(isolate()->no_gc_scope_depth() != 0);                                 \
-  cls_ = class_obj;                                                            \
   return reinterpret_cast<Raw##type*>(                                         \
-      AllocateUninitialized(cls_, type::InstanceSize()));                      \
+      AllocateUninitialized(k##type##Cid, type::InstanceSize()));              \
 
 
 RawUnresolvedClass* SnapshotReader::NewUnresolvedClass() {
-  ALLOC_NEW_OBJECT(UnresolvedClass, Object::unresolved_class_class());
+  ALLOC_NEW_OBJECT(UnresolvedClass);
 }
 
 
 RawType* SnapshotReader::NewType() {
-  ALLOC_NEW_OBJECT(Type, object_store()->type_class());
+  ALLOC_NEW_OBJECT(Type);
 }
 
 
 RawTypeRef* SnapshotReader::NewTypeRef() {
-  ALLOC_NEW_OBJECT(TypeRef, object_store()->type_ref_class());
+  ALLOC_NEW_OBJECT(TypeRef);
 }
 
 
 RawTypeParameter* SnapshotReader::NewTypeParameter() {
-  ALLOC_NEW_OBJECT(TypeParameter, object_store()->type_parameter_class());
+  ALLOC_NEW_OBJECT(TypeParameter);
 }
 
 
 RawBoundedType* SnapshotReader::NewBoundedType() {
-  ALLOC_NEW_OBJECT(BoundedType, object_store()->bounded_type_class());
+  ALLOC_NEW_OBJECT(BoundedType);
 }
 
 
 RawMixinAppType* SnapshotReader::NewMixinAppType() {
-  ALLOC_NEW_OBJECT(MixinAppType, object_store()->mixin_app_type_class());
+  ALLOC_NEW_OBJECT(MixinAppType);
 }
 
 
 RawPatchClass* SnapshotReader::NewPatchClass() {
-  ALLOC_NEW_OBJECT(PatchClass, Object::patch_class_class());
+  ALLOC_NEW_OBJECT(PatchClass);
 }
 
 
 RawClosureData* SnapshotReader::NewClosureData() {
-  ALLOC_NEW_OBJECT(ClosureData, Object::closure_data_class());
+  ALLOC_NEW_OBJECT(ClosureData);
 }
 
 
 RawRedirectionData* SnapshotReader::NewRedirectionData() {
-  ALLOC_NEW_OBJECT(RedirectionData, Object::redirection_data_class());
+  ALLOC_NEW_OBJECT(RedirectionData);
 }
 
 
 RawFunction* SnapshotReader::NewFunction() {
-  ALLOC_NEW_OBJECT(Function, Object::function_class());
+  ALLOC_NEW_OBJECT(Function);
 }
 
 
 RawField* SnapshotReader::NewField() {
-  ALLOC_NEW_OBJECT(Field, Object::field_class());
+  ALLOC_NEW_OBJECT(Field);
 }
 
 
 RawLibrary* SnapshotReader::NewLibrary() {
-  ALLOC_NEW_OBJECT(Library, Object::library_class());
+  ALLOC_NEW_OBJECT(Library);
 }
 
 
 RawLibraryPrefix* SnapshotReader::NewLibraryPrefix() {
-  ALLOC_NEW_OBJECT(LibraryPrefix, object_store()->library_prefix_class());
+  ALLOC_NEW_OBJECT(LibraryPrefix);
 }
 
 
 RawNamespace* SnapshotReader::NewNamespace() {
-  ALLOC_NEW_OBJECT(Namespace, Object::namespace_class());
+  ALLOC_NEW_OBJECT(Namespace);
 }
 
 
 RawScript* SnapshotReader::NewScript() {
-  ALLOC_NEW_OBJECT(Script, Object::script_class());
+  ALLOC_NEW_OBJECT(Script);
 }
 
 
 RawLiteralToken* SnapshotReader::NewLiteralToken() {
-  ALLOC_NEW_OBJECT(LiteralToken, Object::literal_token_class());
+  ALLOC_NEW_OBJECT(LiteralToken);
 }
 
 
 RawGrowableObjectArray* SnapshotReader::NewGrowableObjectArray() {
-  ALLOC_NEW_OBJECT(GrowableObjectArray,
-                   object_store()->growable_object_array_class());
+  ALLOC_NEW_OBJECT(GrowableObjectArray);
 }
 
 
@@ -656,9 +732,8 @@
                                            float v3) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->float32x4_class();
   RawFloat32x4* obj = reinterpret_cast<RawFloat32x4*>(
-      AllocateUninitialized(cls_, Float32x4::InstanceSize()));
+      AllocateUninitialized(kFloat32x4Cid, Float32x4::InstanceSize()));
   obj->ptr()->value_[0] = v0;
   obj->ptr()->value_[1] = v1;
   obj->ptr()->value_[2] = v2;
@@ -668,12 +743,11 @@
 
 
 RawInt32x4* SnapshotReader::NewInt32x4(uint32_t v0, uint32_t v1, uint32_t v2,
-                                         uint32_t v3) {
+                                       uint32_t v3) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->int32x4_class();
   RawInt32x4* obj = reinterpret_cast<RawInt32x4*>(
-      AllocateUninitialized(cls_, Int32x4::InstanceSize()));
+      AllocateUninitialized(kInt32x4Cid, Int32x4::InstanceSize()));
   obj->ptr()->value_[0] = v0;
   obj->ptr()->value_[1] = v1;
   obj->ptr()->value_[2] = v2;
@@ -685,9 +759,8 @@
 RawFloat64x2* SnapshotReader::NewFloat64x2(double v0, double v1) {
   ASSERT(kind_ == Snapshot::kFull);
   ASSERT(isolate()->no_gc_scope_depth() != 0);
-  cls_ = object_store()->float64x2_class();
   RawFloat64x2* obj = reinterpret_cast<RawFloat64x2*>(
-      AllocateUninitialized(cls_, Float64x2::InstanceSize()));
+      AllocateUninitialized(kFloat64x2Cid, Float64x2::InstanceSize()));
   obj->ptr()->value_[0] = v0;
   obj->ptr()->value_[1] = v1;
   return obj;
@@ -695,17 +768,17 @@
 
 
 RawApiError* SnapshotReader::NewApiError() {
-  ALLOC_NEW_OBJECT(ApiError, Object::api_error_class());
+  ALLOC_NEW_OBJECT(ApiError);
 }
 
 
 RawLanguageError* SnapshotReader::NewLanguageError() {
-  ALLOC_NEW_OBJECT(LanguageError, Object::language_error_class());
+  ALLOC_NEW_OBJECT(LanguageError);
 }
 
 
 RawUnhandledException* SnapshotReader::NewUnhandledException() {
-  ALLOC_NEW_OBJECT(UnhandledException, Object::unhandled_exception_class());
+  ALLOC_NEW_OBJECT(UnhandledException);
 }
 
 
@@ -723,7 +796,7 @@
 
 
 RawStacktrace* SnapshotReader::NewStacktrace() {
-  ALLOC_NEW_OBJECT(Stacktrace, object_store()->stacktrace_class());
+  ALLOC_NEW_OBJECT(Stacktrace);
 }
 
 
@@ -745,13 +818,13 @@
 }
 
 
-RawObject* SnapshotReader::AllocateUninitialized(const Class& cls,
+RawObject* SnapshotReader::AllocateUninitialized(intptr_t class_id,
                                                  intptr_t size) {
   ASSERT(isolate()->no_gc_scope_depth() != 0);
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
-  Heap* heap = isolate()->heap();
 
-  uword address = heap->TryAllocate(size, Heap::kOld, PageSpace::kForceGrowth);
+  uword address = old_space()->TryAllocateDataLocked(size,
+                                                     PageSpace::kForceGrowth);
   if (address == 0) {
     // Use the preallocated out of memory exception to avoid calling
     // into dart code or allocating any code.
@@ -776,9 +849,8 @@
 
   RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
   uword tags = 0;
-  intptr_t index = cls.id();
-  ASSERT(index != kIllegalCid);
-  tags = RawObject::ClassIdTag::update(index, tags);
+  ASSERT(class_id != kIllegalCid);
+  tags = RawObject::ClassIdTag::update(class_id, tags);
   tags = RawObject::SizeTag::update(size, tags);
   raw_obj->ptr()->tags_ = tags;
   return raw_obj;
@@ -860,7 +932,7 @@
       ASSERT(instance_size > 0);
       // Allocate the instance and read in all the fields for the object.
       if (kind_ == Snapshot::kFull) {
-        *result ^= AllocateUninitialized(cls_, instance_size);
+        *result ^= AllocateUninitialized(cls_.id(), instance_size);
       } else {
         *result ^= Object::Allocate(cls_.id(),
                                     instance_size,
@@ -879,8 +951,8 @@
     intptr_t offset = Instance::NextFieldOffset();
     intptr_t result_cid = result->GetClassId();
     while (offset < next_field_offset) {
-      obj_ = ReadObjectRef();
-      result->SetFieldAtOffset(offset, obj_);
+      pobj_ = ReadObjectRef();
+      result->SetFieldAtOffset(offset, pobj_);
       if ((offset != type_argument_field_offset) &&
           (kind_ == Snapshot::kMessage)) {
         // TODO(fschneider): Consider hoisting these lookups out of the loop.
@@ -891,6 +963,7 @@
         field_ ^= array_.At(offset >> kWordSizeLog2);
         ASSERT(!field_.IsNull());
         ASSERT(field_.Offset() == offset);
+        obj_ = pobj_.raw();
         field_.RecordStore(obj_);
       }
       // TODO(fschneider): Verify the guarded cid and length for other kinds of
@@ -917,7 +990,7 @@
   switch (cls_.id()) {
 #define SNAPSHOT_READ(clazz)                                                   \
     case clazz::kClassId: {                                                    \
-      obj_ = clazz::ReadFrom(this, object_id, tags, kind_);                    \
+      pobj_ = clazz::ReadFrom(this, object_id, tags, kind_);                   \
       break;                                                                   \
     }
     CLASS_LIST_NO_OBJECT(SNAPSHOT_READ)
@@ -927,7 +1000,7 @@
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(cls_.id(), tags);
-      obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
+      pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
 #undef SNAPSHOT_READ
@@ -936,16 +1009,16 @@
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
       tags = RawObject::ClassIdTag::update(cls_.id(), tags);
-      obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
+      pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
 #undef SNAPSHOT_READ
     default: UNREACHABLE(); break;
   }
   if (kind_ == Snapshot::kFull) {
-    obj_.SetCreatedFromSnapshot();
+    pobj_.SetCreatedFromSnapshot();
   }
-  return obj_.raw();
+  return pobj_.raw();
 }
 
 
@@ -960,8 +1033,8 @@
   result.SetTypeArguments(*TypeArgumentsHandle());
 
   for (intptr_t i = 0; i < len; i++) {
-    *ObjectHandle() = ReadObjectRef();
-    result.SetAt(i, *ObjectHandle());
+    *PassiveObjectHandle() = ReadObjectRef();
+    result.SetAt(i, *PassiveObjectHandle());
   }
 }
 
@@ -1170,26 +1243,31 @@
   isolate->ValidateClassTable();
 #endif
 
-
   // Setup for long jump in case there is an exception while writing
   // the snapshot.
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    NoGCScope no_gc;
-
     // Reserve space in the output buffer for a snapshot header.
     ReserveHeader();
 
-    // Write out all the objects in the object store of the isolate which
-    // is the root set for all dart allocated objects at this point.
-    SnapshotWriterVisitor visitor(this, false);
-    object_store->VisitObjectPointers(&visitor);
+    // Write out the version string.
+    WriteObject(String::New(Version::SnapshotString()));
 
-    // Write out all forwarded objects.
-    WriteForwardedObjects();
+    // Write out the full snapshot.
+    {
+      NoGCScope no_gc;
 
-    FillHeader(kind());
-    UnmarkAll();
+      // Write out all the objects in the object store of the isolate which
+      // is the root set for all dart allocated objects at this point.
+      SnapshotWriterVisitor visitor(this, false);
+      object_store->VisitObjectPointers(&visitor);
+
+      // Write out all forwarded objects.
+      WriteForwardedObjects();
+
+      FillHeader(kind());
+      UnmarkAll();
+    }
   } else {
     ThrowException(exception_type(), exception_msg());
   }
@@ -1605,12 +1683,22 @@
   // the snapshot.
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
-    // Write out the library object.
-    NoGCScope no_gc;
+    // Reserve space in the output buffer for a snapshot header.
     ReserveHeader();
-    WriteObject(lib.raw());
-    FillHeader(kind());
-    UnmarkAll();
+
+    // Write out the version string.
+    WriteObject(String::New(Version::SnapshotString()));
+
+    // Write out the library object.
+    {
+      NoGCScope no_gc;
+
+      // Write out the library object.
+      WriteObject(lib.raw());
+
+      FillHeader(kind());
+      UnmarkAll();
+    }
   } else {
     ThrowException(exception_type(), exception_msg());
   }
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 6a0a3bc..3e61d06 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -28,46 +28,49 @@
 class LanguageError;
 class Library;
 class Object;
+class PassiveObject;
 class ObjectStore;
+class PageSpace;
 class RawApiError;
 class RawArray;
 class RawBigint;
 class RawBoundedType;
-class RawMixinAppType;
+class RawCapability;
 class RawClass;
+class RawClosureData;
 class RawContext;
 class RawDouble;
 class RawField;
-class RawClosureData;
-class RawRedirectionData;
-class RawFunction;
-class RawGrowableObjectArray;
-class RawLinkedHashMap;
 class RawFloat32x4;
 class RawFloat64x2;
-class RawInt32x4;
+class RawFunction;
+class RawGrowableObjectArray;
 class RawImmutableArray;
+class RawInt32x4;
 class RawLanguageError;
 class RawLibrary;
 class RawLibraryPrefix;
-class RawNamespace;
+class RawLinkedHashMap;
 class RawLiteralToken;
 class RawMint;
+class RawMixinAppType;
+class RawNamespace;
 class RawObject;
 class RawOneByteString;
 class RawPatchClass;
-class RawScript;
-class RawSmi;
-class RawCapability;
 class RawReceivePort;
+class RawRedirectionData;
+class RawScript;
 class RawSendPort;
+class RawSmi;
 class RawStacktrace;
 class RawTokenStream;
-class RawType;
-class RawTypeRef;
-class RawTypeParameter;
-class RawTypeArguments;
 class RawTwoByteString;
+class RawType;
+class RawTypeArguments;
+class RawTypedData;
+class RawTypeParameter;
+class RawTypeRef;
 class RawUnhandledException;
 class RawUnresolvedClass;
 class String;
@@ -247,10 +250,10 @@
   ~SnapshotReader() { }
 
   Isolate* isolate() const { return isolate_; }
-  Heap* heap() const { return isolate_->heap(); }
+  Heap* heap() const { return heap_; }
   ObjectStore* object_store() const { return isolate_->object_store(); }
   ClassTable* class_table() const { return isolate_->class_table(); }
-  Object* ObjectHandle() { return &obj_; }
+  PassiveObject* PassiveObjectHandle() { return &pobj_; }
   Array* ArrayHandle() { return &array_; }
   String* StringHandle() { return &str_; }
   AbstractType* TypeHandle() { return &type_; }
@@ -269,7 +272,10 @@
   Object* GetBackRef(intptr_t id);
 
   // Read a full snap shot.
-  void ReadFullSnapshot();
+  RawApiError* ReadFullSnapshot();
+
+  // Read a script snap shot.
+  RawObject* ReadScriptSnapshot();
 
   // Helper functions for creating uninitialized versions
   // of various object types. These are used when reading a
@@ -285,6 +291,7 @@
   RawInstance* NewInstance();
   RawMint* NewMint(int64_t value);
   RawBigint* NewBigint(const char* hex_string);
+  RawTypedData* NewTypedData(intptr_t class_id, intptr_t len);
   RawDouble* NewDouble(double value);
   RawUnresolvedClass* NewUnresolvedClass();
   RawType* NewType();
@@ -332,8 +339,10 @@
     DeserializeState state_;
   };
 
+  PageSpace* old_space() const { return old_space_; }
+
   // Allocate uninitialized objects, this is used when reading a full snapshot.
-  RawObject* AllocateUninitialized(const Class& cls, intptr_t size);
+  RawObject* AllocateUninitialized(intptr_t class_id, intptr_t size);
 
   RawClass* ReadClassId(intptr_t object_id);
   RawObject* ReadObjectImpl();
@@ -359,8 +368,11 @@
 
   Snapshot::Kind kind_;  // Indicates type of snapshot(full, script, message).
   Isolate* isolate_;  // Current isolate.
+  Heap* heap_;  // Heap of the current isolate.
+  PageSpace* old_space_;  // Old space of the current isolate.
   Class& cls_;  // Temporary Class handle.
   Object& obj_;  // Temporary Object handle.
+  PassiveObject& pobj_;  // Temporary PassiveObject handle.
   Array& array_;  // Temporary Array handle.
   Field& field_;  // Temporary Field handle.
   String& str_;  // Temporary String handle.
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index f33e0b4..902eb5a 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -192,7 +192,7 @@
       *(reinterpret_cast<uword*>(fp() + (kPcMarkerSlotFromFp * kWordSize)));
   if (pc_marker != 0) {
     const uword entry_point =
-        (pc_marker - Assembler::kEntryPointToPcMarkerOffset);
+        (pc_marker - Assembler::EntryPointToPcMarkerOffset());
     RawInstructions* instr = Instructions::FromEntryPoint(entry_point);
     if (instr != Instructions::null()) {
       return instr->ptr()->code_;
diff --git a/runtime/vm/store_buffer.h b/runtime/vm/store_buffer.h
index 17b1b64..cc92d72 100644
--- a/runtime/vm/store_buffer.h
+++ b/runtime/vm/store_buffer.h
@@ -52,6 +52,11 @@
 class StoreBuffer {
  public:
   StoreBuffer() : blocks_(new StoreBufferBlock(NULL)), full_count_(0) {}
+  explicit StoreBuffer(bool shallow_copy) : blocks_(NULL), full_count_(0) {
+    // The value shallow_copy is only used to select this non-allocating
+    // constructor. It is always expected to be true.
+    ASSERT(shallow_copy);
+  }
   ~StoreBuffer();
 
   intptr_t Count() const {
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 30987b2e..c63613c 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -133,6 +133,21 @@
 }
 
 
+uword StubCode::UnoptimizedStaticCallEntryPoint(intptr_t num_args_tested) {
+  switch (num_args_tested) {
+    case 0:
+      return ZeroArgsUnoptimizedStaticCallEntryPoint();
+    case 1:
+      return OneArgUnoptimizedStaticCallEntryPoint();
+    case 2:
+      return TwoArgsUnoptimizedStaticCallEntryPoint();
+    default:
+      UNIMPLEMENTED();
+      return 0;
+  }
+}
+
+
 RawCode* StubCode::Generate(const char* name,
                             void (*GenerateStub)(Assembler* assembler)) {
   Assembler assembler;
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 7fb793b..92fb93f 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -57,11 +57,15 @@
   V(OneArgCheckInlineCache)                                                    \
   V(TwoArgsCheckInlineCache)                                                   \
   V(ThreeArgsCheckInlineCache)                                                 \
+  V(SmiAddInlineCache)                                                         \
+  V(SmiSubInlineCache)                                                         \
+  V(SmiEqualInlineCache)                                                       \
   V(OneArgOptimizedCheckInlineCache)                                           \
   V(TwoArgsOptimizedCheckInlineCache)                                          \
   V(ThreeArgsOptimizedCheckInlineCache)                                        \
   V(ClosureCallInlineCache)                                                    \
   V(ZeroArgsUnoptimizedStaticCall)                                             \
+  V(OneArgUnoptimizedStaticCall)                                               \
   V(TwoArgsUnoptimizedStaticCall)                                              \
   V(OptimizeFunction)                                                          \
   V(InvokeDartCode)                                                            \
@@ -162,6 +166,8 @@
 
   static RawCode* GetAllocationStubForClass(const Class& cls);
 
+  uword UnoptimizedStaticCallEntryPoint(intptr_t num_args_tested);
+
   static const intptr_t kNoInstantiator = 0;
 
  private:
@@ -199,7 +205,8 @@
   static void GenerateNArgsCheckInlineCacheStub(
       Assembler* assembler,
       intptr_t num_args,
-      const RuntimeEntry& handle_ic_miss);
+      const RuntimeEntry& handle_ic_miss,
+      Token::Kind kind);
   static void GenerateUsageCounterIncrement(Assembler* assembler,
                                             Register temp_reg);
   static void GenerateOptimizedUsageCounterIncrement(Assembler* assembler);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 95e0d45..7328d4a 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -1220,6 +1220,67 @@
 }
 
 
+// Note: R5 must be preserved.
+// Attempt a quick Smi operation for known operations ('kind'). The ICData
+// must have been primed with a Smi/Smi check that will be used for counting
+// the invocations.
+static void EmitFastSmiOp(Assembler* assembler,
+                          Token::Kind kind,
+                          intptr_t num_args,
+                          Label* not_smi_or_overflow) {
+  __ ldr(R0, Address(SP, 0 * kWordSize));
+  __ ldr(R1, Address(SP, 1 * kWordSize));
+  __ orr(TMP, R0, Operand(R1));
+  __ tst(TMP, Operand(kSmiTagMask));
+  __ b(not_smi_or_overflow, NE);
+  switch (kind) {
+    case Token::kADD: {
+      __ adds(R0, R1, Operand(R0));  // Adds.
+      __ b(not_smi_or_overflow, VS);  // Branch if overflow.
+      break;
+    }
+    case Token::kSUB: {
+      __ subs(R0, R1, Operand(R0));  // Subtract.
+      __ b(not_smi_or_overflow, VS);  // Branch if overflow.
+      break;
+    }
+    case Token::kEQ: {
+      __ cmp(R0, Operand(R1));
+      __ LoadObject(R0, Bool::True(), EQ);
+      __ LoadObject(R0, Bool::False(), NE);
+      break;
+    }
+    default: UNIMPLEMENTED();
+  }
+  // R5: IC data object (preserved).
+  __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
+  // R6: ic_data_array with check entries: classes and target functions.
+  __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag);
+  // R6: points directly to the first ic data array element.
+#if defined(DEBUG)
+  // Check that first entry is for Smi/Smi.
+  Label error, ok;
+  const intptr_t imm_smi_cid = reinterpret_cast<intptr_t>(Smi::New(kSmiCid));
+  __ ldr(R1, Address(R6, 0));
+  __ CompareImmediate(R1, imm_smi_cid);
+  __ b(&error, NE);
+  __ ldr(R1, Address(R6, kWordSize));
+  __ CompareImmediate(R1, imm_smi_cid);
+  __ b(&ok, EQ);
+  __ Bind(&error);
+  __ Stop("Incorrect IC data");
+  __ Bind(&ok);
+#endif
+  // Update counter.
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  __ LoadFromOffset(kWord, R1, R6, count_offset);
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), VS);  // Overflow.
+  __ StoreToOffset(kWord, R1, R6, count_offset);
+  __ Ret();
+}
+
+
 // Generate inline cache check for 'num_args'.
 //  LR: return address.
 //  R5: inline cache data object.
@@ -1233,7 +1294,8 @@
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
-    const RuntimeEntry& handle_ic_miss) {
+    const RuntimeEntry& handle_ic_miss,
+    Token::Kind kind) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
@@ -1258,6 +1320,12 @@
   __ b(&stepping, NE);
   __ Bind(&done_stepping);
 
+  if (kind != Token::kILLEGAL) {
+    Label not_smi_or_overflow;
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
+    __ Bind(&not_smi_or_overflow);
+  }
+
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
@@ -1382,52 +1450,73 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
+}
+
+
+void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+}
+
+
+void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+}
+
+
+void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1451,17 +1540,12 @@
 #endif  // DEBUG
 
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
   __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
   __ CompareImmediate(R6, 0);
-  __ b(&not_stepping, EQ);
-  __ EnterStubFrame();
-  __ Push(R5);  // Preserve IC data.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ Pop(R5);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
@@ -1472,14 +1556,10 @@
   const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
 
   // Increment count for this call.
-  Label increment_done;
   __ LoadFromOffset(kWord, R1, R6, count_offset);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), VS);  // Overflow.
   __ StoreToOffset(kWord, R1, R6, count_offset);
-  __ b(&increment_done, VC);  // No overflow.
-  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue));
-  __ StoreToOffset(kWord, R1, R6, count_offset);
-  __ Bind(&increment_done);
 
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
@@ -1492,13 +1572,28 @@
   // R2: target instructions.
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ bx(R2);
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
+}
+
+
+void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1566,17 +1661,19 @@
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
   __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
   __ CompareImmediate(R1, 0);
-  __ b(&not_stepping, EQ);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
+  __ Ret();
+
+  __ Bind(&stepping);
   __ EnterStubFrame();
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveStubFrame();
-  __ Bind(&not_stepping);
-
-  __ Ret();
+  __ b(&done_stepping);
 }
 
 
@@ -1824,15 +1921,12 @@
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
   __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
   __ CompareImmediate(R1, 0);
-  __ b(&not_stepping, EQ);
-  __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   const Register temp = R2;
   const Register left = R1;
@@ -1841,6 +1935,12 @@
   __ ldr(right, Address(SP, 0 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
   __ Ret();
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index b8534fe..47bc713 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -1314,6 +1314,75 @@
 }
 
 
+// Note: R5 must be preserved.
+// Attempt a quick Smi operation for known operations ('kind'). The ICData
+// must have been primed with a Smi/Smi check that will be used for counting
+// the invocations.
+static void EmitFastSmiOp(Assembler* assembler,
+                          Token::Kind kind,
+                          intptr_t num_args,
+                          Label* not_smi_or_overflow) {
+  if (FLAG_throw_on_javascript_int_overflow) {
+    // The overflow check is more complex than implemented below.
+    return;
+  }
+  __ ldr(R0, Address(SP, + 0 * kWordSize));  // Right.
+  __ ldr(R1, Address(SP, + 1 * kWordSize));  // Left.
+  __ orr(TMP, R0, Operand(R1));
+  __ tsti(TMP, kSmiTagMask);
+  __ b(not_smi_or_overflow, NE);
+  switch (kind) {
+    case Token::kADD: {
+      __ adds(R0, R1, Operand(R0));  // Adds.
+      __ b(not_smi_or_overflow, VS);  // Branch if overflow.
+      break;
+    }
+    case Token::kSUB: {
+      __ subs(R0, R1, Operand(R0));  // Subtract.
+      __ b(not_smi_or_overflow, VS);  // Branch if overflow.
+      break;
+    }
+    case Token::kEQ: {
+      __ CompareRegisters(R0, R1);
+      __ LoadObject(R0, Bool::True(), PP);
+      __ LoadObject(R1, Bool::False(), PP);
+      __ csel(R0, R1, R0, NE);
+      break;
+    }
+    default: UNIMPLEMENTED();
+  }
+
+  // R5: IC data object (preserved).
+  __ 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.
+#if defined(DEBUG)
+  // Check that first entry is for Smi/Smi.
+  Label error, ok;
+  const intptr_t imm_smi_cid = reinterpret_cast<intptr_t>(Smi::New(kSmiCid));
+  __ ldr(R1, Address(R6, 0));
+  __ CompareImmediate(R1, imm_smi_cid, kNoPP);
+  __ b(&error, NE);
+  __ ldr(R1, Address(R6, kWordSize));
+  __ CompareImmediate(R1, imm_smi_cid, kNoPP);
+  __ b(&ok, EQ);
+  __ Bind(&error);
+  __ Stop("Incorrect IC data");
+  __ Bind(&ok);
+#endif
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  // Update counter.
+  __ LoadFromOffset(R1, R6, count_offset, kNoPP);
+  __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ LoadImmediate(R2, Smi::RawValue(Smi::kMaxValue), kNoPP);
+  __ csel(R1, R2, R1, VS);  // Overflow.
+  __ StoreToOffset(R1, R6, count_offset, kNoPP);
+
+  __ ret();
+}
+
+
 // Generate inline cache check for 'num_args'.
 //  LR: return address.
 //  R5: inline cache data object.
@@ -1327,7 +1396,8 @@
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
-    const RuntimeEntry& handle_ic_miss) {
+    const RuntimeEntry& handle_ic_miss,
+    Token::Kind kind) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
@@ -1353,6 +1423,12 @@
   __ b(&stepping, NE);
   __ Bind(&done_stepping);
 
+  if (kind != Token::kILLEGAL) {
+    Label not_smi_or_overflow;
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
+    __ Bind(&not_smi_or_overflow);
+  }
+
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
   // Loop that checks if there is an IC data match.
@@ -1489,52 +1565,73 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
+}
+
+
+void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+}
+
+
+void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+}
+
+
+void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1556,18 +1653,13 @@
 #endif  // DEBUG
 
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ 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();
-  __ Push(R5);  // Preserve IC data.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ Pop(R5);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
@@ -1578,14 +1670,11 @@
   const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
 
   // Increment count for this call.
-  Label increment_done;
   __ LoadFromOffset(R1, R6, count_offset, kNoPP);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
+  __ LoadImmediate(R2, Smi::RawValue(Smi::kMaxValue), kNoPP);
+  __ csel(R1, R2, R1, VS);  // Overflow.
   __ StoreToOffset(R1, R6, count_offset, kNoPP);
-  __ b(&increment_done, VC);  // No overflow.
-  __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), kNoPP);
-  __ StoreToOffset(R1, R6, count_offset, kNoPP);
-  __ Bind(&increment_done);
 
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
@@ -1599,13 +1688,28 @@
   __ AddImmediate(
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ Push(R5);  // Preserve IC data.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
+}
+
+
+void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, R6);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, R6);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1675,18 +1779,21 @@
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
   __ LoadFromOffset(
       R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R1, 0, kNoPP);
-  __ b(&not_stepping, EQ);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
+
+  __ ret();
+
+  __ Bind(&stepping);
   __ EnterStubFrame();
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveStubFrame();
-  __ Bind(&not_stepping);
-
-  __ ret();
+  __ b(&done_stepping);
 }
 
 
@@ -1924,16 +2031,13 @@
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
     // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ 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();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ b(&stepping, NE);
+  __ Bind(&done_stepping);
 
   const Register left = R1;
   const Register right = R0;
@@ -1941,6 +2045,12 @@
   __ LoadFromOffset(right, SP, 0 * kWordSize, kNoPP);
   GenerateIdenticalWithNumberCheckStub(assembler, left, right);
   __ ret();
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 65f1c10..a99e49d 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -1262,6 +1262,75 @@
 }
 
 
+// Note: ECX must be preserved.
+// Attempt a quick Smi operation for known operations ('kind'). The ICData
+// must have been primed with a Smi/Smi check that will be used for counting
+// the invocations.
+static void EmitFastSmiOp(Assembler* assembler,
+                          Token::Kind kind,
+                          intptr_t num_args,
+                          Label* not_smi_or_overflow) {
+  ASSERT(num_args == 2);
+  __ movl(EDI, Address(ESP, + 1 * kWordSize));  // Right
+  __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left
+  __ movl(EBX, EDI);
+  __ orl(EBX, EAX);
+  __ testl(EBX, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, not_smi_or_overflow, Assembler::kNearJump);
+  switch (kind) {
+    case Token::kADD: {
+      __ addl(EAX, EDI);
+      __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
+      break;
+    }
+    case Token::kSUB: {
+      __ subl(EAX, EDI);
+      __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
+      break;
+    }
+    case Token::kEQ: {
+      Label done, is_true;
+      __ cmpl(EAX, EDI);
+      __ j(EQUAL, &is_true, Assembler::kNearJump);
+      __ LoadObject(EAX, Bool::False());
+      __ jmp(&done, Assembler::kNearJump);
+      __ Bind(&is_true);
+      __ LoadObject(EAX, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default: UNIMPLEMENTED();
+  }
+
+  // ECX: IC data object.
+  __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
+  // EBX: ic_data_array with check entries: classes and target functions.
+  __ leal(EBX, FieldAddress(EBX, Array::data_offset()));
+#if defined(DEBUG)
+  // Check that first entry is for Smi/Smi.
+  Label error, ok;
+  const Immediate& imm_smi_cid =
+      Immediate(reinterpret_cast<intptr_t>(Smi::New(kSmiCid)));
+  __ cmpl(Address(EBX, 0 * kWordSize), imm_smi_cid);
+  __ j(NOT_EQUAL, &error, Assembler::kNearJump);
+  __ cmpl(Address(EBX, 1 * kWordSize), imm_smi_cid);
+  __ j(EQUAL, &ok, Assembler::kNearJump);
+  __ Bind(&error);
+  __ Stop("Incorrect IC data");
+  __ Bind(&ok);
+#endif
+  // Update counter.
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  __ movl(ECX, Address(EBX, count_offset));
+  __ addl(ECX, Immediate(Smi::RawValue(1)));
+  __ movl(EDI, Immediate(Smi::RawValue(Smi::kMaxValue)));
+  __ cmovno(EDI, ECX);
+  __ movl(Address(EBX, count_offset), EDI);
+
+  __ ret();
+}
+
+
 // Generate inline cache check for 'num_args'.
 //  ECX: Inline cache data object.
 //  TOS(0): return address
@@ -1275,7 +1344,8 @@
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
-    const RuntimeEntry& handle_ic_miss) {
+    const RuntimeEntry& handle_ic_miss,
+    Token::Kind kind) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
@@ -1298,6 +1368,12 @@
   __ j(NOT_EQUAL, &stepping);
   __ Bind(&done_stepping);
 
+  if (kind != Token::kILLEGAL) {
+    Label not_smi_or_overflow;
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
+    __ Bind(&not_smi_or_overflow);
+  }
+
   // ECX: IC data object (preserved).
   // Load arguments descriptor into EDX.
   __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
@@ -1428,22 +1504,43 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
+}
+
+
+void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, EBX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+}
+
+
+void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, EBX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+}
+
+
+void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, EBX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
@@ -1461,31 +1558,31 @@
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+     kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 // Do not count as no type feedback is collected.
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1509,18 +1606,12 @@
   }
 #endif  // DEBUG
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
   __ cmpl(EAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-
-  __ EnterStubFrame();
-  __ pushl(ECX);
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ popl(ECX);
-  __ LeaveFrame();
-  __ Bind(&not_stepping);
+  __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
+  __ Bind(&done_stepping);
 
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
@@ -1531,11 +1622,11 @@
   const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
 
   // Increment count for this call.
-  Label increment_done;
-  __ addl(Address(EBX, count_offset), Immediate(Smi::RawValue(1)));
-  __ j(NO_OVERFLOW, &increment_done, Assembler::kNearJump);
-  __ movl(Address(EBX, count_offset), Immediate(Smi::RawValue(Smi::kMaxValue)));
-  __ Bind(&increment_done);
+  __ movl(EAX, Address(EBX, count_offset));
+  __ addl(EAX, Immediate(Smi::RawValue(1)));
+  __ movl(EDI, Immediate(Smi::RawValue(Smi::kMaxValue)));
+  __ cmovno(EDI, EAX);
+  __ movl(Address(EBX, count_offset), EDI);
 
   // Load arguments descriptor into EDX.
   __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
@@ -1547,13 +1638,28 @@
   // EBX: Target instructions.
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(EBX);
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ pushl(ECX);
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popl(ECX);
+  __ LeaveFrame();
+  __ jmp(&done_stepping, Assembler::kNearJump);
+}
+
+
+void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, EBX);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, EBX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1635,18 +1741,19 @@
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
   __ cmpl(EAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
+  __ Bind(&done_stepping);
+  __ ret();
 
+  __ Bind(&stepping);
   __ EnterStubFrame();
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveFrame();
-  __ Bind(&not_stepping);
-
-  __ ret();
+  __ jmp(&done_stepping, Assembler::kNearJump);
 }
 
 
@@ -1896,16 +2003,12 @@
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
   __ cmpl(EAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-
-  __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ LeaveFrame();
-  __ Bind(&not_stepping);
+  __ j(NOT_EQUAL, &stepping);
+  __ Bind(&done_stepping);
 
   const Register left = EAX;
   const Register right = EDX;
@@ -1914,6 +2017,12 @@
   __ movl(right, Address(ESP, 1 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
   __ ret();
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveFrame();
+  __ jmp(&done_stepping);
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 0273779..62bda8b 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -1372,6 +1372,73 @@
 }
 
 
+// Note: S5 must be preserved.
+// Attempt a quick Smi operation for known operations ('kind'). The ICData
+// must have been primed with a Smi/Smi check that will be used for counting
+// the invocations.
+static void EmitFastSmiOp(Assembler* assembler,
+                          Token::Kind kind,
+                          intptr_t num_args,
+                          Label* not_smi_or_overflow) {
+  ASSERT(num_args == 2);
+  __ lw(T0, Address(SP, 0 * kWordSize));  // Left.
+  __ lw(T1, Address(SP, 1 * kWordSize));  // Right.
+  __ or_(CMPRES1, T0, T1);
+  __ andi(CMPRES1, CMPRES1, Immediate(kSmiTagMask));
+  __ bne(CMPRES1, ZR, not_smi_or_overflow);
+  switch (kind) {
+    case Token::kADD: {
+     __ AdduDetectOverflow(V0, T1, T0, CMPRES1);  // Add.
+     __ bltz(CMPRES1, not_smi_or_overflow);  // Fall through on overflow.
+      break;
+    }
+    case Token::kSUB: {
+      __ SubuDetectOverflow(V0, T1, T0, CMPRES1);  // Subtract.
+      __ bltz(CMPRES1, not_smi_or_overflow);  // Fall through on overflow.
+      break;
+    }
+    case Token::kEQ: {
+      Label true_label, done;
+      __ beq(T1, T0, &true_label);
+      __ LoadObject(V0, Bool::False());
+      __ b(&done);
+      __ Bind(&true_label);
+      __ LoadObject(V0, Bool::True());
+      __ Bind(&done);
+      break;
+    }
+    default: UNIMPLEMENTED();
+  }
+  // S5: IC data object (preserved).
+  __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
+  // T0: ic_data_array with check entries: classes and target functions.
+  __ AddImmediate(T0, Array::data_offset() - kHeapObjectTag);
+  // T0: points directly to the first ic data array element.
+#if defined(DEBUG)
+  // Check that first entry is for Smi/Smi.
+  Label error, ok;
+  const int32_t imm_smi_cid = reinterpret_cast<int32_t>(Smi::New(kSmiCid));
+  __ lw(T4, Address(T0));
+  __ BranchNotEqual(T4, imm_smi_cid, &error);
+  __ lw(T4, Address(T0, kWordSize));
+  __ BranchEqual(T4, imm_smi_cid, &ok);
+  __ Bind(&error);
+  __ Stop("Incorrect IC data");
+  __ Bind(&ok);
+#endif
+  // Update counter.
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  __ lw(T4, Address(T0, count_offset));
+  __ AddImmediateDetectOverflow(T7, T4, Smi::RawValue(1), T5, T6);
+  __ slt(CMPRES1, T5, ZR);  // T5 is < 0 if there was overflow.
+  __ LoadImmediate(T4, Smi::RawValue(Smi::kMaxValue));
+  __ movz(T4, T7, CMPRES1);
+  __ sw(T4, Address(T0, count_offset));
+
+  __ Ret();
+}
+
+
 // Generate inline cache check for 'num_args'.
 //  RA: return address
 //  S5: Inline cache data object.
@@ -1385,7 +1452,8 @@
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
-    const RuntimeEntry& handle_ic_miss) {
+    const RuntimeEntry& handle_ic_miss,
+    Token::Kind kind) {
   __ TraceSimMsg("NArgsCheckInlineCacheStub");
   ASSERT(num_args > 0);
 #if defined(DEBUG)
@@ -1409,6 +1477,12 @@
   __ BranchNotEqual(T0, 0, &stepping);
   __ Bind(&done_stepping);
 
+  if (kind != Token::kILLEGAL) {
+    Label not_smi_or_overflow;
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
+    __ Bind(&not_smi_or_overflow);
+  }
+
   // Load argument descriptor into S4.
   __ lw(S4, FieldAddress(S5, ICData::arguments_descriptor_offset()));
   // Preserve return address, since RA is needed for subroutine call.
@@ -1569,52 +1643,73 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
+}
+
+
+void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+}
+
+
+void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+}
+
+
+void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
 }
 
 
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1638,21 +1733,11 @@
 #endif  // DEBUG
 
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-  __ BranchEqual(T0, 0, &not_stepping);
-  // Call single step callback in debugger.
-  __ EnterStubFrame();
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
-  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ lw(RA, Address(SP, 0 * kWordSize));
-  __ lw(S5, Address(SP, 1 * kWordSize));
-  __ addiu(SP, SP, Immediate(2 * kWordSize));
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ BranchNotEqual(T0, 0, &stepping);
+  __ Bind(&done_stepping);
 
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
@@ -1663,16 +1748,12 @@
   const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
 
   // Increment count for this call.
-  Label increment_done;
   __ lw(T4, Address(T0, count_offset));
-  __ AddImmediateDetectOverflow(T4, T4, Smi::RawValue(1), T5, T6);
-  __ bgez(T5, &increment_done);  // No overflow.
-  __ delay_slot()->sw(T4, Address(T0, count_offset));
-
-  __ LoadImmediate(T1, Smi::RawValue(Smi::kMaxValue));
-  __ sw(T1, Address(T0, count_offset));
-
-  __ Bind(&increment_done);
+  __ AddImmediateDetectOverflow(T7, T4, Smi::RawValue(1), T5, T6);
+  __ slt(CMPRES1, T5, ZR);  // T5 is < 0 if there was overflow.
+  __ LoadImmediate(T4, Smi::RawValue(Smi::kMaxValue));
+  __ movz(T4, T7, CMPRES1);
+  __ sw(T4, Address(T0, count_offset));
 
   // Load arguments descriptor into S4.
   __ lw(S4,  FieldAddress(S5, ICData::arguments_descriptor_offset()));
@@ -1684,13 +1765,33 @@
   // T4: target instructions.
   __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T4);
+
+  // Call single step callback in debugger.
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ lw(S5, Address(SP, 1 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
+}
+
+
+void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, T0);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, T0);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1779,11 +1880,16 @@
 // RA: return address.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-  __ BranchEqual(T0, 0, &not_stepping);
+  __ BranchNotEqual(T0, 0, &stepping);
+  __ Bind(&done_stepping);
+
+  __ Ret();
+
   // Call single step callback in debugger.
+  __ Bind(&stepping);
   __ EnterStubFrame();
   __ addiu(SP, SP, Immediate(-1 * kWordSize));
   __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
@@ -1791,9 +1897,7 @@
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ addiu(SP, SP, Immediate(1 * kWordSize));
   __ LeaveStubFrame();
-  __ Bind(&not_stepping);
-
-  __ Ret();
+  __ b(&done_stepping);
 }
 
 
@@ -2064,19 +2168,11 @@
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-  __ BranchEqual(T0, 0, &not_stepping);
-  // Call single step callback in debugger.
-  __ EnterStubFrame();
-  __ addiu(SP, SP, Immediate(-1 * kWordSize));
-  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ lw(RA, Address(SP, 0 * kWordSize));
-  __ addiu(SP, SP, Immediate(1 * kWordSize));
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ BranchNotEqual(T0, 0, &stepping);
+  __ Bind(&done_stepping);
 
   const Register temp1 = T2;
   const Register temp2 = T3;
@@ -2086,6 +2182,17 @@
   __ lw(right, Address(SP, 0 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2);
   __ Ret();
+
+  // Call single step callback in debugger.
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-1 * kWordSize));
+  __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ lw(RA, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(1 * kWordSize));
+  __ LeaveStubFrame();
+  __ b(&done_stepping);
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 59b4ce3..6956d08 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -1236,6 +1236,81 @@
 }
 
 
+// Note: RBX must be preserved.
+// Attempt a quick Smi operation for known operations ('kind'). The ICData
+// must have been primed with a Smi/Smi check that will be used for counting
+// the invocations.
+static void EmitFastSmiOp(Assembler* assembler,
+                          Token::Kind kind,
+                          intptr_t num_args,
+                          Label* not_smi_or_overflow) {
+  if (FLAG_throw_on_javascript_int_overflow) {
+    // The overflow check is more complex than implemented below.
+    return;
+  }
+  ASSERT(num_args == 2);
+  __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Right
+  __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left.
+  __ movq(R12, RCX);
+  __ orq(R12, RAX);
+  __ testq(R12, Immediate(kSmiTagMask));
+  __ j(NOT_ZERO, not_smi_or_overflow, Assembler::kNearJump);
+  switch (kind) {
+    case Token::kADD: {
+      __ addq(RAX, RCX);
+      __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
+      break;
+    }
+    case Token::kSUB: {
+      __ subq(RAX, RCX);
+      __ j(OVERFLOW, not_smi_or_overflow, Assembler::kNearJump);
+      break;
+    }
+    case Token::kEQ: {
+      Label done, is_true;
+      __ cmpq(RAX, RCX);
+      __ j(EQUAL, &is_true, Assembler::kNearJump);
+      __ LoadObject(RAX, Bool::False(), PP);
+      __ jmp(&done, Assembler::kNearJump);
+      __ Bind(&is_true);
+      __ LoadObject(RAX, Bool::True(), PP);
+      __ Bind(&done);
+      break;
+    }
+    default: UNIMPLEMENTED();
+  }
+
+  // RBX: IC data object (preserved).
+  __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
+  // R12: ic_data_array with check entries: classes and target functions.
+  __ leaq(R12, FieldAddress(R12, Array::data_offset()));
+  // R12: points directly to the first ic data array element.
+#if defined(DEBUG)
+  // Check that first entry is for Smi/Smi.
+  Label error, ok;
+  const Immediate& imm_smi_cid =
+      Immediate(reinterpret_cast<intptr_t>(Smi::New(kSmiCid)));
+  __ cmpq(Address(R12, 0 * kWordSize), imm_smi_cid);
+  __ j(NOT_EQUAL, &error, Assembler::kNearJump);
+  __ cmpq(Address(R12, 1 * kWordSize), imm_smi_cid);
+  __ j(EQUAL, &ok, Assembler::kNearJump);
+  __ Bind(&error);
+  __ Stop("Incorrect IC data");
+  __ Bind(&ok);
+#endif
+
+  const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
+  // Update counter.
+  __ movq(R8, Address(R12, count_offset));
+  __ addq(R8, Immediate(Smi::RawValue(1)));
+  __ movq(R9, Immediate(Smi::RawValue(Smi::kMaxValue)));
+  __ cmovnoq(R9, R8);
+  __ movq(Address(R12, count_offset), R9);
+
+  __ ret();
+}
+
+
 // Generate inline cache check for 'num_args'.
 //  RBX: Inline cache data object.
 //  TOS(0): return address
@@ -1249,7 +1324,8 @@
 void StubCode::GenerateNArgsCheckInlineCacheStub(
     Assembler* assembler,
     intptr_t num_args,
-    const RuntimeEntry& handle_ic_miss) {
+    const RuntimeEntry& handle_ic_miss,
+    Token::Kind kind) {
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
@@ -1272,6 +1348,12 @@
   __ j(NOT_EQUAL, &stepping);
   __ Bind(&done_stepping);
 
+  if (kind != Token::kILLEGAL) {
+    Label not_smi_or_overflow;
+    EmitFastSmiOp(assembler, kind, num_args, &not_smi_or_overflow);
+    __ Bind(&not_smi_or_overflow);
+  }
+
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
@@ -1396,24 +1478,46 @@
 //   - 1 target function.
 void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
+
+void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RCX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
+}
+
+
+void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RCX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
+}
+
+
+void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RCX);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
+}
+
+
 // Use inline cache data array to invoke the target or continue in inline
 // cache miss handler. Stub for 1-argument check (receiver class).
 //  RDI: function which counter needs to be incremented.
@@ -1428,31 +1532,31 @@
 void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
     Assembler* assembler) {
   GenerateOptimizedUsageCounterIncrement(assembler);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 3, kInlineCacheMissHandlerThreeArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 3,
+      kInlineCacheMissHandlerThreeArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
 // Do not count as no type feedback is collected.
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 1,
+      kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1476,17 +1580,12 @@
 #endif  // DEBUG
 
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-  __ EnterStubFrame();
-  __ pushq(RBX);  // Preserve IC data object.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ popq(RBX);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
+  __ Bind(&done_stepping);
 
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
@@ -1497,12 +1596,11 @@
   const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
 
   // Increment count for this call.
-  Label increment_done;
-  __ addq(Address(R12, count_offset), Immediate(Smi::RawValue(1)));
-  __ j(NO_OVERFLOW, &increment_done, Assembler::kNearJump);
-  __ movq(Address(R12, count_offset),
-          Immediate(Smi::RawValue(Smi::kMaxValue)));
-  __ Bind(&increment_done);
+  __ movq(R8, Address(R12, count_offset));
+  __ addq(R8, Immediate(Smi::RawValue(1)));
+  __ movq(R9, Immediate(Smi::RawValue(Smi::kMaxValue)));
+  __ cmovnoq(R9, R8);
+  __ movq(Address(R12, count_offset), R9);
 
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
@@ -1513,13 +1611,28 @@
   // RCX: Target instructions.
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RCX);
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ pushq(RBX);  // Preserve IC data object.
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ popq(RBX);
+  __ LeaveStubFrame();
+  __ jmp(&done_stepping, Assembler::kNearJump);
+}
+
+
+void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
+  GenerateUsageCounterIncrement(assembler, RCX);
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kStaticCallMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
 }
 
 
 void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
   GenerateUsageCounterIncrement(assembler, RCX);
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry);
+  GenerateNArgsCheckInlineCacheStub(assembler, 2,
+      kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
 }
 
 
@@ -1601,18 +1714,19 @@
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
+  __ Bind(&done_stepping);
+  __ ret();
 
+  __ Bind(&stepping);
   __ EnterStubFrame();
   __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
   __ LeaveStubFrame();
-  __ Bind(&not_stepping);
-
-  __ ret();
+  __ jmp(&done_stepping, Assembler::kNearJump);
 }
 
 
@@ -1867,15 +1981,12 @@
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
   // Check single stepping.
-  Label not_stepping;
+  Label stepping, done_stepping;
   __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
-  __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-  __ EnterStubFrame();
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  __ j(NOT_EQUAL, &stepping);
+  __ Bind(&done_stepping);
 
   const Register left = RAX;
   const Register right = RDX;
@@ -1884,6 +1995,12 @@
   __ movq(right, Address(RSP, 1 * kWordSize));
   GenerateIdenticalWithNumberCheckStub(assembler, left, right);
   __ ret();
+
+  __ Bind(&stepping);
+  __ EnterStubFrame();
+  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+  __ LeaveStubFrame();
+  __ jmp(&done_stepping);
 }
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index f061c3c..a64f344 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -14,6 +14,7 @@
 class Isolate;
 class ObjectPointerVisitor;
 
+// One-character symbols are added implicitly.
 #define PREDEFINED_SYMBOLS_LIST(V)                                             \
   V(Empty, "")                                                                 \
   V(EqualOperator, "==")                                                       \
@@ -63,23 +64,24 @@
   V(StackTraceVar, ":stack_trace_var")                                         \
   V(ListLiteralElement, "list literal element")                                \
   V(ForInIter, ":for-in-iter")                                                 \
-  V(ClosureFunctionField, ":function")                                         \
-  V(ClosureContextField, ":context")                                           \
   V(Library, "library")                                                        \
   V(LoadLibrary, "loadLibrary")                                                \
   V(_LibraryPrefix, "_LibraryPrefix")                                          \
   V(Async, "async")                                                            \
   V(AsyncCompleter, ":async_completer")                                        \
   V(AsyncOperation, ":async_op")                                               \
+  V(AsyncOperationParam, ":async_result")                                      \
+  V(Await, "await")                                                            \
+  V(AwaitContextVar, ":await_ctx_var")                                         \
+  V(AwaitJumpVar, ":await_jump_var")                                           \
   V(Future, "Future")                                                          \
   V(FutureConstructor, "Future.")                                              \
+  V(FutureThen, "then")                                                        \
   V(Completer, "Completer")                                                    \
   V(CompleterComplete, "complete")                                             \
   V(CompleterConstructor, "Completer.")                                        \
   V(CompleterFuture, "future")                                                 \
   V(Native, "native")                                                          \
-  V(Import, "import")                                                          \
-  V(Source, "source")                                                          \
   V(Class, "Class")                                                            \
   V(Null, "Null")                                                              \
   V(Dynamic, "dynamic")                                                        \
@@ -156,33 +158,19 @@
   V(Float64x2, "Float64x2")                                                    \
   V(Int32x4, "Int32x4")                                                        \
   V(Int8List, "Int8List")                                                      \
-  V(Int8ListFactory, "Int8List.")                                              \
   V(Uint8List, "Uint8List")                                                    \
-  V(Uint8ListFactory, "Uint8List.")                                            \
   V(Uint8ClampedList, "Uint8ClampedList")                                      \
-  V(Uint8ClampedListFactory, "Uint8ClampedList.")                              \
   V(Int16List, "Int16List")                                                    \
-  V(Int16ListFactory, "Int16List.")                                            \
   V(Uint16List, "Uint16List")                                                  \
-  V(Uint16ListFactory, "Uint16List.")                                          \
   V(Int32List, "Int32List")                                                    \
-  V(Int32ListFactory, "Int32List.")                                            \
   V(Uint32List, "Uint32List")                                                  \
-  V(Uint32ListFactory, "Uint32List.")                                          \
   V(Int64List, "Int64List")                                                    \
-  V(Int64ListFactory, "Int64List.")                                            \
   V(Uint64List, "Uint64List")                                                  \
-  V(Uint64ListFactory, "Uint64List.")                                          \
   V(Float32x4List, "Float32x4List")                                            \
-  V(Float32x4ListFactory, "Float32x4List.")                                    \
   V(Int32x4List, "Int32x4List")                                                \
-  V(Int32x4ListFactory, "Int32x4List.")                                        \
   V(Float64x2List, "Float64x2List")                                            \
-  V(Float64x2ListFactory, "Float64x2List.")                                    \
   V(Float32List, "Float32List")                                                \
-  V(Float32ListFactory, "Float32List.")                                        \
   V(Float64List, "Float64List")                                                \
-  V(Float64ListFactory, "Float64List.")                                        \
   V(_Int8Array, "_Int8Array")                                                  \
   V(_Int8ArrayFactory, "_Int8Array.")                                          \
   V(_Uint8Array, "_Uint8Array")                                                \
@@ -242,7 +230,6 @@
   V(ByteData, "ByteData")                                                      \
   V(ByteDataDot, "ByteData.")                                                  \
   V(ByteDataDot_view, "ByteData._view")                                        \
-  V(ByteDataDotview, "ByteData.view")                                          \
   V(_ByteDataView, "_ByteDataView")                                            \
   V(_ByteBuffer, "_ByteBuffer")                                                \
   V(_ByteBufferDot_New, "_ByteBuffer._New")                                    \
@@ -272,7 +259,6 @@
   V(BooleanExpression, "boolean expression")                                   \
   V(Malformed, "malformed")                                                    \
   V(Malbounded, "malbounded")                                                  \
-  V(InstanceOf, "InstanceOf")                                                  \
   V(MegamorphicMiss, "megamorphic_miss")                                       \
   V(CommaSpace, ", ")                                                          \
   V(ColonSpace, ": ")                                                          \
@@ -286,20 +272,15 @@
   V(GetterPrefix, "get:")                                                      \
   V(SetterPrefix, "set:")                                                      \
   V(InitPrefix, "init:")                                                       \
-  V(PrivateGetterPrefix, "get:_")                                              \
-  V(PrivateSetterPrefix, "set:_")                                              \
   V(_New, "_new")                                                              \
   V(DartScheme, "dart:")                                                       \
   V(DartSchemePrivate, "dart:_")                                               \
   V(DartNativeWrappers, "dart:nativewrappers")                                 \
   V(DartNativeWrappersLibName, "dart.nativewrappers")                          \
-  V(DartAsync, "dart:async")                                                   \
   V(DartCore, "dart:core")                                                     \
   V(DartCollection, "dart:collection")                                         \
-  V(DartConvert, "dart:convert")                                               \
   V(DartInternal, "dart:_internal")                                            \
   V(DartIsolate, "dart:isolate")                                               \
-  V(DartMath, "dart:math")                                                     \
   V(DartMirrors, "dart:mirrors")                                               \
   V(DartTypedData, "dart:typed_data")                                          \
   V(DartVMService, "dart:vmservice")                                           \
@@ -329,7 +310,6 @@
   V(NotInitialized, "<not initialized>")                                       \
   V(AllocationStubFor, "Allocation stub for ")                                 \
   V(TempParam, ":temp_param")                                                  \
-  V(UserTag, "UserTag")                                                        \
   V(_UserTag, "_UserTag")                                                      \
   V(Default, "Default")                                                        \
   V(StubPrefix, "[Stub] ")                                                     \
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 7027635..155312d 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -22,6 +22,8 @@
 
 namespace dart {
 
+class Isolate;
+
 class Thread {
  public:
   static ThreadLocalKey kUnsetThreadLocalKey;
@@ -58,8 +60,15 @@
   bool TryLock();
   void Unlock();
 
+#if defined(DEBUG)
+  Isolate* Owner() const { return owner_; }
+#endif  // defined(DEBUG)
+
  private:
   MutexData data_;
+#if defined(DEBUG)
+  Isolate* owner_;
+#endif  // defined(DEBUG)
 
   DISALLOW_COPY_AND_ASSIGN(Mutex);
 };
diff --git a/runtime/vm/thread_android.cc b/runtime/vm/thread_android.cc
index 750005e..84571c8 100644
--- a/runtime/vm/thread_android.cc
+++ b/runtime/vm/thread_android.cc
@@ -11,6 +11,7 @@
 #include <sys/time.h>  // NOLINT
 
 #include "platform/assert.h"
+#include "vm/isolate.h"
 
 namespace dart {
 
@@ -192,6 +193,11 @@
 
   result = pthread_mutexattr_destroy(&attr);
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = NULL;
+#endif  // defined(DEBUG)
 }
 
 
@@ -199,6 +205,11 @@
   int result = pthread_mutex_destroy(data_.mutex());
   // Verify that the pthread_mutex was destroyed.
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == NULL);
+#endif  // defined(DEBUG)
 }
 
 
@@ -207,7 +218,10 @@
   // Specifically check for dead lock to help debugging.
   ASSERT(result != EDEADLK);
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
 }
 
 
@@ -218,13 +232,20 @@
     return false;
   }
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
   return true;
 }
 
 
 void Mutex::Unlock() {
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == Isolate::Current());
+  owner_ = NULL;
+#endif  // defined(DEBUG)
   int result = pthread_mutex_unlock(data_.mutex());
   // Specifically check for wrong thread unlocking to aid debugging.
   ASSERT(result != EPERM);
diff --git a/runtime/vm/thread_linux.cc b/runtime/vm/thread_linux.cc
index df7ec1d..10599fe 100644
--- a/runtime/vm/thread_linux.cc
+++ b/runtime/vm/thread_linux.cc
@@ -12,6 +12,7 @@
 #include <sys/time.h>  // NOLINT
 
 #include "platform/assert.h"
+#include "vm/isolate.h"
 
 namespace dart {
 
@@ -193,6 +194,11 @@
 
   result = pthread_mutexattr_destroy(&attr);
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = NULL;
+#endif  // defined(DEBUG)
 }
 
 
@@ -200,6 +206,11 @@
   int result = pthread_mutex_destroy(data_.mutex());
   // Verify that the pthread_mutex was destroyed.
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == NULL);
+#endif  // defined(DEBUG)
 }
 
 
@@ -208,7 +219,10 @@
   // Specifically check for dead lock to help debugging.
   ASSERT(result != EDEADLK);
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
 }
 
 
@@ -219,13 +233,20 @@
     return false;
   }
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
   return true;
 }
 
 
 void Mutex::Unlock() {
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == Isolate::Current());
+  owner_ = NULL;
+#endif  // defined(DEBUG)
   int result = pthread_mutex_unlock(data_.mutex());
   // Specifically check for wrong thread unlocking to aid debugging.
   ASSERT(result != EPERM);
diff --git a/runtime/vm/thread_macos.cc b/runtime/vm/thread_macos.cc
index f790394..6a0cf5d 100644
--- a/runtime/vm/thread_macos.cc
+++ b/runtime/vm/thread_macos.cc
@@ -19,6 +19,7 @@
 #include <mach/thread_act.h>  // NOLINT
 
 #include "platform/assert.h"
+#include "vm/isolate.h"
 
 namespace dart {
 
@@ -198,6 +199,11 @@
 
   result = pthread_mutexattr_destroy(&attr);
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = NULL;
+#endif  // defined(DEBUG)
 }
 
 
@@ -205,6 +211,11 @@
   int result = pthread_mutex_destroy(data_.mutex());
   // Verify that the pthread_mutex was destroyed.
   VALIDATE_PTHREAD_RESULT(result);
+
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == NULL);
+#endif  // defined(DEBUG)
 }
 
 
@@ -213,7 +224,10 @@
   // Specifically check for dead lock to help debugging.
   ASSERT(result != EDEADLK);
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
 }
 
 
@@ -224,13 +238,20 @@
     return false;
   }
   ASSERT(result == 0);  // Verify no other errors.
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
   return true;
 }
 
 
 void Mutex::Unlock() {
-  // TODO(iposva): Do we need to track lock owners?
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == Isolate::Current());
+  owner_ = NULL;
+#endif  // defined(DEBUG)
   int result = pthread_mutex_unlock(data_.mutex());
   // Specifically check for wrong thread unlocking to aid debugging.
   ASSERT(result != EPERM);
diff --git a/runtime/vm/thread_pool_test.cc b/runtime/vm/thread_pool_test.cc
index af33b9b..35a6127 100644
--- a/runtime/vm/thread_pool_test.cc
+++ b/runtime/vm/thread_pool_test.cc
@@ -35,7 +35,7 @@
       : sync_(sync), done_(done) {
   }
 
-  void Run() {
+  virtual void Run() {
     MonitorLocker ml(sync_);
     *done_ = true;
     ml.Notify();
@@ -92,7 +92,7 @@
       : millis_(millis) {
   }
 
-  void Run() {
+  virtual void Run() {
     OS::Sleep(millis_);
   }
 
@@ -166,7 +166,7 @@
       : pool_(pool), sync_(sync), todo_(todo), total_(total), done_(done) {
   }
 
-  void Run() {
+  virtual void Run() {
     todo_--;  // Subtract one for current task.
     int child_todo = todo_ / 2;
 
diff --git a/runtime/vm/thread_win.cc b/runtime/vm/thread_win.cc
index 415efbc..6ea61c2 100644
--- a/runtime/vm/thread_win.cc
+++ b/runtime/vm/thread_win.cc
@@ -10,6 +10,7 @@
 #include <process.h>  // NOLINT
 
 #include "platform/assert.h"
+#include "vm/isolate.h"
 
 namespace dart {
 
@@ -170,11 +171,19 @@
   if (data_.semaphore_ == NULL) {
     FATAL1("Mutex allocation failed %d", GetLastError());
   }
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = NULL;
+#endif  // defined(DEBUG)
 }
 
 
 Mutex::~Mutex() {
   CloseHandle(data_.semaphore_);
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == NULL);
+#endif  // defined(DEBUG)
 }
 
 
@@ -183,6 +192,10 @@
   if (result != WAIT_OBJECT_0) {
     FATAL1("Mutex lock failed %d", GetLastError());
   }
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
 }
 
 
@@ -190,6 +203,10 @@
   // Attempt to pass the semaphore but return immediately.
   DWORD result = WaitForSingleObject(data_.semaphore_, 0);
   if (result == WAIT_OBJECT_0) {
+    // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+    owner_ = Isolate::Current();
+#endif  // defined(DEBUG)
     return true;
   }
   if (result == WAIT_ABANDONED || result == WAIT_FAILED) {
@@ -201,6 +218,11 @@
 
 
 void Mutex::Unlock() {
+  // When running with assertions enabled we do track the owner.
+#if defined(DEBUG)
+  ASSERT(owner_ == Isolate::Current());
+  owner_ = NULL;
+#endif  // defined(DEBUG)
   BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL);
   if (result == 0) {
     FATAL1("Mutex unlock failed %d", GetLastError());
diff --git a/runtime/vm/version.h b/runtime/vm/version.h
index bcc0876..0ced9b3 100644
--- a/runtime/vm/version.h
+++ b/runtime/vm/version.h
@@ -12,6 +12,7 @@
 class Version : public AllStatic {
  public:
   static const char* String();
+  static const char* SnapshotString();
 
  private:
   static const char* str_;
diff --git a/runtime/vm/version_in.cc b/runtime/vm/version_in.cc
index 5e40516..9f515d9 100644
--- a/runtime/vm/version_in.cc
+++ b/runtime/vm/version_in.cc
@@ -26,6 +26,12 @@
   return formatted_version;
 }
 
+
+const char* Version::SnapshotString() {
+  return str_;
+}
+
+
 const char* Version::str_ = "{{VERSION_STR}} ({{BUILD_TIME}})";
 
 }  // namespace dart
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index e657f58..172191f 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -34,6 +34,8 @@
     'ast_printer.h',
     'ast_printer_test.cc',
     'ast_test.cc',
+    'ast_transformer.cc',
+    'ast_transformer.h',
     'atomic.h',
     'atomic_android.cc',
     'atomic_linux.cc',
@@ -269,6 +271,11 @@
     'message_handler.h',
     'message_handler_test.cc',
     'message_test.cc',
+    'method_recognizer.cc',
+    'method_recognizer.h',
+    'metrics.cc',
+    'metrics.h',
+    'metrics_test.cc',
     'native_arguments.h',
     'native_entry.cc',
     'native_entry.h',
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 7e4cfbd..156b7c9 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -3,8 +3,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.
 
-# Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
-# structure.
+# Run pub.dart on the Dart VM. This script is only used when running pub from
+# within the Dart source repo. The shipped SDK instead uses "pub_sdk", which is
+# renamed to "pub" when the SDK is built.
 
 function follow_links() {
   file="$1"
@@ -38,30 +39,28 @@
   VM_OPTIONS+=("${OPTIONS[@]}")
 fi
 
-if test -f "$SNAPSHOT"; then
-  # We are running the snapshot in the built SDK.
-  DART="$BIN_DIR/dart"
-  exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
-else
-  # We are running pub from source in the development repo.
-  if [ -z "$DART_CONFIGURATION" ];
-  then
-    DART_CONFIGURATION="ReleaseIA32"
-  fi
-
-  if [[ `uname` == 'Darwin' ]];
-  then
-    BUILD_DIR="$SDK_DIR/../xcodebuild/$DART_CONFIGURATION"
-  else
-    BUILD_DIR="$SDK_DIR/../out/$DART_CONFIGURATION"
-  fi
-
-  # Use the Dart binary in the built SDK so pub can find the version file next
-  # to it.
-  DART="$BUILD_DIR/dart-sdk/bin/dart"
-  PACKAGES_DIR="$BUILD_DIR/pub_packages/"
-
-  PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
-
-  exec "$DART" "${VM_OPTIONS[@]}" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
+if [ -z "$DART_CONFIGURATION" ];
+then
+  DART_CONFIGURATION="ReleaseIA32"
 fi
+
+if [[ `uname` == 'Darwin' ]];
+then
+  BUILD_DIR="$SDK_DIR/../xcodebuild/$DART_CONFIGURATION"
+else
+  BUILD_DIR="$SDK_DIR/../out/$DART_CONFIGURATION"
+fi
+
+# Use the Dart binary in the built SDK so pub can find the version file next
+# to it.
+DART="$BUILD_DIR/dart-sdk/bin/dart"
+PACKAGES_DIR="$BUILD_DIR/pub_packages/"
+
+# Compile async/await down to vanilla Dart.
+# TODO(rnystrom): Remove this when #104 is fixed.
+ASYNC_COMPILER="$SDK_DIR/lib/_internal/pub/bin/async_compile.dart"
+"$DART" "--package-root=$PACKAGES_DIR" "$ASYNC_COMPILER" "$BUILD_DIR" --silent
+
+# Run the async/await compiled pub.
+PUB="$BUILD_DIR/pub_async/bin/pub.dart"
+exec "$DART" "${VM_OPTIONS[@]}" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
diff --git a/sdk/bin/pub.bat b/sdk/bin/pub.bat
index 308398a..0524075 100644
--- a/sdk/bin/pub.bat
+++ b/sdk/bin/pub.bat
@@ -1,8 +1,12 @@
 @echo off
-REM Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+REM Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+rem Run pub.dart on the Dart VM. This script is only used when running pub from
+rem within the Dart source repo. The shipped SDK instead uses "pub_sdk.bat",
+rem which is renamed to "pub.bat" when the SDK is built.
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
@@ -17,12 +21,6 @@
 rem Remove trailing backslash if there is one
 IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
 
-set PUB=%SDK_DIR%\lib\_internal\pub\bin\pub.dart
-set DART=%BIN_DIR%\dart
-set SNAPSHOT=%BIN_DIR%\snapshots\pub.dart.snapshot
-set BUILD_DIR=%SDK_DIR%\..\build\ReleaseIA32
-set PACKAGES_DIR=%BUILD_DIR%\pub_packages
-set DART_IN_BUILT_SDK=%BUILD_DIR%\dart-sdk\bin\dart
 set VM_OPTIONS=
 
 rem Give the VM extra memory for dart2js.
@@ -30,11 +28,21 @@
 rem See comments regarding options below in dart2js shell script.
 set VM_OPTIONS=%VM_OPTIONS% --old_gen_heap_size=1024
 
-if exist "%SNAPSHOT%" (
-  "%DART%" %VM_OPTIONS% "%SNAPSHOT%" %*
-) else (
-  "%DART_IN_BUILT_SDK%" %VM_OPTIONS% --package-root="%PACKAGES_DIR%" "%PUB%" %*
-)
+rem Use the Dart binary in the built SDK so pub can find the version file next
+rem to it.
+set BUILD_DIR=%SDK_DIR%\..\build\ReleaseIA32
+set PACKAGES_DIR=%BUILD_DIR%\pub_packages
+set DART=%BUILD_DIR%\dart-sdk\bin\dart
+
+rem Compile async/await down to vanilla Dart.
+rem TODO(rnystrom): Remove this when #104 is fixed.
+set ASYNC_COMPILER="%SDK_DIR%"\lib\_internal\pub\bin\async_compile.dart
+"%DART%" --package-root="%PACKAGES_DIR%" "%ASYNC_COMPILER%" "%BUILD_DIR%" ^
+    --silent
+
+rem Run the async/await compiled pub.
+set PUB="%BUILD_DIR%\pub_async\bin\pub.dart"
+"%DART%" %VM_OPTIONS% --package-root="%PACKAGES_DIR%" "%PUB%" %*
 
 endlocal
 
@@ -52,4 +60,4 @@
 endlocal & set %~2=%result%
 goto :eof
 
-:end
\ No newline at end of file
+:end
diff --git a/sdk/bin/pub_developer b/sdk/bin/pub_developer
deleted file mode 100755
index 1524a4e..0000000
--- a/sdk/bin/pub_developer
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-# 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.
-
-# Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
-# structure.
-
-function follow_links() {
-  file="$1"
-  while [ -h "$file" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    file="$(readlink "$file")"
-  done
-  echo "$file"
-}
-
-# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
-PROG_NAME="$(follow_links "$BASH_SOURCE")"
-
-# Handle the case where dart-sdk/bin has been symlinked to.
-BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
-
-SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
-
-unset VM_OPTIONS
-declare -a VM_OPTIONS
-
-# Give the VM extra memory for dart2js.
-# TODO(rnystrom): Remove when #8355 is fixed.
-VM_OPTIONS+=("--old_gen_heap_size=1024")
-
-# Allow extra VM options to be passed in through an environment variable.
-if [[ $DART_VM_OPTIONS ]]; then
-  read -a OPTIONS <<< "$DART_VM_OPTIONS"
-  VM_OPTIONS+=("${OPTIONS[@]}")
-fi
-
-VM_OPTIONS+=("--checked")
-
-if test -f "$SNAPSHOT"; then
-  # We are running the snapshot in the built SDK.
-  DART="$BIN_DIR/dart"
-  exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
-else
-  # We are running pub from source in the development repo.
-  if [ -z "$DART_CONFIGURATION" ];
-  then
-    DART_CONFIGURATION="ReleaseIA32"
-  fi
-
-  if [[ `uname` == 'Darwin' ]];
-  then
-    BUILD_DIR="$SDK_DIR/../xcodebuild/$DART_CONFIGURATION"
-  else
-    BUILD_DIR="$SDK_DIR/../out/$DART_CONFIGURATION"
-  fi
-
-  # Use the Dart binary in the built SDK so pub can find the version file next
-  # to it.
-  DART="$BUILD_DIR/dart-sdk/bin/dart"
-  PACKAGES_DIR="$BUILD_DIR/packages/"
-
-  PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
-
-  exec "$DART" "${VM_OPTIONS[@]}" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
-fi
diff --git a/sdk/bin/pub_sdk b/sdk/bin/pub_sdk
new file mode 100755
index 0000000..ade0583
--- /dev/null
+++ b/sdk/bin/pub_sdk
@@ -0,0 +1,41 @@
+#!/bin/bash
+# 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.
+
+# Run pub.dart on the Dart VM. This script assumes the Dart SDK's directory
+# structure.
+
+function follow_links() {
+  file="$1"
+  while [ -h "$file" ]; do
+    # On Mac OS, readlink -f doesn't work.
+    file="$(readlink "$file")"
+  done
+  echo "$file"
+}
+
+# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
+PROG_NAME="$(follow_links "$BASH_SOURCE")"
+
+# Handle the case where dart-sdk/bin has been symlinked to.
+BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
+
+SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
+
+unset VM_OPTIONS
+declare -a VM_OPTIONS
+
+# Give the VM extra memory for dart2js.
+# TODO(rnystrom): Remove when #8355 is fixed.
+VM_OPTIONS+=("--old_gen_heap_size=1024")
+
+# Allow extra VM options to be passed in through an environment variable.
+if [[ $DART_VM_OPTIONS ]]; then
+  read -a OPTIONS <<< "$DART_VM_OPTIONS"
+  VM_OPTIONS+=("${OPTIONS[@]}")
+fi
+
+# Run the pub snapshot.
+DART="$BIN_DIR/dart"
+exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/pub_developer.bat b/sdk/bin/pub_sdk.bat
similarity index 74%
rename from sdk/bin/pub_developer.bat
rename to sdk/bin/pub_sdk.bat
index 4025709..2c4977e 100644
--- a/sdk/bin/pub_developer.bat
+++ b/sdk/bin/pub_sdk.bat
@@ -17,24 +17,14 @@
 rem Remove trailing backslash if there is one
 IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
 
-set PUB=%SDK_DIR%\lib\_internal\pub\bin\pub.dart
-set DART=%BIN_DIR%\dart
-set SNAPSHOT=%BIN_DIR%\snapshots\pub.dart.snapshot
-set BUILD_DIR=%SDK_DIR%\..\build\ReleaseIA32
-set PACKAGES_DIR=%BUILD_DIR%\packages
-set DART_IN_BUILT_SDK=%BUILD_DIR%\dart-sdk\bin\dart
-set VM_OPTIONS=--checked
+set VM_OPTIONS=
 
 rem Give the VM extra memory for dart2js.
 rem # TODO(rnystrom): Remove when #8355 is fixed.
 rem See comments regarding options below in dart2js shell script.
 set VM_OPTIONS=%VM_OPTIONS% --old_gen_heap_size=1024
 
-if exist "%SNAPSHOT%" (
-  "%DART%" %VM_OPTIONS% "%SNAPSHOT%" %*
-) else (
-  "%DART_IN_BUILT_SDK%" %VM_OPTIONS% --package-root="%PACKAGES_DIR%" "%PUB%" %*
-)
+"%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
 
 endlocal
 
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index af5493e..e9758ae 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -7285,9 +7285,9 @@
 class BlinkURL {
   static $_createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
   static $createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index a9786cb..6643920 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -24,6 +24,9 @@
   bool mockableLibraryUsed = false;
   final Set<String> allowedLibraryCategories;
 
+  leg.GenericTask userHandlerTask;
+  leg.GenericTask userProviderTask;
+
   Compiler(this.provider,
            api.CompilerOutputProvider outputProvider,
            this.handler,
@@ -68,6 +71,10 @@
             useContentSecurityPolicy: hasOption(options, '--csp'),
             hasIncrementalSupport: hasOption(options, '--incremental-support'),
             suppressWarnings: hasOption(options, '--suppress-warnings')) {
+    tasks.addAll([
+        userHandlerTask = new leg.GenericTask('Diagnostic handler', this),
+        userProviderTask = new leg.GenericTask('Input provider', this),
+    ]);
     if (!libraryRoot.path.endsWith("/")) {
       throw new ArgumentError("libraryRoot must end with a /");
     }
@@ -312,7 +319,9 @@
   void callUserHandler(Uri uri, int begin, int end,
                        String message, api.Diagnostic kind) {
     try {
-      handler(uri, begin, end, message, kind);
+      userHandlerTask.measure(() {
+        handler(uri, begin, end, message, kind);
+      });
     } catch (ex, s) {
       diagnoseCrashInUserCode(
           'Uncaught exception in diagnostic handler', ex, s);
@@ -322,7 +331,7 @@
 
   Future callUserProvider(Uri uri) {
     try {
-      return provider(uri);
+      return userProviderTask.measure(() => provider(uri));
     } catch (ex, s) {
       diagnoseCrashInUserCode('Uncaught exception in input provider', ex, s);
       rethrow;
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 808a855..1710012 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -509,12 +509,13 @@
 
     Function compileArgument = evaluateConstant;
     Function compileConstant = handler.compileConstant;
+    target.computeSignature(compiler);
     bool succeeded = selector.addArgumentsToList(arguments,
                                                  compiledArguments,
                                                  target,
                                                  compileArgument,
                                                  compileConstant,
-                                                 compiler);
+                                                 compiler.world);
     if (!succeeded) {
       String name = Elements.constructorNameForDiagnostics(
           target.enclosingClass.name, target.name);
@@ -788,7 +789,7 @@
                                                    target,
                                                    compileArgument,
                                                    compileConstant,
-                                                   compiler);
+                                                   compiler.world);
       evaluateSuperOrRedirectSend(compiledArguments, target);
       return;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 2dcfaab..720aed8 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -127,8 +127,8 @@
     backend.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
   }
 
-  void registerGenericClosure(FunctionElement element) {
-    backend.registerGenericClosure(element, world, this);
+  void registerClosureWithFreeTypeVariables(FunctionElement element) {
+    backend.registerClosureWithFreeTypeVariables(element, world, this);
   }
 
   void registerGetOfStaticFunction(FunctionElement element) {
@@ -301,16 +301,19 @@
    * Call this to register that an instantiated generic class has a call
    * method.
    */
-  void registerGenericCallMethod(Element callMethod,
-                                 Enqueuer enqueuer,
-                                 Registry registry) {}
+  void registerCallMethodWithFreeTypeVariables(
+      Element callMethod,
+      Enqueuer enqueuer,
+      Registry registry) {}
+
   /**
    * Call this to register that a getter exists for a function on an
    * instantiated generic class.
    */
-  void registerGenericClosure(Element closure,
-                              Enqueuer enqueuer,
-                              Registry registry) {}
+  void registerClosureWithFreeTypeVariables(
+      Element closure,
+      Enqueuer enqueuer,
+      Registry registry) {}
 
   /// Call this to register that a member has been closurized.
   void registerBoundClosure(Enqueuer enqueuer) {}
@@ -657,11 +660,13 @@
    */
   final bool analyzeSignaturesOnly;
   final bool enableNativeLiveTypeAnalysis;
+
   /**
    * If true, stop compilation after type inference is complete. Used for
    * debugging and testing purposes only.
    */
   bool stopAfterTypeInference = false;
+
   /**
    * If [:true:], comment tokens are collected in [commentMap] during scanning.
    */
@@ -840,7 +845,6 @@
   ParserTask parser;
   PatchParserTask patchParser;
   LibraryLoaderTask libraryLoader;
-  TreeValidatorTask validator;
   ResolverTask resolver;
   closureMapping.ClosureTask closureToClassMapper;
   TypeCheckerTask checker;
@@ -892,7 +896,11 @@
   bool enabledInvokeOn = false;
   bool hasIsolateSupport = false;
 
-  Stopwatch progress = new Stopwatch()..start();
+  Stopwatch progress;
+
+  bool get shouldPrintProgress {
+    return verbose && progress.elapsedMilliseconds > 500;
+  }
 
   static const int PHASE_SCANNING = 0;
   static const int PHASE_RESOLVING = 1;
@@ -932,7 +940,7 @@
             this.useContentSecurityPolicy: false,
             this.suppressWarnings: false,
             bool hasIncrementalSupport: false,
-            outputProvider,
+            api.CompilerOutputProvider outputProvider,
             List<String> strips: const []})
       : this.disableTypeInferenceFlag =
           disableTypeInferenceFlag || !emitJavaScript,
@@ -949,6 +957,10 @@
     types = new Types(this);
     tracer = new Tracer(this.outputProvider);
 
+    if (verbose) {
+      progress = new Stopwatch()..start();
+    }
+
     // TODO(johnniwinther): Separate the dependency tracking from the enqueueing
     // for global dependencies.
     globalDependencies =
@@ -965,9 +977,6 @@
       backend = new dart_backend.DartBackend(this, strips);
     }
 
-    // No-op in production mode.
-    validator = new TreeValidatorTask(this);
-
     tasks = [
       libraryLoader = new LibraryLoaderTask(this),
       scanner = new ScannerTask(this),
@@ -1438,8 +1447,6 @@
     assert(mainFunction != null);
     phase = PHASE_DONE_RESOLVING;
 
-    // TODO(ahe): Remove this line. Eventually, enqueuer.resolution
-    // should know this.
     world.populate();
     // Compute whole-program-knowledge that the backend needs. (This might
     // require the information computed in [world.populate].)
@@ -1453,7 +1460,7 @@
     log('Inferring types...');
     typesTask.onResolutionComplete(mainFunction);
 
-    if(stopAfterTypeInference) return;
+    if (stopAfterTypeInference) return;
 
     log('Compiling...');
     phase = PHASE_COMPILING;
@@ -1533,7 +1540,9 @@
       }
       world.addToWorkList(main);
     }
-    progress.reset();
+    if (verbose) {
+      progress.reset();
+    }
     world.forEach((WorkItem work) {
       withCurrentElement(work.element, () => work.run(this, world));
     });
@@ -1601,7 +1610,6 @@
     assert(parser != null);
     Node tree = parser.parse(element);
     assert(invariant(element, !element.isSynthesized || tree == null));
-    if (tree != null) validator.validate(tree);
     TreeElements elements = resolver.resolve(element);
     if (elements != null) {
       if (tree != null && !analyzeSignaturesOnly &&
@@ -1617,7 +1625,7 @@
     assert(invariant(work.element, identical(world, enqueuer.resolution)));
     assert(invariant(work.element, !work.isAnalyzed(),
         message: 'Element ${work.element} has already been analyzed'));
-    if (progress.elapsedMilliseconds > 500) {
+    if (shouldPrintProgress) {
       // TODO(ahe): Add structured diagnostics to the compiler API and
       // use it to separate this from the --verbose option.
       if (phase == PHASE_RESOLVING) {
@@ -1634,7 +1642,7 @@
 
   void codegen(CodegenWorkItem work, CodegenEnqueuer world) {
     assert(invariant(work.element, identical(world, enqueuer.codegen)));
-    if (progress.elapsedMilliseconds > 500) {
+    if (shouldPrintProgress) {
       // TODO(ahe): Add structured diagnostics to the compiler API and
       // use it to separate this from the --verbose option.
       log('Compiled ${enqueuer.codegen.generatedCode.length} methods.');
@@ -1643,11 +1651,6 @@
     backend.codegen(work);
   }
 
-  FunctionSignature resolveSignature(FunctionElement element) {
-    return withCurrentElement(element,
-                              () => resolver.resolveSignature(element));
-  }
-
   void reportError(Spannable node,
                    MessageKind messageKind,
                    [Map arguments = const {}]) {
@@ -2109,3 +2112,10 @@
   int warnings = 0;
   int hints = 0;
 }
+
+class GenericTask extends CompilerTask {
+  final String name;
+
+  GenericTask(this.name, Compiler compiler)
+      : super(compiler);
+}
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart
new file mode 100644
index 0000000..fe4e51f
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/constant_propagation.dart
@@ -0,0 +1,663 @@
+// 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.optimizers;
+
+/**
+ * Propagates constants throughout the IR, and replaces branches with fixed
+ * jumps as well as side-effect free expressions with known constant results.
+ * Should be followed by the [ShrinkingReducer] pass.
+ *
+ * Implemented according to 'Constant Propagation with Conditional Branches'
+ * by Wegman, Zadeck.
+ */
+class ConstantPropagator implements Pass {
+
+  // Required for type determination in analysis of TypeOperator expressions.
+  final dart2js.Compiler _compiler;
+
+  // The constant system is used for evaluation of expressions with constant
+  // arguments.
+  final dart2js.ConstantSystem _constantSystem;
+
+  ConstantPropagator(this._compiler, this._constantSystem);
+
+  void rewrite(FunctionDefinition root) {
+    // Set all parent pointers.
+
+    new _ParentVisitor().visit(root);
+
+    // Analyze. In this phase, the entire term is analyzed for reachability
+    // and the constant status of each expression.
+
+    _ConstPropagationVisitor analyzer =
+        new _ConstPropagationVisitor(_compiler, _constantSystem);
+    analyzer.analyze(root);
+
+    // Transform. Uses the data acquired in the previous analysis phase to
+    // replace branches with fixed targets and side-effect-free expressions
+    // with constant results.
+
+    _TransformingVisitor transformer = new _TransformingVisitor(
+        analyzer.reachableNodes, analyzer.node2value);
+    transformer.transform(root);
+  }
+}
+
+/**
+ * Uses the information from a preceding analysis pass in order to perform the
+ * actual transformations on the CPS graph.
+ */
+class _TransformingVisitor extends RecursiveVisitor {
+
+  final Set<Node> reachable;
+  final Map<Node, _ConstnessLattice> node2value;
+
+  _TransformingVisitor(this.reachable, this.node2value);
+
+  void transform(FunctionDefinition root) {
+    visitFunctionDefinition(root);
+  }
+
+  /// Given an expression with a known constant result and a continuation,
+  /// replaces the expression by a new LetPrim / InvokeContinuation construct.
+  /// `unlink` is a closure responsible for unlinking all removed references.
+  LetPrim constifyExpression(Expression node,
+                             Continuation continuation,
+                             void unlink()) {
+    _ConstnessLattice cell = node2value[node];
+    if (cell == null || !cell.isConstant) {
+      return null;
+    }
+
+    assert(continuation.parameters.length == 1);
+
+    // Set up the replacement structure.
+
+    dart2js.PrimitiveConstant primitiveConstant = cell.constant;
+    ConstExp constExp = new PrimitiveConstExp(primitiveConstant);
+    Constant constant = new Constant(constExp, primitiveConstant);
+    LetPrim letPrim = new LetPrim(constant);
+    InvokeContinuation invoke =
+        new InvokeContinuation(continuation, <Definition>[constant]);
+
+    invoke.parent = constant.parent = letPrim;
+    letPrim.body = invoke;
+
+    // Replace the method invocation.
+
+    InteriorNode parent = node.parent;
+    letPrim.parent = parent;
+    parent.body = letPrim;
+
+    unlink();
+
+    return letPrim;
+  }
+
+  // A branch can be eliminated and replaced by an invocation if only one of
+  // the possible continuations is reachable. Removal often leads to both dead
+  // primitives (the condition variable) and dead continuations (the unreachable
+  // branch), which are both removed by the shrinking reductions pass.
+  //
+  // (Branch (IsTrue true) k0 k1) -> (InvokeContinuation k0)
+  void visitBranch(Branch node) {
+    bool trueReachable  = reachable.contains(node.trueContinuation.definition);
+    bool falseReachable = reachable.contains(node.falseContinuation.definition);
+    bool bothReachable  = (trueReachable && falseReachable);
+    bool noneReachable  = !(trueReachable || falseReachable);
+
+    if (bothReachable || noneReachable) {
+      // Nothing to do, shrinking reductions take care of the unreachable case.
+      super.visitBranch(node);
+      return;
+    }
+
+    Continuation successor = (trueReachable) ?
+        node.trueContinuation.definition : node.falseContinuation.definition;
+
+    // Replace the branch by a continuation invocation.
+
+    assert(successor.parameters.isEmpty);
+    InvokeContinuation invoke =
+        new InvokeContinuation(successor, <Definition>[]);
+
+    InteriorNode parent = node.parent;
+    invoke.parent = parent;
+    parent.body = invoke;
+
+    // Unlink all removed references.
+
+    node.trueContinuation.unlink();
+    node.falseContinuation.unlink();
+    IsTrue isTrue = node.condition;
+    isTrue.value.unlink();
+
+    visitInvokeContinuation(invoke);
+  }
+
+  // Side-effect free method calls with constant results can be replaced by
+  // a LetPrim / InvokeContinuation pair. May lead to dead primitives which
+  // are removed by the shrinking reductions pass.
+  //
+  // (InvokeMethod v0 == v1 k0)
+  // -> (assuming the result is a constant `true`)
+  // (LetPrim v2 (Constant true))
+  // (InvokeContinuation k0 v2)
+  void visitInvokeMethod(InvokeMethod node) {
+    Continuation cont = node.continuation.definition;
+    LetPrim letPrim = constifyExpression(node, cont, () {
+      node.receiver.unlink();
+      node.continuation.unlink();
+      node.arguments.forEach((Reference ref) => ref.unlink());
+    });
+
+    if (letPrim == null) {
+      super.visitInvokeMethod(node);
+    } else {
+      visitLetPrim(letPrim);
+    }
+  }
+
+  // See [visitInvokeMethod].
+  void visitConcatenateStrings(ConcatenateStrings node) {
+    Continuation cont = node.continuation.definition;
+    LetPrim letPrim = constifyExpression(node, cont, () {
+      node.continuation.unlink();
+      node.arguments.forEach((Reference ref) => ref.unlink());
+    });
+
+    if (letPrim == null) {
+      super.visitConcatenateStrings(node);
+    } else {
+      visitLetPrim(letPrim);
+    }
+  }
+
+  // See [visitInvokeMethod].
+  void visitTypeOperator(TypeOperator node) {
+    Continuation cont = node.continuation.definition;
+    LetPrim letPrim = constifyExpression(node, cont, () {
+      node.receiver.unlink();
+      node.continuation.unlink();
+    });
+
+    if (letPrim == null) {
+      super.visitTypeOperator(node);
+    } else {
+      visitLetPrim(letPrim);
+    }
+  }
+}
+
+/**
+ * Runs an analysis pass on the given function definition in order to detect
+ * const-ness as well as reachability, both of which are used in the subsequent
+ * transformation pass.
+ */
+class _ConstPropagationVisitor extends Visitor {
+  // The node worklist stores nodes that are both reachable and need to be
+  // processed, but have not been processed yet. Using a worklist avoids deep
+  // recursion.
+  // The node worklist and the reachable set operate in concert: nodes are
+  // only ever added to the worklist when they have not yet been marked as
+  // reachable, and adding a node to the worklist is always followed by marking
+  // it reachable.
+  // TODO(jgruber): Storing reachability per-edge instead of per-node would
+  // allow for further optimizations.
+  final List<Node> nodeWorklist = <Node>[];
+  final Set<Node> reachableNodes = new Set<Node>();
+
+  // The definition workset stores all definitions which need to be reprocessed
+  // since their lattice value has changed.
+  final Set<Definition> defWorkset = new Set<Definition>();
+
+  final dart2js.Compiler compiler;
+  final dart2js.ConstantSystem constantSystem;
+
+  // Stores the current lattice value for nodes. Note that it contains not only
+  // definitions as keys, but also expressions such as method invokes.
+  // Access through [getValue] and [setValue].
+  final Map<Node, _ConstnessLattice> node2value = <Node, _ConstnessLattice>{};
+
+  _ConstPropagationVisitor(this.compiler, this.constantSystem);
+
+  void analyze(FunctionDefinition root) {
+    reachableNodes.clear();
+    defWorkset.clear();
+    nodeWorklist.clear();
+
+    // Initially, only the root node is reachable.
+    setReachable(root);
+
+    while (true) {
+      if (nodeWorklist.isNotEmpty) {
+        // Process a new reachable expression.
+        Node node = nodeWorklist.removeLast();
+        visit(node);
+      } else if (defWorkset.isNotEmpty) {
+        // Process all usages of a changed definition.
+        Definition def = defWorkset.first;
+        defWorkset.remove(def);
+
+        // Visit all uses of this definition. This might add new entries to
+        // [nodeWorklist], for example by visiting a newly-constant usage within
+        // a branch node.
+        for (Reference ref = def.firstRef; ref != null; ref = ref.next) {
+          visit(ref.parent);
+        }
+      } else {
+        break;  // Both worklists empty.
+      }
+    }
+  }
+
+  /// If the passed node is not yet reachable, mark it reachable and add it
+  /// to the work list.
+  void setReachable(Node node) {
+    if (!reachableNodes.contains(node)) {
+      reachableNodes.add(node);
+      nodeWorklist.add(node);
+    }
+  }
+
+  /// Returns the lattice value corresponding to [node], defaulting to unknown.
+  ///
+  /// Never returns null.
+  _ConstnessLattice getValue(Node node) {
+    _ConstnessLattice value = node2value[node];
+    return (value == null) ? _ConstnessLattice.Unknown : value;
+  }
+
+  /// Joins the passed lattice [updateValue] to the current value of [node],
+  /// and adds it to the definition work set if it has changed and [node] is
+  /// a definition.
+  void setValue(Node node, _ConstnessLattice updateValue) {
+    _ConstnessLattice oldValue = getValue(node);
+    _ConstnessLattice newValue = updateValue.join(oldValue);
+    if (oldValue == newValue) {
+      return;
+    }
+
+    // Values may only move in the direction UNKNOWN -> CONSTANT -> NONCONST.
+    assert(newValue.kind >= oldValue.kind);
+
+    node2value[node] = newValue;
+    if (node is Definition) {
+      defWorkset.add(node);
+    }
+  }
+
+  // -------------------------- Visitor overrides ------------------------------
+
+  void visitNode(Node node) {
+    compiler.internalError(NO_LOCATION_SPANNABLE,
+        "_ConstPropagationVisitor is stale, add missing visit overrides");
+  }
+
+  void visitFunctionDefinition(FunctionDefinition node) {
+    node.parameters.forEach(visitParameter);
+    setReachable(node.body);
+  }
+
+  // Expressions.
+
+  void visitLetPrim(LetPrim node) {
+    visit(node.primitive); // No reason to delay visits to primitives.
+    setReachable(node.body);
+  }
+
+  void visitLetCont(LetCont node) {
+    // The continuation is only marked as reachable on use.
+    setReachable(node.body);
+  }
+
+  void visitInvokeStatic(InvokeStatic node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    assert(cont.parameters.length == 1);
+    Parameter returnValue = cont.parameters[0];
+    setValue(returnValue, _ConstnessLattice.NonConst);
+  }
+
+  void visitInvokeContinuation(InvokeContinuation node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    // Forward the constant status of all continuation invokes to the
+    // continuation. Note that this is effectively a phi node in SSA terms.
+    for (int i = 0; i < node.arguments.length; i++) {
+      Definition def = node.arguments[i].definition;
+      _ConstnessLattice cell = getValue(def);
+      setValue(cont.parameters[i], cell);
+    }
+  }
+
+  void visitInvokeMethod(InvokeMethod node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    /// Sets the value of both the current node and the target continuation
+    /// parameter.
+    void setValues(_ConstnessLattice updateValue) {
+      setValue(node, updateValue);
+      Parameter returnValue = cont.parameters[0];
+      setValue(returnValue, updateValue);
+    }
+
+    _ConstnessLattice lhs = getValue(node.receiver.definition);
+    if (lhs.isUnknown) {
+      // This may seem like a missed opportunity for evaluating short-circuiting
+      // boolean operations; we are currently skipping these intentionally since
+      // expressions such as `(new Foo() || true)` may introduce type errors
+      // and thus evaluation to `true` would not be correct.
+      // TODO(jgruber): Handle such cases while ensuring that new Foo() and
+      // a type-check (in checked mode) are still executed.
+      return;  // And come back later.
+    } else if (lhs.isNonConst) {
+      setValues(_ConstnessLattice.NonConst);
+      return;
+    } else if (!node.selector.isOperator) {
+      // TODO(jgruber): Handle known methods on constants such as String.length.
+      setValues(_ConstnessLattice.NonConst);
+      return;
+    }
+
+    // Calculate the resulting constant if possible.
+    dart2js.Constant result;
+    String opname = node.selector.name;
+    if (node.selector.argumentCount == 0) {
+      // Unary operator.
+
+      if (opname == "unary-") {
+        opname = "-";
+      }
+      dart2js.UnaryOperation operation = constantSystem.lookupUnary(opname);
+      if (operation != null) {
+        result = operation.fold(lhs.constant);
+      }
+    } else if (node.selector.argumentCount == 1) {
+      // Binary operator.
+
+      _ConstnessLattice rhs = getValue(node.arguments[0].definition);
+      if (!rhs.isConstant) {
+        setValues(rhs);
+        return;
+      }
+
+      dart2js.BinaryOperation operation = constantSystem.lookupBinary(opname);
+      if (operation != null) {
+        result = operation.fold(lhs.constant, rhs.constant);
+      }
+    }
+
+    // Update value of the continuation parameter. Again, this is effectively
+    // a phi.
+
+    setValues((result == null) ?
+        _ConstnessLattice.NonConst : new _ConstnessLattice(result));
+   }
+
+  void visitInvokeSuperMethod(InvokeSuperMethod node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    assert(cont.parameters.length == 1);
+    Parameter returnValue = cont.parameters[0];
+    setValue(returnValue, _ConstnessLattice.NonConst);
+  }
+
+  void visitInvokeConstructor(InvokeConstructor node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    assert(cont.parameters.length == 1);
+    Parameter returnValue = cont.parameters[0];
+    setValue(returnValue, _ConstnessLattice.NonConst);
+  }
+
+  void visitConcatenateStrings(ConcatenateStrings node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    void setValues(_ConstnessLattice updateValue) {
+      setValue(node, updateValue);
+      Parameter returnValue = cont.parameters[0];
+      setValue(returnValue, updateValue);
+    }
+
+    // TODO(jgruber): Currently we only optimize if all arguments are string
+    // constants, but we could also handle cases such as "foo${42}".
+    bool allStringConstants = node.arguments.every((Reference ref) {
+      if (!(ref.definition is Constant)) {
+        return false;
+      }
+      Constant constant = ref.definition;
+      return constant != null && constant.value is dart2js.StringConstant;
+    });
+
+    assert(cont.parameters.length == 1);
+    if (allStringConstants) {
+      // All constant, we can concatenate ourselves.
+      Iterable<String> allStrings = node.arguments.map((Reference ref) {
+        Constant constant = ref.definition;
+        dart2js.StringConstant stringConstant = constant.value;
+        return stringConstant.value.slowToString();
+      });
+      LiteralDartString dartString = new LiteralDartString(allStrings.join());
+      dart2js.Constant constant = new dart2js.StringConstant(dartString);
+      setValues(new _ConstnessLattice(constant));
+    } else {
+      setValues(_ConstnessLattice.NonConst);
+    }
+  }
+
+  void visitBranch(Branch node) {
+    IsTrue isTrue = node.condition;
+    _ConstnessLattice conditionCell = getValue(isTrue.value.definition);
+
+    if (conditionCell.isUnknown) {
+      return;  // And come back later.
+    } else if (conditionCell.isNonConst) {
+      setReachable(node.trueContinuation.definition);
+      setReachable(node.falseContinuation.definition);
+    } else if (conditionCell.isConstant &&
+        !(conditionCell.constant is dart2js.BoolConstant)) {
+      // Treat non-bool constants in condition as non-const since they result
+      // in type errors in checked mode.
+      // TODO(jgruber): Default to false in unchecked mode.
+      setReachable(node.trueContinuation.definition);
+      setReachable(node.falseContinuation.definition);
+      setValue(isTrue.value.definition, _ConstnessLattice.NonConst);
+    } else if (conditionCell.isConstant &&
+        conditionCell.constant is dart2js.BoolConstant) {
+      dart2js.BoolConstant boolConstant = conditionCell.constant;
+      setReachable((boolConstant.isTrue) ?
+          node.trueContinuation.definition : node.falseContinuation.definition);
+    }
+  }
+
+  void visitTypeOperator(TypeOperator node) {
+    Continuation cont = node.continuation.definition;
+    setReachable(cont);
+
+    void setValues(_ConstnessLattice updateValue) {
+      setValue(node, updateValue);
+      Parameter returnValue = cont.parameters[0];
+      setValue(returnValue, updateValue);
+    }
+
+    if (node.operator != "is") {
+      // TODO(jgruber): Add support for `as` casts.
+      setValues(_ConstnessLattice.NonConst);
+    }
+
+    _ConstnessLattice cell = getValue(node.receiver.definition);
+    if (cell.isUnknown) {
+      return;  // And come back later.
+    } else if (cell.isNonConst) {
+      setValues(_ConstnessLattice.NonConst);
+    } else if (node.type.kind == types.TypeKind.INTERFACE) {
+      // Receiver is a constant, perform is-checks at compile-time.
+
+      types.InterfaceType checkedType = node.type;
+      dart2js.Constant constant = cell.constant;
+      types.DartType constantType = constant.computeType(compiler);
+
+      _ConstnessLattice result = _ConstnessLattice.NonConst;
+      if (constant is dart2js.NullConstant &&
+          checkedType.element != compiler.nullClass &&
+          checkedType.element != compiler.objectClass) {
+        // `(null is Type)` is true iff Type is in { Null, Object }.
+        result = new _ConstnessLattice(new dart2js.FalseConstant());
+      } else {
+        // Otherwise, perform a standard subtype check.
+        result = new _ConstnessLattice(
+            constantSystem.isSubtype(compiler, constantType, checkedType)
+            ? new dart2js.TrueConstant()
+            : new dart2js.FalseConstant());
+      }
+
+      setValues(result);
+    }
+  }
+
+  void visitSetClosureVariable(SetClosureVariable node) {
+    setReachable(node.body);
+  }
+
+  void visitDeclareFunction(DeclareFunction node) {
+    setReachable(node.definition);
+    setReachable(node.body);
+  }
+
+  // Definitions.
+  void visitLiteralList(LiteralList node) {
+    // Constant lists are translated into (Constant ListConstant(...)) IR nodes,
+    // and thus LiteralList nodes are NonConst.
+    setValue(node, _ConstnessLattice.NonConst);
+  }
+
+  void visitLiteralMap(LiteralMap node) {
+    // Constant maps are translated into (Constant MapConstant(...)) IR nodes,
+    // and thus LiteralMap nodes are NonConst.
+    setValue(node, _ConstnessLattice.NonConst);
+  }
+
+  void visitConstant(Constant node) {
+    setValue(node, new _ConstnessLattice(node.value));
+  }
+
+  void visitThis(This node) {
+    setValue(node, _ConstnessLattice.NonConst);
+  }
+
+  void visitReifyTypeVar(ReifyTypeVar node) {
+    setValue(node, _ConstnessLattice.NonConst);
+  }
+
+  void visitCreateFunction(CreateFunction node) {
+    setReachable(node.definition);
+    dart2js.Constant constant =
+        new dart2js.FunctionConstant(node.definition.element);
+    setValue(node, new _ConstnessLattice(constant));
+  }
+
+  void visitGetClosureVariable(GetClosureVariable node) {
+    setValue(node, _ConstnessLattice.NonConst);
+  }
+
+  void visitParameter(Parameter node) {
+    if (node.parent is FunctionDefinition) {
+      // Functions may escape and thus their parameters must be initialized to
+      // NonConst.
+      setValue(node, _ConstnessLattice.NonConst);
+    } else if (node.parent is Continuation) {
+      // Continuations on the other hand are local, and parameters are
+      // initialized to Unknown.
+      setValue(node, _ConstnessLattice.Unknown);
+    } else {
+      compiler.internalError(node.hint, "Unexpected parent of Parameter");
+    }
+  }
+
+  void visitContinuation(Continuation node) {
+    node.parameters.forEach((Parameter p) {
+      setValue(p, _ConstnessLattice.Unknown);
+      defWorkset.add(p);
+    });
+
+    if (node.body != null) {
+      setReachable(node.body);
+    }
+  }
+
+  // Conditions.
+
+  void visitIsTrue(IsTrue node) {
+    Branch branch = node.parent;
+    visitBranch(branch);
+  }
+}
+
+/// Represents the constant-state of a variable at some point in the program.
+/// UNKNOWN: may be some as yet undetermined constant.
+/// CONSTANT: is a constant as stored in the local field.
+/// NONCONST: not a constant.
+class _ConstnessLattice {
+  static const int UNKNOWN  = 0;
+  static const int CONSTANT = 1;
+  static const int NONCONST = 2;
+
+  final int kind;
+  final dart2js.Constant constant;
+
+  static final _ConstnessLattice Unknown =
+      new _ConstnessLattice._internal(UNKNOWN, null);
+  static final _ConstnessLattice NonConst =
+      new _ConstnessLattice._internal(NONCONST, null);
+
+  _ConstnessLattice._internal(this.kind, this.constant);
+  _ConstnessLattice(this.constant) : kind = CONSTANT {
+    assert(this.constant != null);
+  }
+
+  bool get isUnknown  => (kind == UNKNOWN);
+  bool get isConstant => (kind == CONSTANT);
+  bool get isNonConst => (kind == NONCONST);
+
+  int get hashCode => kind | (constant.hashCode << 2);
+  bool operator==(_ConstnessLattice that) =>
+      (that.kind == this.kind && that.constant == this.constant);
+
+  String toString() {
+    switch (kind) {
+      case UNKNOWN: return "Unknown";
+      case CONSTANT: return "Constant: $constant";
+      case NONCONST: return "Non-constant";
+      default: assert(false);
+    }
+    return null;
+  }
+
+  /// Compute the join of two values in the lattice.
+  _ConstnessLattice join(_ConstnessLattice that) {
+    assert(that != null);
+
+    if (this.isNonConst || that.isUnknown) {
+      return this;
+    }
+
+    if (this.isUnknown || that.isNonConst) {
+      return that;
+    }
+
+    if (this.constant == that.constant) {
+      return this;
+    }
+
+    return NonConst;
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 535ef31..f27f18f 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -110,6 +110,10 @@
     if (function is ConstructorElement && function.isRedirectingFactory) {
       return false;
     }
+    // TODO(kmillikin,sigurdm): support syntax for factory constructors
+    if (function is ConstructorElement && function.isFactoryConstructor) {
+      return false;
+    }
 
     return true;
   }
@@ -137,12 +141,19 @@
   _GetterElements({this.result, this.index, this.receiver}) ;
 }
 
-/**
- *
- */
+/// A mapping from variable elements to their compile-time values.
+///
+/// Map elements denoted by parameters and local variables to the
+/// [ir.Primitive] that is their value.  Parameters and locals are
+/// assigned indexes which can be used to refer to them.
 class Environment {
+  /// A map from elements to their environment index.
   final Map<Element, int> variable2index;
+
+  /// A reverse map from environment indexes to the variable.
   final List<Element> index2variable;
+
+  /// A map from environment indexes to their value.
   final List<ir.Primitive> index2value;
 
   Environment.empty()
@@ -150,6 +161,9 @@
         index2variable = <Element>[],
         index2value = <ir.Primitive>[];
 
+  /// Construct an environment that is a copy of another one.
+  ///
+  /// The mapping from elements to indexes is shared, not copied.
   Environment.from(Environment other)
       : variable2index = other.variable2index,
         index2variable = new List<Element>.from(other.index2variable),
@@ -202,6 +216,38 @@
   }
 }
 
+/// A class to collect breaks or continues.
+///
+/// When visiting a potential target of breaks or continues, any breaks or
+/// continues are collected by a JumpCollector and processed later, on demand.
+/// The site of the break or continue is represented by a continuation
+/// invocation that will have its target and arguments filled in later.
+///
+/// The environment of the builder at that point is captured and should not
+/// be subsequently mutated until the jump is resolved.
+class JumpCollector {
+  final JumpTarget target;
+  final List<ir.InvokeContinuation> _invocations = <ir.InvokeContinuation>[];
+  final List<Environment> _environments = <Environment>[];
+
+  JumpCollector(this.target);
+
+  bool get isEmpty => _invocations.isEmpty;
+  int get length => _invocations.length;
+  List<ir.InvokeContinuation> get invocations => _invocations;
+  List<Environment> get environments => _environments;
+
+  void addJump(IrBuilder builder) {
+    ir.InvokeContinuation invoke = new ir.InvokeContinuation.uninitialized();
+    builder.add(invoke);
+    _invocations.add(invoke);
+    _environments.add(builder.environment);
+    builder.current = null;
+    // TODO(kmillikin): Can we set builder.environment to null to make it
+    // less likely to mutate it?
+  }
+}
+
 /**
  * A tree visitor that builds [IrNodes]. The visit methods add statements using
  * to the [builder] and return the last added statement for trees that represent
@@ -260,6 +306,11 @@
   /// A map from variable indexes to their values.
   Environment environment;
 
+  /// A stack of collectors for breaks.
+  final List<JumpCollector> breakCollectors;
+  /// A stack of collectors for continues.
+  final List<JumpCollector> continueCollectors;
+
   ConstExpBuilder constantBuilder;
 
   final List<ConstDeclaration> localConstants;
@@ -272,6 +323,8 @@
       : returnContinuation = new ir.Continuation.retrn(),
         parameters = <ir.Parameter>[],
         environment = new Environment.empty(),
+        breakCollectors = <JumpCollector>[],
+        continueCollectors = <JumpCollector>[],
         localConstants = <ConstDeclaration>[],
         closureLocals = new DetectClosureVariables(elements),
         super(elements, compiler) {
@@ -289,6 +342,8 @@
         returnContinuation = parent.returnContinuation,
         parameters = <ir.Parameter>[],
         environment = new Environment.from(parent.environment),
+        breakCollectors = parent.breakCollectors,
+        continueCollectors = parent.continueCollectors,
         constantBuilder = parent.constantBuilder,
         localConstants = parent.localConstants,
         currentFunction = parent.currentFunction,
@@ -308,6 +363,8 @@
         returnContinuation = parent.returnContinuation,
         parameters = <ir.Parameter>[],
         environment = new Environment.empty(),
+        breakCollectors = parent.breakCollectors,
+        continueCollectors = parent.continueCollectors,
         constantBuilder = parent.constantBuilder,
         localConstants = parent.localConstants,
         currentFunction = parent.currentFunction,
@@ -420,6 +477,40 @@
     return null;
   }
 
+  // Build(BreakStatement L, C) = C[InvokeContinuation(...)]
+  //
+  // The continuation and arguments are filled in later after translating
+  // the body containing the break.
+  ir.Primitive visitBreakStatement(ast.BreakStatement node) {
+    assert(isOpen);
+    JumpTarget target = elements.getTargetOf(node);
+    for (JumpCollector collector in breakCollectors) {
+      if (target == collector.target) {
+        collector.addJump(this);
+        return null;
+      }
+    }
+    compiler.internalError(node, "'break' target not found");
+    return null;
+  }
+
+  // Build(ContinueStatement L, C) = C[InvokeContinuation(...)]
+  //
+  // The continuation and arguments are filled in later after translating
+  // the body containing the continue.
+  ir.Primitive visitContinueStatement(ast.ContinueStatement node) {
+    assert(isOpen);
+    JumpTarget target = elements.getTargetOf(node);
+    for (JumpCollector collector in continueCollectors) {
+      if (target == collector.target) {
+        collector.addJump(this);
+        return null;
+      }
+    }
+    compiler.internalError(node, "'continue' target not found");
+    return null;
+  }
+
   // Build(EmptyStatement, C) = C
   ir.Primitive visitEmptyStatement(ast.EmptyStatement node) {
     assert(isOpen);
@@ -437,24 +528,24 @@
 
   /// Create a non-recursive join-point continuation.
   ///
-  /// Given the environment length at the join point and a list of open
-  /// contexts that should reach the join point, create a join-point
+  /// Given the environment length at the join point and a list of
+  /// jumps that should reach the join point, create a join-point
   /// continuation.  The join-point continuation has a parameter for each
   /// variable that has different values reaching on different paths.
   ///
-  /// The holes in the contexts are filled with [ir.InvokeContinuation]
-  /// expressions passing the appropriate arguments.
+  /// The jumps are uninitialized [ir.InvokeContinuation] expressions.
+  /// They are filled in with the target continuation and appropriate
+  /// arguments.
   ///
   /// As a side effect, the environment of this builder is updated to include
   /// the join-point continuation parameters.
-  ir.Continuation createJoin(int environmentLength,
-                             List<IrBuilder> contexts) {
-    assert(contexts.length >= 2);
+  ir.Continuation createJoin(int environmentLength, JumpCollector jumps) {
+    assert(jumps.length >= 2);
 
     // Compute which values are identical on all paths reaching the join.
     // Handle the common case of a pair of contexts efficiently.
-    Environment first = contexts[0].environment;
-    Environment second = contexts[1].environment;
+    Environment first = jumps.environments[0];
+    Environment second = jumps.environments[1];
     assert(environmentLength <= first.length);
     assert(environmentLength <= second.length);
     assert(first.sameDomain(environmentLength, second));
@@ -479,10 +570,10 @@
       for (int i = 0; i < environmentLength; ++i) {
         ir.Primitive candidate = common[i];
         if (candidate == null) continue;
-        for (IrBuilder current in contexts.skip(2)) {
-          assert(environmentLength <= current.environment.length);
-          assert(first.sameDomain(environmentLength, current.environment));
-          if (candidate != current.environment[i]) {
+        for (Environment current in jumps.environments.skip(2)) {
+          assert(environmentLength <= current.length);
+          assert(first.sameDomain(environmentLength, current));
+          if (candidate != current[i]) {
             common[i] = null;
             ++parameterCount;
             break;
@@ -492,59 +583,71 @@
       }
     }
 
+    // Create the join point continuation.
     List<ir.Parameter> parameters = <ir.Parameter>[];
     parameters.length = parameterCount;
     int index = 0;
     for (int i = 0; i < environmentLength; ++i) {
       if (common[i] == null) {
-        ir.Parameter parameter = new ir.Parameter(first.index2variable[i]);
-        parameters[index++] = parameter;
-        if (i < environment.length) {
-          // The variable is bound to the join-point parameter in the
-          // continuation.  Variables outside the range of the environment are
-          // 'phantom' variables used for the values of expressions like
-          // &&, ||, and ?:.
-          environment.index2value[i] = parameter;
-        }
+        parameters[index++] = new ir.Parameter(first.index2variable[i]);
       }
     }
     assert(index == parameterCount);
     ir.Continuation join = new ir.Continuation(parameters);
 
-    // Plug all the contexts with continuation invocations.
-    for (IrBuilder context in contexts) {
-      // Passing `this` as one of the contexts will not do the right thing
-      // (this.environment has already been mutated).
-      assert(context != this);
-      List<ir.Primitive> arguments = <ir.Primitive>[];
+    // Fill in all the continuation invocations.
+    for (int i = 0; i < jumps.length; ++i) {
+      Environment currentEnvironment = jumps.environments[i];
+      ir.InvokeContinuation invoke = jumps.invocations[i];
+      // Sharing this.environment with one of the invocations will not do
+      // the right thing (this.environment has already been mutated).
+      List<ir.Reference> arguments = <ir.Reference>[];
       arguments.length = parameterCount;
       int index = 0;
       for (int i = 0; i < environmentLength; ++i) {
         if (common[i] == null) {
-          arguments[index++] = context.environment[i];
+          arguments[index++] = new ir.Reference(currentEnvironment[i]);
         }
       }
-      context.add(new ir.InvokeContinuation(join, arguments));
-      context.current = null;
+      invoke.continuation = new ir.Reference(join);
+      invoke.arguments = arguments;
+    }
+
+    // Mutate this.environment to be the environment at the join point.  Do
+    // this after adding the continuation invocations, because this.environment
+    // might be collected by the jump collector and so the old environment
+    // values are needed for the continuation invocation.
+    //
+    // Iterate to environment.length because environmentLength includes values
+    // outside the environment which are 'phantom' variables used for the
+    // values of expressions like &&, ||, and ?:.
+    index = 0;
+    for (int i = 0; i < environment.length; ++i) {
+      if (common[i] == null) {
+        environment.index2value[i] = parameters[index++];
+      }
     }
 
     return join;
   }
 
-  /// Invoke a recursive join-point continuation.
+  /// Invoke a join-point continuation that contains arguments for all local
+  /// variables.
   ///
-  /// Given the continuation and a list of open contexts that should contain
-  /// recursive invocations, plug each context with an invocation of the
-  /// continuation.
-  void invokeRecursiveJoin(ir.Continuation join, List<IrBuilder> contexts) {
-    for (IrBuilder context in contexts) {
-      // Passing `this` as one of the contexts will not do the right thing
-      // (this.environment has already been mutated).
-      assert(context != this);
-      List<ir.Primitive> args =
-          context.environment.index2value.sublist(0, join.parameters.length);
-      context.add(new ir.InvokeContinuation(join, args, recursive: true));
-      context.current = null;
+  /// Given the continuation and a list of uninitialized invocations, fill
+  /// in each invocation with the continuation and appropriate arguments.
+  void invokeFullJoin(ir.Continuation join,
+                      JumpCollector jumps,
+                      {recursive: false}) {
+    join.isRecursive = recursive;
+    for (int i = 0; i < jumps.length; ++i) {
+      Environment currentEnvironment = jumps.environments[i];
+      ir.InvokeContinuation invoke = jumps.invocations[i];
+      invoke.continuation = new ir.Reference(join);
+      invoke.arguments = new List<ir.Reference>.generate(
+          join.parameters.length,
+          (i) => new ir.Reference(currentEnvironment[i]));
+      invoke.isRecursive = recursive;
     }
   }
 
@@ -561,17 +664,27 @@
       }
     }
 
-    // For loops use three named continuations: the entry to the condition,
-    // the entry to the body, and the loop exit (break).  The CPS translation
-    // of [[for (initializer; condition; update) body; successor]] is:
+    // For loops use four named continuations: the entry to the condition,
+    // the entry to the body, the loop exit, and the loop successor (break).
+    // The CPS translation of
+    // [[for (initializer; condition; update) body; successor]] is:
     //
     // [[initializer]];
     // let cont loop(x, ...) =
     //     let prim cond = [[condition]] in
-    //     let cont exit() = [[successor]] in
-    //     let cont body() = [[body]]; [[update]]; loop(v, ...) in
+    //     let cont break() = [[successor]] in
+    //     let cont exit() = break(v, ...) in
+    //     let cont body() =
+    //       let cont continue(x, ...) = [[update]]; loop(v, ...) in
+    //       [[body]]; continue(v, ...) in
     //     branch cond (body, exit) in
     // loop(v, ...)
+    //
+    // If there are no breaks in the body, the break continuation is inlined
+    // in the exit continuation (i.e., the translation of the successor
+    // statement occurs in the exit continuation).  If there is only one
+    // invocation of the continue continuation (i.e., no continues in the
+    // body), the continue continuation is inlined in the body.
 
     if (node.initializer != null) visit(node.initializer);
 
@@ -585,36 +698,92 @@
       condition = condBuilder.visit(node.condition);
     }
 
+    JumpTarget target = elements.getTargetDefinition(node);
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    breakCollectors.add(breakCollector);
+    continueCollectors.add(continueCollector);
+
     IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
     bodyBuilder.visit(node.body);
+    assert(breakCollectors.last == breakCollector);
+    assert(continueCollectors.last == continueCollector);
+    breakCollectors.removeLast();
+    continueCollectors.removeLast();
+
+    // The binding of the continue continuation should occur as late as
+    // possible, that is, at the nearest common ancestor of all the continue
+    // sites in the body.  However, that is difficult to compute here, so it
+    // is instead placed just outside the body of the body continuation.
+    bool hasContinues = !continueCollector.isEmpty;
+    IrBuilder updateBuilder = hasContinues
+        ? new IrBuilder.recursive(condBuilder)
+        : bodyBuilder;
     for (ast.Node n in node.update) {
-      if (!bodyBuilder.isOpen) break;
-      bodyBuilder.visit(n);
+      if (!updateBuilder.isOpen) break;
+      updateBuilder.visit(n);
     }
 
-    // Create body entry and loop exit continuations and a join-point
-    // continuation if control flow reaches the end of the body (update).
+    // Create body entry and loop exit continuations and a branch to them.
     ir.Continuation bodyContinuation = new ir.Continuation([]);
     ir.Continuation exitContinuation = new ir.Continuation([]);
-    condBuilder.add(
+    ir.LetCont branch =
         new ir.LetCont(exitContinuation,
             new ir.LetCont(bodyContinuation,
                 new ir.Branch(new ir.IsTrue(condition),
                               bodyContinuation,
-                              exitContinuation))));
-    List<ir.Parameter> parameters = condBuilder.parameters;
-    ir.Continuation loopContinuation = new ir.Continuation(parameters);
-    if (bodyBuilder.isOpen) {
-      invokeRecursiveJoin(loopContinuation, [bodyBuilder]);
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder.current = branch;
+    } else {
+      condBuilder.add(branch);
     }
-    bodyContinuation.body = bodyBuilder.root;
+    ir.Continuation continueContinuation;
+    if (hasContinues) {
+      // If there are continues in the body, we need a named continue
+      // continuation as a join point.
+      continueContinuation = new ir.Continuation(updateBuilder.parameters);
+      if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+      invokeFullJoin(continueContinuation, continueCollector);
+    }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder.parameters);
+    if (updateBuilder.isOpen) {
+      JumpCollector backEdges = new JumpCollector(null);
+      backEdges.addJump(updateBuilder);
+      invokeFullJoin(loopContinuation, backEdges, recursive: true);
+    }
+
+    // Fill in the body and possible continue continuation bodies.  Do this
+    // only after it is guaranteed that they are not empty.
+    if (hasContinues) {
+      continueContinuation.body = updateBuilder.root;
+      bodyContinuation.body =
+          new ir.LetCont(continueContinuation, bodyBuilder.root);
+    } else {
+      bodyContinuation.body = bodyBuilder.root;
+    }
 
     loopContinuation.body = condBuilder.root;
     add(new ir.LetCont(loopContinuation,
             new ir.InvokeContinuation(loopContinuation,
                                       environment.index2value)));
-    current = condBuilder.current;
-    environment = condBuilder.environment;
+    if (hasBreaks) {
+      current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      current = letJoin;
+    } else {
+      current = condBuilder.current;
+      environment = condBuilder.environment;
+    }
     return null;
   }
 
@@ -647,8 +816,10 @@
       // There is a join-point continuation.  Build the term
       // 'let cont join(x, ...) = [] in Result' and plug invocations of the
       // join-point continuation into the then and else continuations.
-      joinContinuation =
-          createJoin(environment.length, [thenBuilder, elseBuilder]);
+      JumpCollector jumps = new JumpCollector(null);
+      jumps.addJump(thenBuilder);
+      jumps.addJump(elseBuilder);
+      joinContinuation = createJoin(environment.length, jumps);
       result = new ir.LetCont(joinContinuation, result);
     }
 
@@ -678,49 +849,88 @@
     return null;
   }
 
+  ir.Primitive visitLabeledStatement(ast.LabeledStatement node) {
+    ast.Statement body = node.statement;
+    return body is ast.Loop
+        ? visit(body)
+        : giveup(node, 'labeled statement');
+  }
+
   ir.Primitive visitWhile(ast.While node) {
     assert(isOpen);
-    // While loops use three named continuations: the entry to the body,
-    // the loop exit (break), and the loop back edge (continue).
+    // While loops use four named continuations: the entry to the body, the
+    // loop exit, the loop back edge (continue), and the loop exit (break).
     // The CPS translation of [[while (condition) body; successor]] is:
     //
-    // let cont loop(x, ...) =
+    // let cont continue(x, ...) =
     //     let prim cond = [[condition]] in
-    //     let cont exit() = [[successor]] in
+    //     let cont break() = [[successor]] in
+    //     let cont exit() = break(v, ...) in
     //     let cont body() = [[body]]; continue(v, ...) in
     //     branch cond (body, exit) in
-    // loop(v, ...)
+    // continue(v, ...)
+    //
+    // If there are no breaks in the body, the break continuation is inlined
+    // in the exit continuation (i.e., the translation of the successor
+    // statement occurs in the exit continuation).
 
     // The condition and body are delimited.
     IrBuilder condBuilder = new IrBuilder.recursive(this);
     ir.Primitive condition = condBuilder.visit(node.condition);
 
+    JumpTarget target = elements.getTargetDefinition(node);
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    breakCollectors.add(breakCollector);
+    continueCollectors.add(continueCollector);
+
     IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
     bodyBuilder.visit(node.body);
+    assert(breakCollectors.last == breakCollector);
+    assert(continueCollectors.last == continueCollector);
+    breakCollectors.removeLast();
+    continueCollectors.removeLast();
 
-    // Create body entry and loop exit continuations and a join-point
-    // continuation if control flow reaches the end of the body.
+    // Create body entry and loop exit continuations and a branch to them.
     ir.Continuation bodyContinuation = new ir.Continuation([]);
     ir.Continuation exitContinuation = new ir.Continuation([]);
-    condBuilder.add(
+    ir.LetCont branch =
         new ir.LetCont(exitContinuation,
             new ir.LetCont(bodyContinuation,
                 new ir.Branch(new ir.IsTrue(condition),
                               bodyContinuation,
-                              exitContinuation))));
-    List<ir.Parameter> parameters = condBuilder.parameters;
-    ir.Continuation loopContinuation = new ir.Continuation(parameters);
-    if (bodyBuilder.isOpen) {
-      invokeRecursiveJoin(loopContinuation, [bodyBuilder]);
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder.current = branch;
+    } else {
+      condBuilder.add(branch);
     }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder.parameters);
+    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+    invokeFullJoin(loopContinuation, continueCollector, recursive: true);
     bodyContinuation.body = bodyBuilder.root;
 
     loopContinuation.body = condBuilder.root;
     add(new ir.LetCont(loopContinuation,
             new ir.InvokeContinuation(loopContinuation,
                                       environment.index2value)));
-    current = condBuilder.current;
-    environment = condBuilder.environment;
+    if (hasBreaks) {
+      current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      current = letJoin;
+    } else {
+      current = condBuilder.current;
+      environment = condBuilder.environment;
+    }
     return null;
   }
 
@@ -804,8 +1014,11 @@
     assert(environment.length == elseBuilder.environment.length);
     thenBuilder.environment.extend(null, thenValue);
     elseBuilder.environment.extend(null, elseValue);
+    JumpCollector jumps = new JumpCollector(null);
+    jumps.addJump(thenBuilder);
+    jumps.addJump(elseBuilder);
     ir.Continuation joinContinuation =
-        createJoin(environment.length + 1, [thenBuilder, elseBuilder]);
+        createJoin(environment.length + 1, jumps);
 
     // Build the term
     //   let cont join(x, ..., result) = [] in
@@ -1155,8 +1368,12 @@
 
     // Wire up two continuations for the left subexpression, two continuations
     // for the right subexpression, and a three-way join continuation.
-    ir.Continuation joinContinuation = createJoin(environment.length + 1,
-        [emptyBuilder, rightTrueBuilder, rightFalseBuilder]);
+    JumpCollector jumps = new JumpCollector(null);
+    jumps.addJump(emptyBuilder);
+    jumps.addJump(rightTrueBuilder);
+    jumps.addJump(rightFalseBuilder);
+    ir.Continuation joinContinuation =
+        createJoin(environment.length + 1, jumps);
     ir.Continuation leftTrueContinuation = new ir.Continuation([]);
     ir.Continuation leftFalseContinuation = new ir.Continuation([]);
     ir.Continuation rightTrueContinuation = new ir.Continuation([]);
@@ -1215,13 +1432,13 @@
       assert(node.arguments.tail.isEmpty);
       return buildNegation(visitDynamicSend(node));
     }
-    if (op.source == "is" || op.source == "as") {
-      DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
-      ir.Primitive receiver = visit(node.receiver);
-      ir.Primitive check = continueWithExpression(
-          (k) => new ir.TypeOperator(op.source, receiver, type, k));
-      return node.isIsNotCheck ? buildNegation(check) : check;
-    }
+    assert(invariant(node, op.source == "is" || op.source == "as",
+           message: "unexpected operator $op"));
+    DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+    ir.Primitive receiver = visit(node.receiver);
+    ir.Primitive check = continueWithExpression(
+        (k) => new ir.TypeOperator(op.source, receiver, type, k));
+    return node.isIsNotCheck ? buildNegation(check) : check;
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
@@ -1231,7 +1448,9 @@
     Element element = elements[node];
     assert(!element.isConstructor);
     // TODO(lry): support foreign functions.
-    if (element.isForeign(compiler)) return giveup(node, 'StaticSend: foreign');
+    if (element.isForeign(compiler.backend)) {
+      return giveup(node, 'StaticSend: foreign');
+    }
 
     Selector selector = elements.getSelector(node);
 
@@ -1306,9 +1525,13 @@
         (ast.Operator.INCREMENT_OPERATORS.contains(op.source) ? 0 : 1)
             == node.argumentCount());
 
-    ast.Node assignArg = selector.isIndexSet
-        ? node.arguments.tail.head
-        : node.arguments.head;
+    ast.Node getAssignArgument() {
+      assert(invariant(node, !node.arguments.isEmpty,
+                       message: "argument expected"));
+      return selector.isIndexSet
+          ? node.arguments.tail.head
+          : node.arguments.head;
+    }
 
     // Get the value into valueToStore
     if (op.source == "=") {
@@ -1318,7 +1541,7 @@
       } else if (element == null || Elements.isInstanceField(element)) {
         receiver = visitReceiver(node.receiver);
       }
-      valueToStore = visit(assignArg);
+      valueToStore = visit(getAssignArgument());
     } else {
       // Get the original value into getter
       assert(ast.Operator.COMPLEX_OPERATORS.contains(op.source));
@@ -1334,7 +1557,7 @@
         arg = makePrimConst(constantSystem.createInt(1));
         add(new ir.LetPrim(arg));
       } else {
-        arg = visit(assignArg);
+        arg = visit(getAssignArgument());
       }
       valueToStore = new ir.Parameter(null);
       ir.Continuation k = new ir.Continuation([valueToStore]);
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
index 2051c54..101dd80 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
@@ -12,7 +12,6 @@
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../dart_types.dart' show DartType, GenericType;
 import 'const_expression.dart';
-import '../helpers/helpers.dart';
 
 abstract class Node {
   static int hashCount = 0;
@@ -132,13 +131,13 @@
 /// During one-pass construction a LetCont with an empty continuation body is
 /// used to represent the one-level context 'let cont k(v) = [] in E'.
 class LetCont extends Expression implements InteriorNode {
-  final Continuation continuation;
+  Continuation continuation;
   Expression body;
 
   LetCont(this.continuation, this.body);
 
   Expression plug(Expression expr) {
-    assert(continuation.body == null);
+    assert(continuation != null && continuation.body == null);
     return continuation.body = expr;
   }
 
@@ -387,8 +386,8 @@
 
 /// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
-  final Reference continuation;
-  final List<Reference> arguments;
+  Reference continuation;
+  List<Reference> arguments;
 
   // An invocation of a continuation is recursive if it occurs in the body of
   // the continuation itself.
@@ -404,6 +403,16 @@
     if (recursive) cont.isRecursive = true;
   }
 
+  /// A continuation invocation whose target and arguments will be filled
+  /// in later.
+  ///
+  /// Used as a placeholder for a jump whose target is not yet created
+  /// (e.g., in the translation of break and continue).
+  InvokeContinuation.uninitialized({recursive: false})
+      : continuation = null,
+        arguments = null,
+        isRecursive = recursive;
+
   accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/optimizers.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/optimizers.dart
index baf059b..533dac9 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/optimizers.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/optimizers.dart
@@ -4,8 +4,15 @@
 
 library dart2js.optimizers;
 
+import '../elements/elements.dart' show ClassElement;
+import '../tree/tree.dart' show LiteralDartString;
+import '../util/util.dart';
+import '../dart_types.dart' as types;
+import '../dart2jslib.dart' as dart2js;
+import 'const_expression.dart' show ConstExp, PrimitiveConstExp;
 import 'cps_ir_nodes.dart';
 
+part 'constant_propagation.dart';
 part 'redundant_phi.dart';
 part 'shrinking_reductions.dart';
 
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/redundant_phi.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/redundant_phi.dart
index 7cc0bba..fbf207d 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/redundant_phi.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/redundant_phi.dart
@@ -13,18 +13,14 @@
 /// continuation signature, all invocations, and replaced within the
 /// continuation body.
 class RedundantPhiEliminator extends RecursiveVisitor implements Pass {
-  final Map<Continuation, List<InvokeContinuation>> cont2invokes =
-      <Continuation, List<InvokeContinuation>>{};
-  // For each reference r used in a continuation invocation i, stores the
-  // corresponding continuation i.continuation. If required by other passes,
-  // we could consider adding parent pointers to references instead.
-  final Map<Reference, Continuation> ref2cont = <Reference, Continuation>{};
   final Set<Continuation> workSet = new Set<Continuation>();
 
   void rewrite(final FunctionDefinition root) {
+    // Set all parent pointers.
+    new _ParentVisitor().visit(root);
+
     // Traverse the tree once to build the work set.
     visit(root);
-    workSet.addAll(cont2invokes.keys);
 
     // Process each continuation one-by-one.
     while (workSet.isNotEmpty) {
@@ -35,17 +31,30 @@
         continue; // Skip function return continuations.
       }
 
-      List<InvokeContinuation> invokes = cont2invokes[cont];
-      assert(invokes != null);
-
-      _processContinuation(cont, invokes);
+      _processContinuation(cont);
     }
   }
 
-  /// Called for each continuation on the work set, together with its
-  /// invocations.
-  void _processContinuation(Continuation cont,
-                            List<InvokeContinuation> invokes) {
+  /// Called for each continuation on the work set. Modifies the IR graph if
+  /// [cont] is a candidate for redundant phi elimination.
+  void _processContinuation(Continuation cont) {
+    // Generate the list of all cont invocations. If cont is used in any other
+    // context (i.e. as a continuation of InvokeMethod), it is not possible to
+    // optimize.
+    List<InvokeContinuation> invokes = <InvokeContinuation>[];
+    for (Reference ref = cont.firstRef; ref != null; ref = ref.next) {
+      Node parent = ref.parent;
+      if (parent is InvokeContinuation && ref == parent.continuation) {
+        invokes.add(parent);
+      } else {
+        return; // Can't optimize.
+      }
+    }
+
+    if (invokes.isEmpty) {
+      return; // Continuation is never invoked, can't optimize.
+    }
+
     /// Returns the unique definition of parameter i if it exists and null
     /// otherwise. A definition is unique if it is the only value used to
     /// invoke the continuation, excluding feedback.
@@ -92,10 +101,12 @@
       // we might introduce new optimization opportunities.
       for (Reference ref = oldDefinition.firstRef; ref != null;
            ref = ref.next) {
-        Continuation thatCont = ref2cont[ref];
-        // thatCont is null if ref does not belong to a continuation invocation.
-        if (thatCont != null && thatCont != cont) {
-          workSet.add(thatCont);
+        Node parent = ref.parent;
+        if (parent is InvokeContinuation) {
+          Continuation thatCont = parent.continuation.definition;
+          if (thatCont != cont) {
+            workSet.add(thatCont);
+          }
         }
       }
 
@@ -108,6 +119,16 @@
       for (InvokeContinuation invoke in invokes) {
         invoke.arguments[src].unlink();
       }
+
+      // Finally, if the substituted definition is not in scope of the affected
+      // continuation, move the continuation binding. This is safe to do since
+      // the continuation is referenced only as the target in continuation
+      // invokes, and all such invokes must be within the scope of
+      // [uniqueDefinition]. Note that this is linear in the depth of
+      // the binding of [uniqueDefinition].
+      LetCont letCont = cont.parent;
+      assert(letCont != null);
+      _moveIntoScopeOf(letCont, uniqueDefinition);
     }
 
     // Remove trailing items from parameter and argument lists.
@@ -117,18 +138,41 @@
     }
   }
 
-  void visitInvokeContinuation(InvokeContinuation node) {
-    // Update the continuation map.
-    Continuation cont = node.continuation.definition;
-    assert(cont != null);
-    cont2invokes.putIfAbsent(cont, () => <InvokeContinuation>[])
-        .add(node);
-
-    // And the reference map.
-    node.arguments.forEach((Reference ref) {
-      assert(!ref2cont.containsKey(ref));
-      ref2cont[ref] = node.continuation.definition;
-    });
+  void processLetCont(LetCont node) {
+    workSet.add(node.continuation);
   }
 }
 
+/// Returns true, iff [letCont] is not scope of [definition].
+/// Linear in the depth of definition within the IR graph.
+bool _isInScopeOf(LetCont letCont, Definition definition) {
+  for (Node node = definition.parent; node != null; node = node.parent) {
+    if (node == letCont) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+/// Moves [letCont] below the binding of [definition] within the IR graph.
+/// Does nothing if [letCont] is already within the scope of [definition].
+/// Assumes that one argument is nested within the scope of the other
+/// when this method is called.
+void _moveIntoScopeOf(LetCont letCont, Definition definition) {
+  if (_isInScopeOf(letCont, definition)) return;
+
+  // Remove the continuation binding from its current spot.
+  InteriorNode parent = letCont.parent;
+  parent.body = letCont.body;
+  letCont.body.parent = parent;
+
+  // Insert it just below the binding of definition.
+  InteriorNode binding = definition.parent;
+
+  letCont.body = binding.body;
+  binding.body.parent = letCont;
+
+  binding.body = letCont;
+  letCont.parent = binding;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 69ead07..80b0548 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -23,7 +23,7 @@
          VoidElementX,
          AnalyzableElement,
          DeferredLoaderGetterElementX;
-import 'helpers/helpers.dart';
+import 'helpers/helpers.dart';  // Included for debug helpers.
 import 'js_backend/js_backend.dart' as js_backend;
 import 'library_loader.dart'
     show LibraryLoader,
@@ -36,6 +36,7 @@
 import 'universe/universe.dart';
 import 'util/util.dart';
 import 'util/characters.dart' show $_;
+import 'ordered_typeset.dart';
 import '../compiler.dart' as api;
 import 'patch_parser.dart';
 import 'types/types.dart' as ti;
@@ -72,7 +73,6 @@
 part 'enqueue.dart';
 part 'resolved_visitor.dart';
 part 'script.dart';
-part 'tree_validator.dart';
 part 'typechecker.dart';
 part 'warnings.dart';
 part 'world.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 76dd811..ae2cca4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -23,10 +23,9 @@
   final bool stripAsserts;
   // TODO(antonm): make available from command-line options.
   final bool outputAst = false;
-  final Map<Node, String> renames;
-  final Map<LibraryElement, String> imports;
   final Map<ClassNode, List<Node>> memberNodes;
-  Map<Element, LibraryElement> reexportingLibraries;
+
+  PlaceholderRenamer placeholderRenamer;
 
   // TODO(zarah) Maybe change this to a command-line option.
   // Right now, it is set by the tests.
@@ -105,10 +104,7 @@
 
   DartBackend(Compiler compiler, List<String> strips)
       : tasks = <CompilerTask>[],
-        renames = new Map<Node, String>(),
-        imports = new Map<LibraryElement, String>(),
         memberNodes = new Map<ClassNode, List<Node>>(),
-        reexportingLibraries = <Element, LibraryElement>{},
         forceStripTypes = strips.indexOf('types') != -1,
         stripAsserts = strips.indexOf('asserts') != -1,
         constantCompilerTask  = new DartConstantTask(compiler),
@@ -159,6 +155,10 @@
     // however as of today there are problems with names of some core library
     // interfaces, most probably for interfaces of literals.
     final fixedMemberNames = new Set<String>();
+
+    Map<Element, LibraryElement> reexportingLibraries =
+        <Element, LibraryElement>{};
+
     for (final library in compiler.libraryLoader.libraries) {
       if (!library.isPlatformLibrary) continue;
       library.forEachLocalMember((Element element) {
@@ -183,6 +183,7 @@
         // those names.
         fixedMemberNames.add(element.name);
       });
+
       for (Element export in library.exports) {
         if (!library.isInternalLibrary &&
             export.library.isInternalLibrary) {
@@ -228,8 +229,10 @@
       } else {
         cps_ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
         // Transformations on the CPS IR.
+        compiler.tracer.traceCompilation(element.name, null, compiler); 
+        new ConstantPropagator(compiler, constantSystem).rewrite(function);
+        compiler.tracer.traceGraph("Sparse constant propagation", function);
         new RedundantPhiEliminator().rewrite(function);
-        compiler.tracer.traceCompilation(element.name, null, compiler);
         compiler.tracer.traceGraph("Redundant phi elimination", function);
         new ShrinkingReducer().rewrite(function);
         compiler.tracer.traceGraph("Shrinking reductions", function);
@@ -398,15 +401,17 @@
     bool shouldCutDeclarationTypes = forceStripTypes
         || (compiler.enableMinification
             && isSafeToRemoveTypeDeclarations(classMembers));
-    renamePlaceholders(
-        compiler, collector, renames, imports,
-        fixedMemberNames, reexportingLibraries,
-        shouldCutDeclarationTypes,
-        uniqueGlobalNaming: useMirrorHelperLibrary);
+
+    placeholderRenamer =
+        new PlaceholderRenamer(compiler, fixedMemberNames, reexportingLibraries,
+            cutDeclarationTypes: shouldCutDeclarationTypes);
+
+    placeholderRenamer.computeRenames(collector);
 
     // Sort elements.
-    final sortedTopLevels = sortElements(topLevelElements);
-    final sortedClassMembers = new Map<ClassElement, List<Element>>();
+    final List<Element> sortedTopLevels = sortElements(topLevelElements);
+    final Map<ClassElement, List<Element>> sortedClassMembers =
+        new Map<ClassElement, List<Element>>();
     classMembers.forEach((classElement, members) {
       sortedClassMembers[classElement] = sortElements(members);
     });
@@ -432,7 +437,7 @@
       return;
     }
 
-    final topLevelNodes = <Node>[];
+    final List<Node> topLevelNodes = <Node>[];
     for (final element in sortedTopLevels) {
       topLevelNodes.add(elementAsts[element].ast);
       if (element.isClass && !element.isMixinApplication) {
@@ -445,18 +450,35 @@
     }
 
     if (useMirrorHelperLibrary) {
-      mirrorRenamer.addRenames(renames, topLevelNodes, collector);
+      mirrorRenamer.addRenames(placeholderRenamer.renames,
+                               topLevelNodes, collector);
     }
 
-    final unparser = new EmitterUnparser(renames, stripTypes: forceStripTypes,
-        minify: compiler.enableMinification);
-    emitCode(unparser, imports, topLevelNodes, memberNodes);
-    String assembledCode = unparser.result;
-    compiler.outputProvider('', 'dart')
-        ..add(assembledCode)
-        ..close();
-    compiler.assembledCode = assembledCode;
+    final EmitterUnparser unparser =
+        new EmitterUnparser(placeholderRenamer.renames,
+                            stripTypes: forceStripTypes,
+                            minify: compiler.enableMinification);
+    for (LibraryElement library in placeholderRenamer.platformImports) {
+      if (library.isPlatformLibrary && !library.isInternalLibrary) {
+        unparser.unparseImportTag(library.canonicalUri.toString());
+      }
+    }
+    for (int i = 0; i < sortedTopLevels.length; i++) {
+      Element element = sortedTopLevels[i];
+      Node node = topLevelNodes[i];
+      if (node is ClassNode) {
+        // TODO(smok): Filter out default constructors here.
+        unparser.unparseClassWithBody(node, memberNodes[node]);
+      } else {
+        unparser.unparse(node);
+      }
+      unparser.newline();
+    }
 
+    compiler.assembledCode = unparser.result;
+    compiler.outputProvider("", "dart")
+         ..add(compiler.assembledCode)
+         ..close();
     // Output verbose info about size ratio of resulting bundle to all
     // referenced non-platform sources.
     logResultBundleSizeInfo(topLevelElements);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
index 11b10eb..3e9947a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
@@ -415,7 +415,7 @@
     Statement body = new Block(statementBuffer);
     Statement statement = new While(new Literal(new dart2js.TrueConstant()),
                                     body);
-    if (usedLabels.remove(stmt.label.name)) {
+    if (usedLabels.remove(stmt.label)) {
       statement = new LabeledStatement(stmt.label.name, statement);
     }
     savedBuffer.add(statement);
@@ -436,7 +436,7 @@
     Statement body = new Block(statementBuffer);
     Statement statement;
     statement = new While(condition, body);
-    if (usedLabels.remove(stmt.label.name)) {
+    if (usedLabels.remove(stmt.label)) {
       statement = new LabeledStatement(stmt.label.name, statement);
     }
     savedBuffer.add(statement);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
index d8af695..4c201e3 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
@@ -518,6 +518,7 @@
           null,
           makeIdentifier(exp.name));
       setElement(result, exp.element, exp);
+      setType(result, exp.element.type, exp);
     } else if (exp is StringConcat) {
       precedence = PRIMARY;
       result = unparseStringLiteral(exp);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
index 7c58bad..1ec8d2a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
@@ -5,6 +5,7 @@
 library dart_backend;
 
 import 'dart:async' show Future;
+import 'dart:math' show max;
 import '../elements/elements.dart';
 import '../elements/modelx.dart' show SynthesizedConstructorElementX;
 import '../dart2jslib.dart';
@@ -32,6 +33,5 @@
                                          IDENTIFIER_INFO;
 
 part 'backend.dart';
-part 'emitter.dart';
 part 'renamer.dart';
 part 'placeholder_collector.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
deleted file mode 100644
index b4a1280..0000000
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart
+++ /dev/null
@@ -1,25 +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.
-
-part of dart_backend;
-
-void emitCode(
-      Unparser unparser,
-      Map<LibraryElement, String> imports,
-      Iterable<Node> topLevelNodes,
-      Map<ClassNode, Iterable<Node>> classMembers) {
-  imports.forEach((libraryElement, prefix) {
-    unparser.unparseImportTag('${libraryElement.canonicalUri}', prefix);
-  });
-
-  for (final node in topLevelNodes) {
-    if (node is ClassNode) {
-      // TODO(smok): Filter out default constructors here.
-      unparser.unparseClassWithBody(node, classMembers[node]);
-    } else {
-      unparser.unparse(node);
-    }
-    unparser.newline();
-  }
-}
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 40fb6ea..3dfbe0b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -25,14 +25,10 @@
 }
 
 class ConstructorPlaceholder {
-  final Node node;
-  final DartType type;
-  final bool isRedirectingCall;
-  ConstructorPlaceholder(this.node, this.type)
-      : this.isRedirectingCall = false;
-  // Note: factory redirection is not redirecting call!
-  ConstructorPlaceholder.redirectingCall(this.node)
-      : this.type = null, this.isRedirectingCall = true;
+  final Identifier node;
+  final ConstructorElement element;
+
+  ConstructorPlaceholder(this.node, this.element);
 }
 
 class DeclarationTypePlaceholder {
@@ -56,7 +52,7 @@
   visitSuperSend(Send node) {
     Element element = elements[node];
     if (element != null && element.isConstructor) {
-      collector.makeRedirectingConstructorPlaceholder(node.selector, element);
+      collector.tryMakeConstructorPlaceholder(node, element);
     } else {
       collector.tryMakeMemberPlaceholder(node.selector);
     }
@@ -86,7 +82,7 @@
       return;
     } else if (element.isPrefix) {
       // Node is prefix part in case of source 'lib.somesetter = 5;'
-      collector.makeNullPlaceholder(node);
+      collector.makeErasePrefixPlaceholder(node);
     } else if (Elements.isStaticOrTopLevel(element)) {
       // Unqualified or prefixed top level or static.
       collector.makeElementPlaceholder(node.selector, element);
@@ -110,7 +106,7 @@
   }
 
   visitStaticSend(Send node) {
-    final element = elements[node];
+    Element element = elements[node];
     collector.backend.registerStaticSend(element, node);
 
     if (Elements.isUnresolved(element)
@@ -124,7 +120,7 @@
       if (node.receiver is Identifier
           && node.receiver.asIdentifier().isThis()) {
         assert(node.selector is Identifier);
-        collector.makeRedirectingConstructorPlaceholder(node.selector, element);
+        collector.tryMakeConstructorPlaceholder(node, element);
       }
       return;
     }
@@ -134,7 +130,7 @@
     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);
+      collector.makeErasePrefixPlaceholder(node.receiver);
     }
   }
 
@@ -143,13 +139,17 @@
   }
 
   visitTypePrefixSend(Send node) {
-    collector.makeElementPlaceholder(node.selector, elements[node]);
+    collector.makeElementPlaceholder(node, elements[node]);
   }
 
   visitTypeLiteralSend(Send node) {
     DartType type = elements.getTypeLiteralType(node);
     if (!type.isDynamic) {
-      collector.makeElementPlaceholder(node.selector, type.element);
+      if (type is TypeVariableType) {
+        collector.makeTypeVariablePlaceholder(node.selector, type);
+      } else {
+        collector.makeTypePlaceholder(node.selector, type);
+      }
     }
   }
 }
@@ -158,14 +158,19 @@
   final Compiler compiler;
   final Set<String> fixedMemberNames; // member names which cannot be renamed.
   final Map<Element, ElementAst> elementAsts;
-  final Set<Node> nullNodes;  // Nodes that should not be in output.
-  final Set<Node> unresolvedNodes;
-  final Map<Element, Set<Node>> elementNodes;
-  final Map<FunctionElement, FunctionScope> functionScopes;
-  final Map<LibraryElement, Set<Identifier>> privateNodes;
-  final List<DeclarationTypePlaceholder> declarationTypePlaceholders;
-  final Map<String, Set<Identifier>> memberPlaceholders;
-  final Map<Element, List<ConstructorPlaceholder>> constructorPlaceholders;
+  final Set<Node> prefixNodesToErase = new Set<Node>();
+  final Set<Node> unresolvedNodes = new Set<Node>();
+  final Map<Element, Set<Node>> elementNodes = new Map<Element, Set<Node>>();
+  final Map<FunctionElement, FunctionScope> functionScopes
+      = new Map<FunctionElement, FunctionScope>();
+  final Map<LibraryElement, Set<Identifier>> privateNodes =
+      new Map<LibraryElement, Set<Identifier>>();
+  final List<DeclarationTypePlaceholder> declarationTypePlaceholders
+      = new List<DeclarationTypePlaceholder>();
+  final Map<String, Set<Identifier>> memberPlaceholders
+      = new Map<String, Set<Identifier>>();
+  final List<ConstructorPlaceholder> constructorPlaceholders
+      = new List<ConstructorPlaceholder>();
   Map<String, LocalPlaceholder> currentLocalPlaceholders;
   Element currentElement;
   FunctionElement topmostEnclosingFunction;
@@ -178,23 +183,14 @@
   get currentFunctionScope => functionScopes.putIfAbsent(
       topmostEnclosingFunction, () => new FunctionScope());
 
-  PlaceholderCollector(this.compiler, this.fixedMemberNames, this.elementAsts) :
-      nullNodes = new Set<Node>(),
-      unresolvedNodes = new Set<Node>(),
-      elementNodes = new Map<Element, Set<Node>>(),
-      functionScopes = new Map<FunctionElement, FunctionScope>(),
-      privateNodes = new Map<LibraryElement, Set<Identifier>>(),
-      declarationTypePlaceholders = new List<DeclarationTypePlaceholder>(),
-      memberPlaceholders = new Map<String, Set<Identifier>>(),
-      constructorPlaceholders =
-          new Map<Element, List<ConstructorPlaceholder>>();
+  PlaceholderCollector(this.compiler, this.fixedMemberNames, this.elementAsts);
 
   void collectFunctionDeclarationPlaceholders(
       FunctionElement element, FunctionExpression node) {
     if (element.isConstructor) {
       ConstructorElement constructor = element;
       DartType type = element.enclosingClass.thisType.asRaw();
-      makeConstructorPlaceholder(node.name, element, type);
+      tryMakeConstructorPlaceholder(node.name, element);
       RedirectingFactoryBody bodyAsRedirectingFactoryBody =
           node.body.asRedirectingFactoryBody();
       if (bodyAsRedirectingFactoryBody != null) {
@@ -202,9 +198,9 @@
         FunctionElement redirectTarget = constructor.immediateRedirectionTarget;
         assert(redirectTarget != null && redirectTarget != element);
         type = redirectTarget.enclosingClass.thisType.asRaw();
-        makeConstructorPlaceholder(
+        tryMakeConstructorPlaceholder(
             bodyAsRedirectingFactoryBody.constructorReference,
-            redirectTarget, type);
+            redirectTarget);
       }
     } else if (Elements.isStaticOrTopLevel(element)) {
       // Note: this code should only rename private identifiers for class'
@@ -247,9 +243,12 @@
       assert(element is ClassElement || element is TypedefElement);
     }
     currentLocalPlaceholders = new Map<String, LocalPlaceholder>();
-    compiler.withCurrentElement(element, () {
-      elementNode.accept(this);
-    });
+    if (!(element is ConstructorElement && element.isRedirectingFactory)) {
+      // Do not visit the body of redirecting factories.
+      compiler.withCurrentElement(element, () {
+        elementNode.accept(this);
+      });
+    }
     if (element == backend.mirrorHelperSymbolsMap) {
       backend.registerMirrorHelperElement(element, elementNode);
     }
@@ -272,10 +271,6 @@
       }
       return false;
     }
-
-    // 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) &&
         isNamedOptionalParameter()) {
       currentFunctionScope.registerParameter(node);
@@ -286,7 +281,6 @@
 
   void tryMakeMemberPlaceholder(Identifier node) {
     assert(node != null);
-    if (isPrivateName(node.source)) return;
     if (node is Operator) return;
     final identifier = node.source;
     if (fixedMemberNames.contains(identifier)) return;
@@ -300,12 +294,24 @@
       // Prefix.
       assert(send.receiver is Identifier);
       assert(send.selector is Identifier);
-      makeNullPlaceholder(send.receiver);
+      makeErasePrefixPlaceholder(send.receiver);
       node = send.selector;
     }
     makeElementPlaceholder(node, type.element);
   }
 
+  void makeTypeVariablePlaceholder(Node node, TypeVariableType type) {
+    Send send = node.asSend();
+    if (send != null) {
+      // Prefix.
+      assert(send.receiver is Identifier);
+      assert(send.selector is Identifier);
+      makeErasePrefixPlaceholder(send.receiver);
+      node = send.selector;
+    }
+    tryMakeMemberPlaceholder(node);
+  }
+
   void makeOmitDeclarationTypePlaceholder(TypeAnnotation type) {
     if (type == null) return;
     declarationTypePlaceholders.add(
@@ -324,26 +330,40 @@
         new DeclarationTypePlaceholder(node.type, requiresVar));
   }
 
-  void makeNullPlaceholder(Node node) {
+  /// Marks [node] to be erased in the output.
+  /// This is done for library prefixes because they are not used in the output
+  /// because all imports are flattened and conflicts are renamed away.
+  void makeErasePrefixPlaceholder(Node node) {
     assert(node is Identifier || node is Send);
-    nullNodes.add(node);
+    prefixNodesToErase.add(node);
   }
 
   void makeElementPlaceholder(Node node, Element element) {
     assert(node != null);
     assert(element != null);
+    LibraryElement library = element.library;
     if (identical(element, entryFunction)) return;
-    if (identical(element.library, coreLibrary)) return;
-    if (element.library.isPlatformLibrary && !element.isTopLevel) {
+    if (identical(library, coreLibrary)) return;
+
+    if (library.isPlatformLibrary && !element.isTopLevel) {
       return;
     }
+    if (element.isGetter || element.isSetter) {
+      element = (element as FunctionElement).abstractField;
+    }
     elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node);
   }
 
-  void makePrivateIdentifier(Identifier node) {
-    assert(node != null);
-    privateNodes.putIfAbsent(
-        currentElement.library, () => new Set<Identifier>()).add(node);
+  /// Marks [node] to be renamed per-library if it names an instance member
+  /// and has a private name.
+  void tryMakePrivateIdentifier(Node node, Element element) {
+    if (node is Identifier &&
+        !Elements.isStaticOrTopLevel(element) &&
+        !Elements.isLocal(element) &&
+        isPrivateName(node.source)) {
+      privateNodes.putIfAbsent(
+          currentElement.library, () => new Set<Identifier>()).add(node);
+    }
   }
 
   void makeUnresolvedPlaceholder(Node node) {
@@ -359,20 +379,82 @@
         return localPlaceholder;
       });
     }
-
     getLocalPlaceholder().nodes.add(identifier);
   }
 
-  void makeConstructorPlaceholder(Node node, Element element, DartType type) {
-    assert(type != null);
-    constructorPlaceholders
-        .putIfAbsent(element, () => <ConstructorPlaceholder>[])
-            .add(new ConstructorPlaceholder(node, type));
+  /// Finds the first constructor on the chain of definingConstructor from
+  /// [element] that is not in a synthetic class.
+  Element findDefiningConstructor(ConstructorElement element) {
+    while (element.definingConstructor != null) {
+      element = element.definingConstructor;
+    }
+    return element;
   }
-  void makeRedirectingConstructorPlaceholder(Node node, Element element) {
-    constructorPlaceholders
-        .putIfAbsent(element, () => <ConstructorPlaceholder>[])
-            .add(new ConstructorPlaceholder.redirectingCall(node));
+
+  void tryMakeConstructorPlaceholder(Node node, ConstructorElement element) {
+    if (Elements.isUnresolved(element)) {
+      makeUnresolvedPlaceholder(node);
+      return;
+    }
+    // A library prefix.
+    Node prefix;
+    // The name of the class with the constructor.
+    Node className;
+    // Will be null for unnamed constructors.
+    Identifier constructorName;
+    // First deconstruct the constructor, there are 4 possibilities:
+    //  ClassName()
+    //  prefix.ClassName()
+    //  ClassName.constructorName()
+    //  prefix.ClassName.constructorName()
+    if (node is Send) {
+      if (node.receiver is Send) {
+        Send receiver = node.receiver;
+        // prefix.ClassName.constructorName()
+        assert(treeElements[receiver.receiver] != null &&
+               treeElements[receiver.receiver].isPrefix);
+        prefix = receiver.receiver;
+        className = receiver.selector;
+        constructorName = node.selector;
+      } else {
+        Element receiverElement = treeElements[node.receiver];
+        if (receiverElement != null && receiverElement.isPrefix) {
+          // prefix.ClassName()
+          prefix = node.receiver;
+          className = node.selector;
+        } else {
+          // ClassName.constructorName()
+          className = node.receiver;
+          constructorName = node.selector;
+        }
+      }
+    } else {
+      // ClassName()
+      className = node;
+    }
+
+    if (prefix != null) {
+      makeErasePrefixPlaceholder(prefix);
+    }
+
+    if (className is TypeAnnotation) {
+      visitTypeAnnotation(className);
+    } else if (Elements.isUnresolved(element)) {
+      // We handle unresolved nodes elsewhere.
+    } else if (className.isThis() || className.isSuper()) {
+      // Do not rename super and this.
+    } else if (className is Identifier) {
+      makeElementPlaceholder(className, element.contextClass);
+    } else {
+      throw "Bad type of constructor name $className";
+    }
+
+    if (constructorName != null) {
+      Element definingConstructor = findDefiningConstructor(element);
+      constructorPlaceholders.add(new ConstructorPlaceholder(constructorName,
+          definingConstructor));
+      tryMakePrivateIdentifier(constructorName, element);
+    }
   }
 
   void internalError(String reason, {Node node}) {
@@ -391,7 +473,7 @@
     assert(constructor != null);
     assert(send.receiver == null);
     if (!Elements.isErroneousElement(constructor)) {
-      makeConstructorPlaceholder(node.send.selector, constructor, type);
+      tryMakeConstructorPlaceholder(node.send.selector, constructor);
       // TODO(smok): Should this be in visitNamedArgument?
       // Field names can be exposed as names of optional arguments, e.g.
       // class C {
@@ -423,6 +505,8 @@
   }
 
   visitSend(Send send) {
+    Element element = treeElements[send];
+    tryMakePrivateIdentifier(send.selector, element);
     new SendVisitor(this, treeElements).visitSend(send);
     send.visitChildren(this);
   }
@@ -436,6 +520,7 @@
       // that is needed to rename the construct properly.
       element = treeElements[send.selector];
     }
+    tryMakePrivateIdentifier(send.selector, element);
     if (element == null) {
       if (send.receiver != null) tryMakeMemberPlaceholder(send.selector);
     } else if (!element.isErroneous) {
@@ -463,17 +548,17 @@
     send.visitChildren(this);
   }
 
-  visitIdentifier(Identifier identifier) {
-    if (isPrivateName(identifier.source)) makePrivateIdentifier(identifier);
-  }
-
   visitTypeAnnotation(TypeAnnotation node) {
     final type = treeElements.getType(node);
     assert(invariant(node, type != null,
         message: "Missing type for type annotation: $treeElements"));
     if (!type.isVoid) {
       if (!type.treatAsDynamic) {
-        makeTypePlaceholder(node.typeName, type);
+        if (type is TypeVariableType) {
+          makeTypeVariablePlaceholder(node.typeName, type);
+        } else {
+          makeTypePlaceholder(node.typeName, type);
+        }
       } else if (!type.isDynamic) {
         makeUnresolvedPlaceholder(node.typeName);
       }
@@ -493,7 +578,18 @@
       // TODO(smok): Fix this when resolver correctly deals with
       // such cases.
       if (definitionElement == null) continue;
+
       Send send = definition.asSend();
+      Identifier identifier = definition is Identifier
+          ? definition
+          : definition is Send
+              ? (send.selector is Identifier
+                  ? send.selector
+                  : null)
+              : null;
+
+      tryMakePrivateIdentifier(identifier, definitionElement);
+
       if (send != null) {
         // May get FunctionExpression here in definition.selector
         // in case of A(int this.f());
@@ -528,6 +624,8 @@
     Element element = treeElements[node];
     // May get null here in case of A(int this.f());
     if (element != null) {
+      tryMakePrivateIdentifier(node.name, element);
+
       if (element == backend.mirrorHelperGetNameFunction) {
         backend.registerMirrorHelperElement(element, node);
       }
@@ -542,7 +640,9 @@
         }
       }
     }
+
     node.visitChildren(this);
+
     // Make sure we don't omit return type of methods which names are
     // identifiers, because the following works fine:
     // int interface() => 1;
@@ -584,7 +684,7 @@
     DartType type = treeElements.getType(node);
     assert(invariant(node, type != null,
         message: "Missing type for type variable: $treeElements"));
-    makeTypePlaceholder(node.name, type);
+    makeTypeVariablePlaceholder(node.name, type);
     node.visitChildren(this);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
index ff5b28a..37e9b47 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart
@@ -7,257 +7,222 @@
 Comparator get _compareNodes =>
     compareBy((n) => n.getBeginToken().charOffset);
 
-typedef String _Renamer(Renamable renamable);
-
-abstract class Renamable {
+abstract class Renamable implements Comparable {
   final int RENAMABLE_TYPE_ELEMENT = 1;
   final int RENAMABLE_TYPE_MEMBER = 2;
   final int RENAMABLE_TYPE_LOCAL = 3;
 
   final Set<Node> nodes;
-  final _Renamer renamer;
 
-  Renamable(this.nodes, this.renamer);
+  Renamable(this.nodes);
   int compareTo(Renamable other) {
     int nodesDiff = other.nodes.length.compareTo(this.nodes.length);
     if (nodesDiff != 0) return nodesDiff;
-    int typeDiff = this.getTypeId().compareTo(other.getTypeId());
+    int typeDiff = this.kind.compareTo(other.kind);
     return typeDiff != 0 ? typeDiff : compareInternals(other);
   }
 
   int compareInternals(Renamable other);
-  int getTypeId();
+  int get kind;
 
-  String rename() => renamer(this);
+  String createNewName(PlaceholderRenamer placeholderRenamer);
 }
 
-class ElementRenamable extends Renamable {
-  final Element element;
+class GlobalRenamable extends Renamable {
+  final Entity entity;
 
-  ElementRenamable(this.element, Set<Node> nodes, _Renamer renamer)
-      : super(nodes, renamer);
+  GlobalRenamable(this.entity, Set<Node> nodes)
+      : super(nodes);
 
-  int compareInternals(ElementRenamable other) =>
-      compareElements(this.element, other.element);
-  int getTypeId() => RENAMABLE_TYPE_ELEMENT;
+  int compareInternals(GlobalRenamable other) =>
+      compareElements(this.entity, other.entity);
+  int get kind => RENAMABLE_TYPE_ELEMENT;
+  String createNewName(PlaceholderRenamer placeholderRenamer) {
+    return placeholderRenamer._renameGlobal(entity);
+  }
 }
 
 class MemberRenamable extends Renamable {
   final String identifier;
-  MemberRenamable(this.identifier, Set<Node> nodes, _Renamer renamer)
-      : super(nodes, renamer);
+  MemberRenamable(this.identifier, Set<Node> nodes)
+      : super(nodes);
   int compareInternals(MemberRenamable other) =>
       this.identifier.compareTo(other.identifier);
-  int getTypeId() => RENAMABLE_TYPE_MEMBER;
+  int get kind => RENAMABLE_TYPE_MEMBER;
+  String createNewName(PlaceholderRenamer placeholderRenamer) {
+    return placeholderRenamer._generateMemberName(identifier);
+  }
 }
 
 class LocalRenamable extends Renamable {
-  LocalRenamable(Set<Node> nodes, _Renamer renamer) : super(nodes, renamer);
+  LocalRenamable(Set<Node> nodes)
+      : super(nodes);
   int compareInternals(LocalRenamable other) =>
       _compareNodes(sorted(this.nodes, _compareNodes)[0],
           sorted(other.nodes, _compareNodes)[0]);
-  int getTypeId() => RENAMABLE_TYPE_LOCAL;
+  int get kind => RENAMABLE_TYPE_LOCAL;
+  String createNewName(PlaceholderRenamer placeholderRenamer) {
+    return placeholderRenamer._generateUniqueTopLevelName("");
+  }
 }
 
 /**
- * Renames only top-level elements that would let to ambiguity if not renamed.
+ * Renames only top-level elements that would lead to ambiguity if not renamed.
  */
-void renamePlaceholders(
-    Compiler compiler,
-    PlaceholderCollector placeholderCollector,
-    Map<Node, String> renames,
-    Map<LibraryElement, String> imports,
-    Set<String> fixedMemberNames,
-    Map<Element, LibraryElement> reexportingLibraries,
-    bool cutDeclarationTypes,
-    {bool uniqueGlobalNaming: false}) {
-  final Map<LibraryElement, Map<String, String>> renamed
-      = new Map<LibraryElement, Map<String, String>>();
+class PlaceholderRenamer {
+  /// After running [computeRenames] this will contain the computed renames.
+  final Map<Node, String> renames = new Map<Node, String>();
+  /// After running [computeRenames] this will contain the used platform
+  /// libraries.
+  final Set<LibraryElement> platformImports = new Set<LibraryElement>();
 
-  renameNodes(Iterable<Node> nodes, renamer) {
+  final Compiler _compiler;
+  final Set<String> fixedMemberNames;
+  final Map<Element, LibraryElement> reexportingLibraries;
+  final bool cutDeclarationTypes;
+
+  final Map<Entity, String> _renamedCache = new Map<Entity, String>();
+  final Map<Entity, Map<String, String>> _privateCache =
+      new Map<Entity, Map<String, String>>();
+
+  // Identifiers that has already been used, or are reserved by the
+  // language/platform.
+  Set<String> _forbiddenIdentifiers;
+  Set<String> _allNamedParameterIdentifiers;
+
+  Generator _generator;
+
+  PlaceholderRenamer(this._compiler, this.fixedMemberNames,
+      this.reexportingLibraries, {this.cutDeclarationTypes}) ;
+
+  void _renameNodes(Iterable<Node> nodes, String renamer(Node node)) {
     for (Node node in sorted(nodes, _compareNodes)) {
       renames[node] = renamer(node);
     }
   }
 
-  sortedForEach(Map<Element, dynamic> map, f) {
-    for (Element element in sortElements(map.keys)) {
-      f(element, map[element]);
-    }
+  String _generateUniqueTopLevelName(originalName) {
+    String newName = _generator.generate(originalName, (name) {
+      return _forbiddenIdentifiers.contains(name) ||
+             _allNamedParameterIdentifiers.contains(name);
+    });
+    _forbiddenIdentifiers.add(newName);
+    return newName;
   }
 
-  String renameType(DartType type, Function renameElement) {
-    if (type.isDynamic) return 'dynamic';
-    // TODO(smok): Do not rename type if it is in platform library or
-    // js-helpers.
-    StringBuffer result = new StringBuffer(renameElement(type.element));
-    if (type is GenericType && !type.treatAsRaw) {
-      result.write('<');
-      List<DartType> arguments = type.typeArguments;
-      result.write(renameType(arguments.first, renameElement));
-      for (int index = 1; index < arguments.length; index++) {
-        result.write(',');
-        result.write(renameType(arguments[index], renameElement));
-      }
-      result.write('>');
-    }
-    return result.toString();
+  String _generateMemberName(String original) {
+    return _generator.generate(original, _forbiddenIdentifiers.contains);
   }
 
-  String renameConstructor(Element element, ConstructorPlaceholder placeholder,
-      Function renameString, Function renameElement) {
-    assert(element.isConstructor);
-    StringBuffer result = new StringBuffer();
-    String name = element.name;
-    if (element.name != '') {
-      // Named constructor or factory. Is there a more reliable way to check
-      // this case?
-      if (!placeholder.isRedirectingCall) {
-        result.write(renameType(placeholder.type, renameElement));
-        result.write('.');
-      }
-      if (!element.library.isPlatformLibrary) {
-        name = renameString(element.library, name);
-      }
-      result.write(name);
-    } else {
-      assert(!placeholder.isRedirectingCall);
-      result.write(renameType(placeholder.type, renameElement));
-    }
-    return result.toString();
+  /// Looks up [originalName] in the [_privateCache] cache of [library].
+  /// If [originalName] was not renamed before, generate a new name.
+  String _getPrivateName(LibraryElement library, String originalName) {
+    return _privateCache.putIfAbsent(library, () => new Map<String, String>())
+        .putIfAbsent(originalName,
+                     () => _generateUniqueTopLevelName(originalName));
   }
 
-  Function makeElementRenamer(rename, generateUniqueName) => (element) {
-    assert(Elements.isErroneousElement(element) ||
-           Elements.isStaticOrTopLevel(element) ||
-           element is TypeVariableElement);
+  String _renameConstructor(ConstructorPlaceholder placeholder) {
+    String name = placeholder.element.name;
+    if (name == '') return "";
+    String result = _renameGlobal(placeholder.element);
+    return result;
+  }
+
+  String _renameGlobal(Entity entity) {
+    assert(entity is! Element ||
+           Elements.isErroneousElement(entity) ||
+           Elements.isStaticOrTopLevel(entity) ||
+           entity is TypeVariableElement);
     // TODO(smok): We may want to reuse class static field and method names.
-    String originalName = element.name;
-    LibraryElement library = element.library;
-    if (identical(element.library, compiler.coreLibrary)) {
-      return originalName;
-    }
-    if (library.isPlatformLibrary) {
-      assert(element.isTopLevel);
-      if (reexportingLibraries.containsKey(element)) {
-        library = reexportingLibraries[element];
+    if (entity is Element) {
+      LibraryElement library = entity.library;
+      if (reexportingLibraries.containsKey(entity)) {
+        library = reexportingLibraries[entity];
       }
-      if (!library.isInternalLibrary) {
-        final prefix =
-            imports.putIfAbsent(library, () => generateUniqueName('p'));
-        return '$prefix.$originalName';
+      if (library.isPlatformLibrary) {
+        if (library != _compiler.coreLibrary) {
+          platformImports.add(library);
+        }
+        if (library.isInternalLibrary) {
+          throw new SpannableAssertionFailure(entity,
+              "Internal library $library should never have been imported from "
+              "the code compiled by dart2dart.");
+        }
+        return entity.name;
       }
     }
-
-    return rename(library, originalName);
-  };
-
-  Function makeRenamer(generateUniqueName) =>
-      (library, originalName) =>
-          renamed.putIfAbsent(library, () => {})
-              .putIfAbsent(originalName,
-                  () => generateUniqueName(originalName));
-
-  // Renamer function that takes library and original name and returns a new
-  // name for given identifier.
-  Function rename;
-  Function renameElement;
-  // A function that takes original identifier name and generates a new unique
-  // identifier.
-  Function generateUniqueName;
-
-  Set<String> allNamedParameterIdentifiers = new Set<String>();
-  for (var functionScope in placeholderCollector.functionScopes.values) {
-    allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers);
+    String name = _renamedCache.putIfAbsent(entity,
+            () => _generateUniqueTopLevelName(entity.name));
+    // Look up in [_renamedCache] for a name for [entity] .
+    // If it was not renamed before, generate a new name.
+    return name;
   }
 
-  if (compiler.enableMinification) {
-    MinifyingGenerator generator = new MinifyingGenerator();
-    Set<String> forbiddenIdentifiers = new Set<String>.from(['main']);
-    forbiddenIdentifiers.addAll(Keyword.keywords.keys);
-    forbiddenIdentifiers.addAll(fixedMemberNames);
-    generateUniqueName = (_) =>
-        generator.generate((name) =>
-            forbiddenIdentifiers.contains(name)
-            || allNamedParameterIdentifiers.contains(name));
-    rename = makeRenamer(generateUniqueName);
-    renameElement = makeElementRenamer(rename, generateUniqueName);
-
-    List<Set<Node>> allLocals = new List<Set<Node>>();
+  void _computeMinifiedRenames(PlaceholderCollector placeholderCollector) {
+    _generator = new MinifyingGenerator();
 
     // Build a list sorted by usage of local nodes that will be renamed to
     // the same identifier. So the top-used local variables in all functions
     // will be renamed first and will all share the same new identifier.
-    for (var functionScope in placeholderCollector.functionScopes.values) {
+    int maxLength = placeholderCollector.functionScopes.values.fold(0,
+        (a, b) => max(a, b.localPlaceholders.length));
+
+    List<Set<Node>> allLocals = new List<Set<Node>>
+        .generate(maxLength, (_) => new Set<Node>());
+
+    for (FunctionScope functionScope
+        in placeholderCollector.functionScopes.values) {
       // Add current sorted local identifiers to the whole sorted list
       // of all local identifiers for all functions.
       List<LocalPlaceholder> currentSortedPlaceholders =
           sorted(functionScope.localPlaceholders,
               compareBy((LocalPlaceholder ph) => -ph.nodes.length));
-      List<Set<Node>> currentSortedNodes =
-          currentSortedPlaceholders.map((ph) => ph.nodes).toList();
-      // Make room in all sorted locals list for new stuff.
-      while (currentSortedNodes.length > allLocals.length) {
-        allLocals.add(new Set<Node>());
-      }
+
+      List<Set<Node>> currentSortedNodes = currentSortedPlaceholders
+          .map((LocalPlaceholder ph) => ph.nodes).toList();
+
       for (int i = 0; i < currentSortedNodes.length; i++) {
         allLocals[i].addAll(currentSortedNodes[i]);
       }
     }
 
-    // Rename elements, members and locals together based on their usage count,
-    // otherwise when we rename elements first there will be no good identifiers
-    // left for members even if they are used often.
-    String elementRenamer(ElementRenamable elementRenamable) =>
-        renameElement(elementRenamable.element);
-    String memberRenamer(MemberRenamable memberRenamable) =>
-        generator.generate(forbiddenIdentifiers.contains);
-    Function localRenamer = generateUniqueName;
-    List<Renamable> renamables = [];
+    // Rename elements, members and locals together based on their usage
+    // count, otherwise when we rename elements first there will be no good
+    // identifiers left for members even if they are used often.
+    List<Renamable> renamables = new List<Renamable>();
     placeholderCollector.elementNodes.forEach(
         (Element element, Set<Node> nodes) {
-      renamables.add(new ElementRenamable(element, nodes, elementRenamer));
+      renamables.add(new GlobalRenamable(element, nodes));
     });
     placeholderCollector.memberPlaceholders.forEach(
         (String memberName, Set<Identifier> identifiers) {
-      renamables.add(
-          new MemberRenamable(memberName, identifiers, memberRenamer));
+      renamables.add(new MemberRenamable(memberName, identifiers));
     });
     for (Set<Node> localIdentifiers in allLocals) {
-      renamables.add(new LocalRenamable(localIdentifiers, localRenamer));
+      renamables.add(new LocalRenamable(localIdentifiers));
     }
-    renamables.sort((Renamable renamable1, Renamable renamable2) =>
-        renamable1.compareTo(renamable2));
+    renamables.sort();
     for (Renamable renamable in renamables) {
-      String newName = renamable.rename();
-      renameNodes(renamable.nodes, (_) => newName);
+      String newName = renamable.createNewName(this);
+      _renameNodes(renamable.nodes, (_) => newName);
     }
-  } else {
-    // Never rename anything to 'main'.
-    final usedTopLevelOrMemberIdentifiers = new Set<String>();
-    usedTopLevelOrMemberIdentifiers.add('main');
-    usedTopLevelOrMemberIdentifiers.addAll(fixedMemberNames);
-    generateUniqueName = (originalName) {
-      String newName = conservativeGenerator(
-          originalName, (name) =>
-              usedTopLevelOrMemberIdentifiers.contains(name)
-              || allNamedParameterIdentifiers.contains(name));
-      usedTopLevelOrMemberIdentifiers.add(newName);
-      return newName;
-    };
-    rename = makeRenamer(generateUniqueName);
-    renameElement = makeElementRenamer(rename, generateUniqueName);
+  }
+
+  void _computeNonMinifiedRenames(PlaceholderCollector placeholderCollector) {
+    _generator = new ConservativeGenerator();
     // Rename elements.
-    sortedForEach(placeholderCollector.elementNodes,
+    placeholderCollector.elementNodes.forEach(
         (Element element, Set<Node> nodes) {
-      renameNodes(nodes, (_) => renameElement(element));
+      _renameNodes(nodes, (_) => _renameGlobal(element));
     });
 
     // Rename locals.
-    sortedForEach(placeholderCollector.functionScopes,
+    placeholderCollector.functionScopes.forEach(
         (functionElement, functionScope) {
-      Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders;
+
       Set<String> memberIdentifiers = new Set<String>();
+      Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders;
       if (functionElement.enclosingClass != null) {
         functionElement.enclosingClass.forEachMember(
             (enclosingClass, member) {
@@ -266,46 +231,75 @@
       }
       Set<String> usedLocalIdentifiers = new Set<String>();
       for (LocalPlaceholder placeholder in placeholders) {
-        String nextId =
-            conservativeGenerator(placeholder.identifier, (name) =>
-                functionScope.parameterIdentifiers.contains(name)
-                || usedTopLevelOrMemberIdentifiers.contains(name)
-                || usedLocalIdentifiers.contains(name)
-                || memberIdentifiers.contains(name));
+        String nextId = _generator.generate(placeholder.identifier, (name) {
+          return functionScope.parameterIdentifiers.contains(name)
+              || _forbiddenIdentifiers.contains(name)
+              || usedLocalIdentifiers.contains(name)
+              || memberIdentifiers.contains(name);
+        });
         usedLocalIdentifiers.add(nextId);
-        renameNodes(placeholder.nodes, (_) => nextId);
+        _renameNodes(placeholder.nodes, (_) => nextId);
       }
     });
 
-    final usedMemberIdentifiers = new Set<String>.from(fixedMemberNames);
     // Do not rename members to top-levels, that allows to avoid renaming
     // members to constructors.
-    usedMemberIdentifiers.addAll(usedTopLevelOrMemberIdentifiers);
     placeholderCollector.memberPlaceholders.forEach((identifier, nodes) {
-      String newIdentifier = conservativeGenerator(
-          identifier, usedMemberIdentifiers.contains);
-      renameNodes(nodes, (_) => newIdentifier);
+      String newIdentifier = _generateMemberName(identifier);
+      _renameNodes(nodes, (_) => newIdentifier);
     });
   }
 
-  // Rename constructors.
-  sortedForEach(placeholderCollector.constructorPlaceholders,
-      (Element constructor, List<ConstructorPlaceholder> placeholders) {
-        for (ConstructorPlaceholder ph in placeholders) {
-          renames[ph.node] =
-              renameConstructor(constructor, ph, rename, renameElement);
-        }
-  });
-  sortedForEach(placeholderCollector.privateNodes, (library, nodes) {
-    renameNodes(nodes, (node) => rename(library, node.source));
-  });
-  renameNodes(placeholderCollector.unresolvedNodes,
-      (_) => generateUniqueName('Unresolved'));
-  renameNodes(placeholderCollector.nullNodes, (_) => '');
-  if (cutDeclarationTypes) {
-    for (DeclarationTypePlaceholder placeholder in
-         placeholderCollector.declarationTypePlaceholders) {
-      renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : '';
+  /// Finds renamings for all the placeholders in [placeholderCollector] and
+  /// stores them in [renames].
+  /// Also adds to [platformImports] all the platform-libraries that are used.
+  void computeRenames(PlaceholderCollector placeholderCollector) {
+    _allNamedParameterIdentifiers = new Set<String>();
+    for (FunctionScope functionScope in
+        placeholderCollector.functionScopes.values) {
+      _allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers);
+    }
+
+    _forbiddenIdentifiers = new Set<String>.from(fixedMemberNames);
+    _forbiddenIdentifiers.addAll(Keyword.keywords.keys);
+    _forbiddenIdentifiers.add('main');
+
+    if (_compiler.enableMinification) {
+      _computeMinifiedRenames(placeholderCollector);
+    } else {
+      _computeNonMinifiedRenames(placeholderCollector);
+    }
+
+    // Rename constructors.
+    for (ConstructorPlaceholder placeholder in
+        placeholderCollector.constructorPlaceholders) {
+      renames[placeholder.node] =
+          _renameConstructor(placeholder);
+    };
+
+    // Rename private identifiers uniquely for each library.
+    placeholderCollector.privateNodes.forEach(
+        (LibraryElement library, Set<Identifier> identifiers) {
+      for (Identifier identifier in identifiers) {
+        renames[identifier] = _getPrivateName(library, identifier.source);
+      }
+    });
+
+    // Rename unresolved nodes, to make sure they still do not resolve.
+    for (Node node in placeholderCollector.unresolvedNodes) {
+      renames[node] = _generateUniqueTopLevelName('Unresolved');
+    }
+
+    // Erase prefixes that are now not needed.
+    for (Node node in placeholderCollector.prefixNodesToErase) {
+      renames[node] = '';
+    }
+
+    if (cutDeclarationTypes) {
+      for (DeclarationTypePlaceholder placeholder in
+           placeholderCollector.declarationTypePlaceholders) {
+        renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : '';
+      }
     }
   }
 }
@@ -335,25 +329,29 @@
   return resultBuilder.toString();
 }
 
-
-/** Always tries to return original identifier name unless it is forbidden. */
-String conservativeGenerator(String name, bool isForbidden(String name)) {
-  String result = name;
-  int index = 0;
-  while (isForbidden(result)) {
-    result = '${generateMiniId(index++)}_$name';
-  }
-  return result;
+abstract class Generator {
+  String generate(String originalName, bool isForbidden(String name));
 }
 
+/// Always tries to return original identifier name unless it is forbidden.
+class ConservativeGenerator implements Generator {
+  String generate(String originalName, bool isForbidden(String name)) {
+    String result = originalName;
+    int index = 0;
+    while (isForbidden(result) ){ //|| result == originalName) {
+      result = '${originalName}_${generateMiniId(index++)}';
+    }
+    return result;
+  }
+}
 
-/** Always tries to generate the most compact identifier. */
-class MinifyingGenerator {
+/// Always tries to generate the most compact identifier.
+class MinifyingGenerator implements Generator {
   int index = 0;
 
   MinifyingGenerator();
 
-  String generate(bool isForbidden(String name)) {
+  String generate(String originalName, bool isForbidden(String name)) {
     String result;
     do {
       result = generateMiniId(index++);
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 0c0aa7b..9fa1c43 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -129,7 +129,7 @@
   final Set<OutputUnit> allOutputUnits = new Set<OutputUnit>();
 
   /// Will be `true` if the program contains deferred libraries.
-  bool splitProgram = false;
+  bool isProgramSplit = false;
 
   /// A mapping from the name of a defer import to all the output units it
   /// depends on in a list of lists to be loaded in the order they appear.
@@ -171,7 +171,7 @@
 
   /// Returns the [OutputUnit] where [element] belongs.
   OutputUnit outputUnitForElement(Element element) {
-    if (!splitProgram) return mainOutputUnit;
+    if (!isProgramSplit) return mainOutputUnit;
 
     element = element.implementation;
     while (!_elementToOutputUnit.containsKey(element)) {
@@ -191,7 +191,7 @@
 
   /// Returns the [OutputUnit] where [constant] belongs.
   OutputUnit outputUnitForConstant(Constant constant) {
-    if (!splitProgram) return mainOutputUnit;
+    if (!isProgramSplit) return mainOutputUnit;
 
     return _constantToOutputUnit[constant];
   }
@@ -635,7 +635,7 @@
   }
 
   void onResolutionComplete(FunctionElement main) {
-    if (!splitProgram) {
+    if (!isProgramSplit) {
       allOutputUnits.add(mainOutputUnit);
       return;
     }
@@ -740,7 +740,7 @@
             } else {
               prefixDeferredImport[prefix] = import;
             }
-            splitProgram = true;
+            isProgramSplit = true;
             lastDeferred = import;
           }
           if (prefix != null) {
@@ -758,15 +758,15 @@
       });
     }
     Backend backend = compiler.backend;
-    if (splitProgram && backend is JavaScriptBackend) {
+    if (isProgramSplit && backend is JavaScriptBackend) {
       backend.registerCheckDeferredIsLoaded(compiler.globalDependencies);
     }
-    if (splitProgram && backend is DartBackend) {
+    if (isProgramSplit && backend is DartBackend) {
       // TODO(sigurdm): Implement deferred loading for dart2dart.
       compiler.reportWarning(
           lastDeferred,
           MessageKind.DEFERRED_LIBRARY_DART_2_DART);
-      splitProgram = false;
+      isProgramSplit = false;
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index a5e52e5..7b675ee 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -75,21 +75,17 @@
 }
 
 class ElementToJsonVisitor extends ElementVisitor<Map<String, dynamic>> {
-  GroupedIdMapper mapper = new GroupedIdMapper();
-  Compiler compiler;
+  final GroupedIdMapper mapper = new GroupedIdMapper();
+  final Compiler compiler;
 
-  Map<Element, Map<String, dynamic>> jsonCache = {};
-  Map<Element, jsAst.Expression> codeCache;
+  final Map<Element, Map<String, dynamic>> jsonCache = {};
 
   int programSize;
-  DateTime compilationMoment;
   String dart2jsVersion;
-  Duration compilationDuration;
-  Duration dumpInfoDuration;
 
-  ElementToJsonVisitor(Compiler compiler) {
-    this.compiler = compiler;
+  ElementToJsonVisitor(this.compiler);
 
+  void run() {
     Backend backend = compiler.backend;
     if (backend is JavaScriptBackend) {
       // Add up the sizes of all output-buffers.
@@ -99,16 +95,11 @@
       programSize = compiler.assembledCode.length;
     }
 
-
-    compilationMoment = new DateTime.now();
     dart2jsVersion = compiler.hasBuildId ? compiler.buildId : null;
-    compilationDuration = compiler.totalCompileTime.elapsed;
 
     for (var library in compiler.libraryLoader.libraries.toList()) {
       library.accept(this);
     }
-
-    dumpInfoDuration = new DateTime.now().difference(compilationMoment);
   }
 
   // If keeping the element is in question (like if a function has a size
@@ -192,9 +183,9 @@
     List<String> children = [];
     StringBuffer emittedCode = compiler.dumpInfoTask.codeOf(element);
 
-    // If a field has an empty inferred type it is never used.
     TypeMask inferredType =
-      compiler.typesTask.getGuaranteedTypeOfElement(element);
+        compiler.typesTask.getGuaranteedTypeOfElement(element);
+    // If a field has an empty inferred type it is never used.
     if (inferredType == null || inferredType.isEmpty || element.isConst) {
       return null;
     }
@@ -256,6 +247,16 @@
         if (member is MemberElement) {
           for (Element closure in member.nestedClosures) {
             Map<String, dynamic> child = this.process(closure);
+
+            // Look for the parent element of this closure which should
+            // be a class.  If it exists, set the display name to
+            // the name of the class + the name of the closure function.
+            Element parent = closure.enclosingElement;
+            Map<String, dynamic> processedParent = this.process(parent);
+            if (processedParent != null) {
+              child['name'] = "${processedParent['name']}.${child['name']}";
+            }
+
             if (child != null) {
               size += child['size'];
             }
@@ -325,7 +326,8 @@
         parameters.add({
           'name': parameter.name,
           'type': compiler.typesTask
-            .getGuaranteedTypeOfElement(parameter).toString()
+            .getGuaranteedTypeOfElement(parameter).toString(),
+          'declaredType': parameter.node.type.toString()
         });
       });
       inferredReturnType = compiler.typesTask
@@ -370,6 +372,11 @@
   }
 }
 
+class Selection {
+  final Element selectedElement;
+  final Selector selector;
+  Selection(this.selectedElement, this.selector);
+}
 
 class DumpInfoTask extends CompilerTask {
   DumpInfoTask(Compiler compiler)
@@ -407,15 +414,20 @@
   }
 
   /**
-   * Returns an iterable of [Element]s that are used by
-   * [element].
+   * Returns an iterable of [Selection]s that are used by
+   * [element].  Each [Selection] contains an element that is
+   * used and the selector that selected the element.
    */
-  Iterable<Element> getRetaining(Element element) {
+  Iterable<Selection> getRetaining(Element element) {
     if (!selectorsFromElement.containsKey(element)) {
-      return const <Element>[];
+      return const <Selection>[];
     } else {
       return selectorsFromElement[element].expand(
-          (s) => compiler.world.allFunctions.filter(s));
+        (selector) {
+          return compiler.world.allFunctions.filter(selector).map((element) {
+            return new Selection(element, selector);
+          });
+        });
     }
   }
 
@@ -514,7 +526,7 @@
   }
 
   void collectInfo() {
-    infoCollector = new ElementToJsonVisitor(compiler);
+    infoCollector = new ElementToJsonVisitor(compiler)..run();
   }
 
   void dumpInfo() {
@@ -538,7 +550,7 @@
 
     Map<String, List<String>> holding = <String, List<String>>{};
     for (Element fn in infoCollector.mapper.functions) {
-      Iterable<Element> pulling = getRetaining(fn);
+      Iterable<Selection> pulling = getRetaining(fn);
       // Don't bother recording an empty list of dependencies.
       if (pulling.length > 0) {
         String fnId = infoCollector.idOf(fn);
@@ -546,9 +558,14 @@
         // recorded.  Don't register these.
         if (fnId != null) {
           holding[fnId] = pulling
-            .map((a) => infoCollector.idOf(a))
+            .map((selection) {
+              return <String, String>{
+                "id": infoCollector.idOf(selection.selectedElement),
+                "mask": selection.selector.mask.toString()
+              };
+            })
             // Filter non-null ids for the same reason as above.
-            .where((a) => a != null)
+            .where((a) => a['id'] != null)
             .toList();
         }
       }
@@ -573,7 +590,7 @@
       'elements': infoCollector.toJson(),
       'holding': holding,
       'outputUnits': outputUnits,
-      'dump_version': 2,
+      'dump_version': 3,
     };
 
     Duration toJsonDuration = new DateTime.now().difference(startToJsonTime);
@@ -581,10 +598,10 @@
     Map<String, dynamic> generalProgramInfo = <String, dynamic> {
       'size': infoCollector.programSize,
       'dart2jsVersion': infoCollector.dart2jsVersion,
-      'compilationMoment': infoCollector.compilationMoment.toString(),
-      'compilationDuration': infoCollector.compilationDuration.toString(),
-      'toJsonDuration': toJsonDuration.toString(),
-      'dumpInfoDuration': infoCollector.dumpInfoDuration.toString(),
+      'compilationMoment': new DateTime.now().toString(),
+      'compilationDuration': compiler.totalCompileTime.elapsed.toString(),
+      'toJsonDuration': 0,
+      'dumpInfoDuration': this.timing.toString(),
       'noSuchMethodEnabled': compiler.enabledNoSuchMethod
     };
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index cb0f3c8..936abfc 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -21,6 +21,7 @@
                                  Selector,
                                  Constant,
                                  Compiler,
+                                 Backend,
                                  isPrivateName;
 
 import '../dart_types.dart';
@@ -401,7 +402,7 @@
   String get fixedBackendName;
 
   bool get isAbstract;
-  bool isForeign(Compiler compiler);
+  bool isForeign(Backend backend);
 
   void addMetadata(MetadataAnnotation annotation);
   void setNative(String name);
@@ -738,8 +739,8 @@
     ClassElement cls = constructor.enclosingClass;
     return cls.library == compiler.typedDataLibrary
         && cls.isNative
-        && compiler.world.isSubtype(compiler.typedDataClass, cls)
-        && compiler.world.isSubtype(compiler.listClass, cls)
+        && compiler.world.isSubtypeOf(cls, compiler.typedDataClass)
+        && compiler.world.isSubtypeOf(cls, compiler.listClass)
         && constructor.name == '';
   }
 
@@ -1076,6 +1077,7 @@
   int get optionalParameterCount;
   bool get optionalParametersAreNamed;
   FormalElement get firstOptionalParameter;
+  bool get hasOptionalParameters;
 
   int get parameterCount;
   List<FormalElement> get orderedOptionalParameters;
@@ -1110,6 +1112,7 @@
   /// 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!
+  // TODO(johnniwinther): Rename to `ensureFunctionSignature`.
   @deprecated FunctionSignature computeSignature(Compiler compiler);
 }
 
@@ -1298,8 +1301,8 @@
   void reverseBackendMembers();
 
   Element lookupMember(String memberName);
-  Element lookupSelector(Selector selector, Compiler compiler);
-  Element lookupSuperSelector(Selector selector, Compiler compiler);
+  Element lookupSelector(Selector selector);
+  Element lookupSuperSelector(Selector selector);
 
   Element lookupLocalMember(String memberName);
   Element lookupBackendMember(String memberName);
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 1d7537d..b7c97ed 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -5,7 +5,7 @@
 library elements.modelx;
 
 import 'elements.dart';
-import '../helpers/helpers.dart';
+import '../helpers/helpers.dart';  // Included for debug helpers.
 import '../tree/tree.dart';
 import '../util/util.dart';
 import '../resolution/resolution.dart';
@@ -24,6 +24,7 @@
                                  Selector,
                                  Constant,
                                  Compiler,
+                                 Backend,
                                  isPrivateName;
 
 import '../dart_types.dart';
@@ -245,7 +246,7 @@
   FunctionElement asFunctionElement() => null;
 
   bool get isAbstract => modifiers.isAbstract;
-  bool isForeign(Compiler compiler) => compiler.backend.isForeign(this);
+  bool isForeign(Backend backend) => backend.isForeign(this);
 
   void diagnose(Element context, DiagnosticListener listener) {}
 
@@ -299,7 +300,7 @@
 
   computeEffectiveTargetType(InterfaceType newType) => unsupported();
 
-  get definingConstructor => this;
+  get definingConstructor => null;
 
   FunctionElement asFunctionElement() => this;
 
@@ -1413,6 +1414,7 @@
 
 // TODO(johnniwinther): [FunctionSignature] should be merged with
 // [FunctionType].
+// TODO(karlklose): all these lists should have element type [FormalElement].
 class FunctionSignatureX implements FunctionSignature {
   final Link<Element> requiredParameters;
   final Link<Element> optionalParameters;
@@ -1421,14 +1423,17 @@
   final bool optionalParametersAreNamed;
   final List<Element> orderedOptionalParameters;
   final FunctionType type;
+  final bool hasOptionalParameters;
 
   FunctionSignatureX(this.requiredParameters,
-                     this.optionalParameters,
+                     Link<Element> optionalParameters,
                      this.requiredParameterCount,
                      this.optionalParameterCount,
                      this.optionalParametersAreNamed,
                      this.orderedOptionalParameters,
-                     this.type);
+                     this.type)
+      : optionalParameters = optionalParameters,
+        hasOptionalParameters = !optionalParameters.isEmpty;
 
   void forEachRequiredParameter(void function(Element parameter)) {
     for (Link<Element> link = requiredParameters;
@@ -1530,7 +1535,7 @@
   FunctionSignature computeSignature(Compiler compiler) {
     if (functionSignatureCache != null) return functionSignatureCache;
     compiler.withCurrentElement(this, () {
-      functionSignatureCache = compiler.resolveSignature(this);
+      functionSignatureCache = compiler.resolver.resolveSignature(this);
     });
     return functionSignatureCache;
   }
@@ -1683,7 +1688,7 @@
 
   bool get isClassMember => false;
 
-  bool isForeign(Compiler compiler) => true;
+  bool isForeign(Backend backend) => true;
 
   bool get isSynthesized => true;
 
@@ -2036,16 +2041,15 @@
    * When called on the implementation element both members declared in the
    * origin and the patch class are returned.
    */
-  Element lookupSelector(Selector selector, Compiler compiler) {
-    return internalLookupSelector(selector, compiler, false);
+  Element lookupSelector(Selector selector) {
+    return internalLookupSelector(selector, false);
   }
 
-  Element lookupSuperSelector(Selector selector, Compiler compiler) {
-    return internalLookupSelector(selector, compiler, true);
+  Element lookupSuperSelector(Selector selector) {
+    return internalLookupSelector(selector, true);
   }
 
   Element internalLookupSelector(Selector selector,
-                                 Compiler compiler,
                                  bool isSuperLookup) {
     String name = selector.name;
     bool isPrivate = isPrivateName(name);
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index e296258..2b2dfd4 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -31,10 +31,10 @@
   final String name;
   final Compiler compiler; // TODO(ahe): Remove this dependency.
   final ItemCompilationContextCreator itemCompilationContextCreator;
-  final Map<String, Link<Element>> instanceMembersByName
-      = new Map<String, Link<Element>>();
-  final Map<String, Link<Element>> instanceFunctionsByName
-      = new Map<String, Link<Element>>();
+  final Map<String, Set<Element>> instanceMembersByName
+      = new Map<String, Set<Element>>();
+  final Map<String, Set<Element>> instanceFunctionsByName
+      = new Map<String, Set<Element>>();
   final Set<ClassElement> seenClasses = new Set<ClassElement>();
   Set<ClassElement> recentClasses = new Setlet<ClassElement>();
   final Universe universe = new Universe();
@@ -134,8 +134,8 @@
       if (cls.isNative) {
         compiler.world.registerUsedElement(member);
         nativeEnqueuer.handleFieldAnnotations(member);
-        if (universe.hasInvokedGetter(member, compiler) ||
-            universe.hasInvocation(member, compiler)) {
+        if (universe.hasInvokedGetter(member, compiler.world) ||
+            universe.hasInvocation(member, compiler.world)) {
           nativeEnqueuer.registerFieldLoad(member);
           // In handleUnseenSelector we can't tell if the field is loaded or
           // stored.  We need the basic algorithm to be Church-Rosser, since the
@@ -148,7 +148,7 @@
           addToWorkList(member);
           return;
         }
-        if (universe.hasInvokedSetter(member, compiler)) {
+        if (universe.hasInvokedSetter(member, compiler.world)) {
           nativeEnqueuer.registerFieldStore(member);
           // See comment after registerFieldLoad above.
           nativeEnqueuer.registerFieldLoad(member);
@@ -165,52 +165,57 @@
         return;
       }
     } else if (member.kind == ElementKind.FUNCTION) {
-      if (member.name == Compiler.NO_SUCH_METHOD) {
-        enableNoSuchMethod(member);
+      FunctionElement function = member;
+      function.computeSignature(compiler);
+      if (function.name == Compiler.NO_SUCH_METHOD) {
+        enableNoSuchMethod(function);
       }
-      if (member.name == Compiler.CALL_OPERATOR_NAME &&
+      if (function.name == Compiler.CALL_OPERATOR_NAME &&
           !cls.typeVariables.isEmpty) {
-        registerGenericCallMethod(member, compiler.globalDependencies);
+        registerCallMethodWithFreeTypeVariables(
+            function, compiler.globalDependencies);
       }
       // If there is a property access with the same name as a method we
       // need to emit the method.
-      if (universe.hasInvokedGetter(member, compiler)) {
-        registerClosurizedMember(member, compiler.globalDependencies);
-        addToWorkList(member);
+      if (universe.hasInvokedGetter(function, compiler.world)) {
+        registerClosurizedMember(function, compiler.globalDependencies);
+        addToWorkList(function);
         return;
       }
       // Store the member in [instanceFunctionsByName] to catch
       // getters on the function.
-      Link<Element> members = instanceFunctionsByName.putIfAbsent(
-          memberName, () => const Link<Element>());
-      instanceFunctionsByName[memberName] = members.prepend(member);
-      if (universe.hasInvocation(member, compiler)) {
-        addToWorkList(member);
+      instanceFunctionsByName.putIfAbsent(memberName, () => new Set<Element>())
+          .add(member);
+      if (universe.hasInvocation(function, compiler.world)) {
+        addToWorkList(function);
         return;
       }
     } else if (member.kind == ElementKind.GETTER) {
-      if (universe.hasInvokedGetter(member, compiler)) {
-        addToWorkList(member);
+      FunctionElement getter = member;
+      getter.computeSignature(compiler);
+      if (universe.hasInvokedGetter(getter, compiler.world)) {
+        addToWorkList(getter);
         return;
       }
       // We don't know what selectors the returned closure accepts. If
       // the set contains any selector we have to assume that it matches.
-      if (universe.hasInvocation(member, compiler)) {
-        addToWorkList(member);
+      if (universe.hasInvocation(getter, compiler.world)) {
+        addToWorkList(getter);
         return;
       }
     } else if (member.kind == ElementKind.SETTER) {
-      if (universe.hasInvokedSetter(member, compiler)) {
-        addToWorkList(member);
+      FunctionElement setter = member;
+      setter.computeSignature(compiler);
+      if (universe.hasInvokedSetter(setter, compiler.world)) {
+        addToWorkList(setter);
         return;
       }
     }
 
     // The element is not yet used. Add it to the list of instance
     // members to still be processed.
-    Link<Element> members = instanceMembersByName.putIfAbsent(
-        memberName, () => const Link<Element>());
-    instanceMembersByName[memberName] = members.prepend(member);
+    instanceMembersByName.putIfAbsent(memberName, () => new Set<Element>())
+        .add(member);
   }
 
   void enableNoSuchMethod(Element element) {}
@@ -326,7 +331,7 @@
         // We need to enqueue all members matching this one in subclasses, as
         // well.
         // TODO(herhut): Use TypedSelector.subtype for enqueueing
-        Selector selector = new Selector.fromElement(element, compiler);
+        Selector selector = new Selector.fromElement(element);
         registerSelectorUse(selector);
         if (element.isField) {
           Selector selector =
@@ -443,34 +448,34 @@
     }
   }
 
-  processLink(Map<String, Link<Element>> map,
-              String memberName,
-              bool f(Element e)) {
-    Link<Element> members = map[memberName];
-    if (members != null) {
-      // [f] might add elements to [: map[memberName] :] during the loop below
-      // so we create a new list for [: map[memberName] :] and prepend the
-      // [remaining] members after the loop.
-      map[memberName] = const Link<Element>();
-      LinkBuilder<Element> remaining = new LinkBuilder<Element>();
-      for (; !members.isEmpty; members = members.tail) {
-        if (!f(members.head)) remaining.addLast(members.head);
-      }
-      map[memberName] = remaining.toLink(map[memberName]);
+  void processSet(
+      Map<String, Set<Element>> map,
+      String memberName,
+      bool f(Element e)) {
+    Set<Element> members = map[memberName];
+    if (members == null) return;
+    // [f] might add elements to [: map[memberName] :] during the loop below
+    // so we create a new list for [: map[memberName] :] and prepend the
+    // [remaining] members after the loop.
+    map[memberName] = new Set<Element>();
+    Set<Element> remaining = new Set<Element>();
+    for (Element member in members) {
+      if (!f(member)) remaining.add(member);
     }
+    map[memberName].addAll(remaining);
   }
 
   processInstanceMembers(String n, bool f(Element e)) {
-    processLink(instanceMembersByName, n, f);
+    processSet(instanceMembersByName, n, f);
   }
 
   processInstanceFunctions(String n, bool f(Element e)) {
-    processLink(instanceFunctionsByName, n, f);
+    processSet(instanceFunctionsByName, n, f);
   }
 
   void handleUnseenSelector(String methodName, Selector selector) {
     processInstanceMembers(methodName, (Element member) {
-      if (selector.appliesUnnamed(member, compiler)) {
+      if (selector.appliesUnnamed(member, compiler.world)) {
         if (member.isFunction && selector.isGetter) {
           registerClosurizedMember(member, compiler.globalDependencies);
         }
@@ -499,7 +504,7 @@
     });
     if (selector.isGetter) {
       processInstanceFunctions(methodName, (Element member) {
-        if (selector.appliesUnnamed(member, compiler)) {
+        if (selector.appliesUnnamed(member, compiler.world)) {
           registerClosurizedMember(member, compiler.globalDependencies);
           return true;
         }
@@ -579,28 +584,32 @@
     universe.usingFactoryWithTypeArguments = true;
   }
 
-  void registerGenericCallMethod(Element element, Registry registry) {
-    compiler.backend.registerGenericCallMethod(element, this, registry);
-    universe.genericCallMethods.add(element);
+  void registerCallMethodWithFreeTypeVariables(
+      Element element,
+      Registry registry) {
+    compiler.backend.registerCallMethodWithFreeTypeVariables(
+        element, this, registry);
+    universe.callMethodsWithFreeTypeVariables.add(element);
   }
 
   void registerClosurizedMember(Element element, Registry registry) {
     assert(element.isInstanceMember);
-    registerIfGeneric(element, registry);
+    registerClosureIfFreeTypeVariables(element, registry);
     compiler.backend.registerBoundClosure(this);
     universe.closurizedMembers.add(element);
   }
 
-  void registerIfGeneric(Element element, Registry registry) {
+  void registerClosureIfFreeTypeVariables(Element element, Registry registry) {
     if (element.computeType(compiler).containsTypeVariables) {
-      compiler.backend.registerGenericClosure(element, this, registry);
-      universe.genericClosures.add(element);
+      compiler.backend.registerClosureWithFreeTypeVariables(
+          element, this, registry);
+      universe.closuresWithFreeTypeVariables.add(element);
     }
   }
 
   void registerClosure(LocalFunctionElement element, Registry registry) {
     universe.allClosures.add(element);
-    registerIfGeneric(element, registry);
+    registerClosureIfFreeTypeVariables(element, registry);
   }
 
   void forEach(void f(WorkItem work)) {
@@ -675,6 +684,11 @@
     resolvedElements.add(element);
   }
 
+  /// Returns `true` if the resolution world considers [cls] to be instantiated.
+  bool isInstantiated(ClassElement cls) {
+    return seenClasses.contains(cls);
+  }
+
   /// Returns [:true:] if [element] has actually been used.
   bool isLive(Element element) {
     if (seenClasses.contains(element)) return true;
@@ -828,7 +842,7 @@
       newlyEnqueuedElements.add(element);
     }
     // Don't generate code for foreign elements.
-    if (element.isForeign(compiler)) return false;
+    if (element.isForeign(compiler.backend)) return false;
 
     // Codegen inlines field initializers. It only needs to generate
     // code for checked setters.
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
index a4a7bb3..c280bda 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
@@ -7,8 +7,11 @@
 
 library dart2js.helpers;
 
-import "dart:collection";
+import 'dart:async' show EventSink;
+import 'dart:collection';
 import 'dart:convert';
+
+import '../../compiler.dart';
 import '../dart2jslib.dart';
 import '../util/util.dart';
 
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/stats.dart b/sdk/lib/_internal/compiler/implementation/helpers/stats.dart
index 6627e88..1ac3c73 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/stats.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/stats.dart
@@ -6,8 +6,51 @@
 
 // Helper methods for statistics.
 
-/// Current stats collector. Use [ActiveStats] for active collection of data.
-final Stats stats = new ActiveStats(new ConsolePrinter());
+/// Current stats collector. Use [enableStatsOutput] to enable recording of
+/// stats.
+Stats get stats {
+  if (_stats == null) {
+    _stats = const Stats();
+  }
+  return _stats;
+}
+
+Stats _stats;
+
+/// Enable recording of stats. Use [Stats.dumpStats] to output the record stats.
+///
+/// Pass the [outputProvider] of [Compiler] to generate stats into a separate
+/// file using [name] and [extension] for the filename. If omitted, stats are
+/// printed on standard out.
+///
+/// If [xml] is `true`, stats output is formatted as XML with a default
+/// extension of 'xml', otherwise the output is indented text with a default
+/// extension of 'log'.
+void enableStatsOutput({CompilerOutputProvider outputProvider,
+                        bool xml: true,
+                        String name: 'stats',
+                        String extension,
+                        int examples: 10}) {
+  if (_stats != null) {
+    throw new StateError('Stats have already been initialized.');
+  }
+  StatsOutput output;
+  if (outputProvider != null) {
+    if (extension == null) {
+      extension = xml ? 'xml' : 'log';
+    }
+    output = new SinkOutput(outputProvider(name, extension));
+  } else {
+    output = const DebugOutput();
+  }
+  StatsPrinter printer;
+  if (xml) {
+    printer = new XMLPrinter(output: output, examples: examples);
+  } else {
+    printer = new ConsolePrinter(output: output, examples: examples);
+  }
+  _stats = new ActiveStats(printer);
+}
 
 /// Interface for gathering and display of statistical information.
 /// This class serves as the noop collector.
@@ -111,6 +154,17 @@
   ///
   void recordCounter(id, [example, data]) {}
 
+  /// Records the current stack trace under the key [id]. Only every
+  /// [sampleFrequency] call with the same id is recorded, and if omitted
+  /// [stackTraceSampleFrequency] is used.
+  void recordTrace(id, {int sampleFrequency}) {}
+
+  /// The default sample frequency used for recording stack traces.
+  int get stackTraceSampleFrequency => 0;
+
+  /// Set the default sample frequency used for recording stack traces.
+  void set stackTraceSampleFrequency(int value) {}
+
   /// 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
@@ -150,6 +204,19 @@
   void println(String text) => debugPrint(text);
 }
 
+/// Output to an [EventSink]. Used to output to a file through the
+/// [CompilerOutputProvider].
+class SinkOutput implements StatsOutput {
+  EventSink<String> sink;
+
+  SinkOutput(this.sink);
+
+  void println(String text) {
+    sink.add(text);
+    sink.add('\n');
+  }
+}
+
 /// Interface for printing stats collected in [Stats].
 abstract class StatsPrinter {
   /// The number of examples printer. If `null` all examples are printed.
@@ -306,6 +373,135 @@
   }
 }
 
+/// A node in a stack trace tree used to store and organize stack traces by
+/// common prefixes.
+class _StackTraceNode implements Comparable<_StackTraceNode> {
+  int count;
+  List<StackTraceLine> commonPrefix;
+  List<_StackTraceNode> subtraces;
+
+  _StackTraceNode(this.commonPrefix, this.count, this.subtraces);
+
+  _StackTraceNode.root() : this([], 0, []);
+
+  _StackTraceNode.leaf(StackTraceLines stackTrace)
+      : this(stackTrace.lines, 1, const []);
+
+  _StackTraceNode.node(List<StackTraceLine> commonPrefix,
+                       _StackTraceNode first,
+                       _StackTraceNode second)
+      : this(commonPrefix, first.count + second.count, [first, second]);
+
+  void add(StackTraceLines stackTrace) {
+    count++;
+    if (!stackTrace.lines.isEmpty) {
+      addSubtrace(stackTrace);
+    }
+  }
+
+  void addSubtrace(StackTraceLines stackTrace) {
+    List<StackTraceLine> lines = stackTrace.lines;
+    for (_StackTraceNode subtrace in subtraces) {
+      int commonPrefixLength =
+          longestCommonPrefixLength(subtrace.commonPrefix, lines);
+      if (commonPrefixLength > 0) {
+        stackTrace = stackTrace.subtrace(commonPrefixLength);
+        if (commonPrefixLength == subtrace.commonPrefix.length) {
+          subtrace.add(stackTrace);
+        } else {
+          subtrace.commonPrefix =
+              subtrace.commonPrefix.sublist(commonPrefixLength);
+          subtraces.remove(subtrace);
+          subtraces.add(new _StackTraceNode.node(
+              lines.sublist(0, commonPrefixLength),
+              subtrace,
+              new _StackTraceNode.leaf(stackTrace)));
+        }
+        return;
+      }
+    }
+    subtraces.add(new _StackTraceNode.leaf(stackTrace));
+  }
+
+  void dumpTraces(StatsPrinter printer) {
+    printer.open('trace', {'count': count, 'line': commonPrefix.first});
+    if (commonPrefix.length > 1) {
+      for (StackTraceLine line in commonPrefix.skip(1)) {
+        printer.child('trace', {'line': line});
+      }
+    }
+    dumpSubtraces(printer);
+    printer.close('trace');
+  }
+
+  void dumpSubtraces(StatsPrinter printer) {
+    if (!subtraces.isEmpty) {
+      subtraces.sort();
+      for (_StackTraceNode step in subtraces) {
+        step.dumpTraces(printer);
+      }
+    }
+  }
+
+  int compareTo(_StackTraceNode other) {
+    // Sorts in decreasing count order.
+    return other.count - count;
+  }
+
+  void printOn(StringBuffer sb, String indentation) {
+    String countText = '$indentation$count  ';
+    sb.write(countText);
+    sb.write('\n');
+    indentation = ''.padLeft(countText.length, ' ');
+    if (commonPrefix != null) {
+      int index = 0;
+      for (String line in commonPrefix) {
+        sb.write(indentation);
+        if (index > 1) {
+          sb.write('...\n');
+          break;
+        }
+        sb.write(line);
+        sb.write('\n');
+        index++;
+      }
+    }
+    subtraces.sort();
+    for (_StackTraceNode subtrace in subtraces) {
+      subtrace.printOn(sb, indentation);
+    }
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    printOn(sb, '');
+    return sb.toString();
+  }
+}
+
+class _StackTraceTree extends _StackTraceNode {
+  final id;
+  int totalCount = 0;
+  final int sampleFrequency;
+
+  _StackTraceTree(this.id, this.sampleFrequency) : super.root();
+
+  void dumpTraces(StatsPrinter printer) {
+    printer.open('trace', {
+      'id': id,
+      'totalCount': totalCount,
+      'sampleFrequency': sampleFrequency});
+    dumpSubtraces(printer);
+    printer.close('trace');
+  }
+
+  void sample() {
+    if (totalCount++ % sampleFrequency == 0) {
+      add(stackTrace(offset: 3));
+    }
+  }
+}
+
 /// Actual implementation of [Stats].
 class ActiveStats implements Stats {
   final StatsPrinter printer;
@@ -314,6 +510,8 @@
   Map<dynamic, Map> setsMap = {};
   Map<dynamic, Map<dynamic, List>> countersMap =
       <dynamic, Map<dynamic, List>>{};
+  Map<dynamic, _StackTraceTree> traceMap = {};
+  int stackTraceSampleFrequency = 1;
 
   ActiveStats(StatsPrinter this.printer);
 
@@ -361,6 +559,15 @@
     setsMap.putIfAbsent(key, () => new Map())[element] = data;
   }
 
+  void recordTrace(key, {int sampleFrequency}) {
+    if (sampleFrequency == null) {
+      sampleFrequency = stackTraceSampleFrequency;
+    }
+    traceMap.putIfAbsent(key,
+        () => new _StackTraceTree(key, sampleFrequency)).sample();
+
+  }
+
   Iterable getList(String key) {
     Map map = setsMap[key];
     if (map == null) return const [];
@@ -372,6 +579,7 @@
     dumpFrequencies();
     dumpSets();
     dumpCounters();
+    dumpTraces();
     if (beforeClose != null) {
       beforeClose();
     }
@@ -465,6 +673,17 @@
     printer.close('counter');
   }
 
+  void dumpTraces() {
+    printer.group('traces', () {
+      traceMap.keys.forEach(dumpTrace);
+    });
+  }
+
+  void dumpTrace(key) {
+    _StackTraceTree tree = traceMap[key];
+    tree.dumpTraces(printer);
+  }
+
   void dumpCorrelation(keyA, Iterable a, keyB, Iterable b,
                        {Map dataA, Map dataB}) {
     printer.child('correlations', {'title': '$keyA vs $keyB'}, () {
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
index b592972..cccf14f 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
@@ -26,8 +26,14 @@
   try {
     throw '';
   } catch (e, s) {
-    String stackTrace = prettifyStackTrace(
-        s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
+    String stackTrace;
+    try {
+      stackTrace = prettifyStackTrace(
+          s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
+    } catch (e) {
+      print(e);
+      stackTrace = '$s';
+    }
     if (condition != null) {
       if (!condition(stackTrace)) return;
     }
@@ -50,21 +56,198 @@
   });
 }
 
-/// Helper class for the processing of stack traces in [prettifyStackTrace].
-class _StackTraceLine {
+/// Returns the [StackTraceLines] for the current call stack.
+///
+/// Use [offset] to discard the first [offset] calls of the call stack. Defaults
+/// to `1`, that is, discard the call to [stackTrace] itself. Use [limit] to
+/// limit the length of the stack trace lines.
+StackTraceLines stackTrace({int offset: 1,
+                            int limit: null}) {
+  int rangeStart = offset;
+  int rangeEnd = limit == null ? null : rangeStart + limit;
+  try {
+    throw '';
+  } catch (_, stackTrace) {
+    return new StackTraceLines.fromTrace(stackTrace,
+        rangeStart: offset, rangeEnd: rangeEnd,
+        filePrefix: stackTraceFilePrefix);
+  }
+  return null;
+}
+
+/// A stack trace as a sequence of [StackTraceLine]s.
+class StackTraceLines {
+  final List<StackTraceLine> lines;
+  final int maxFileLength;
+  final int maxLineNoLength;
+  final int maxColumnNoLength;
+
+  factory StackTraceLines.fromTrace(StackTrace s,
+                                    {int rangeStart,
+                                     int rangeEnd,
+                                     String filePrefix,
+                                     String lambda: r'?'}) {
+    final RegExp indexPattern = new RegExp(r'#\d+\s*');
+    int index = -1;
+    int maxFileLength = 0;
+    int maxLineNoLength = 0;
+    int maxColumnNoLength = 0;
+
+    String stackTrace = '$s';
+    List<StackTraceLine> lines = <StackTraceLine>[];
+    // Parse each line in the stack trace. The supported line formats from the
+    // Dart VM are:
+    //    #n     <method-name> (<uri>:<line-no>:<column-no>)
+    //    #n     <method-name> (<uri>:<line-no>)
+    // in which '<anonymous closure>' is the name used for an (unnamed) function
+    // expression.
+    for (String line in stackTrace.split('\n')) {
+      try {
+        index++;
+        if (rangeStart != null && index < rangeStart) continue;
+        if (rangeEnd != null && index > rangeEnd) break;
+        if (line.isEmpty) continue;
+
+        // Strip index.
+        line = line.replaceFirst(indexPattern, '');
+
+        int leftParenPos = line.indexOf('(');
+        int rightParenPos = line.indexOf(')', leftParenPos);
+        int lastColon = line.lastIndexOf(':', rightParenPos);
+        int nextToLastColon = line.lastIndexOf(':', lastColon-1);
+
+        String lineNo;
+        String columnNo;
+        if (nextToLastColon != -1) {
+          lineNo = line.substring(nextToLastColon+1, lastColon);
+          columnNo = line.substring(lastColon+1, rightParenPos);
+          try {
+            int.parse(lineNo);
+          } on FormatException catch (e) {
+            lineNo = columnNo;
+            columnNo = '';
+            nextToLastColon = lastColon;
+          }
+        } else {
+          lineNo = line.substring(lastColon+1, rightParenPos);
+          columnNo = '';
+          nextToLastColon = lastColon;
+        }
+
+        if (lineNo.length > maxLineNoLength) {
+          maxLineNoLength = lineNo.length;
+        }
+        if (columnNo.length > maxColumnNoLength) {
+          maxColumnNoLength = columnNo.length;
+        }
+
+        String file = line.substring(leftParenPos+1, nextToLastColon);
+        if (filePrefix != null && file.startsWith(filePrefix)) {
+          file = file.substring(filePrefix.length);
+        }
+        if (file.length > maxFileLength) {
+          maxFileLength = file.length;
+        }
+        String method = line.substring(0, leftParenPos-1);
+        if (lambda != null) {
+          method = method.replaceAll('<anonymous closure>', lambda);
+        }
+        lines.add(new StackTraceLine(index, file, lineNo, columnNo, method));
+      } catch (e) {
+        throw 'Error prettifying "$line": $e';
+      }
+    }
+    return new StackTraceLines.fromLines(
+        lines, maxFileLength, maxLineNoLength, maxColumnNoLength);
+  }
+
+  StackTraceLines.fromLines(this.lines,
+                            this.maxFileLength,
+                            this.maxLineNoLength,
+                            this.maxColumnNoLength);
+
+  StackTraceLines subtrace(int offset) {
+    return new StackTraceLines.fromLines(
+        lines.sublist(offset),
+        maxFileLength,
+        maxLineNoLength,
+        maxColumnNoLength);
+  }
+
+  String prettify({bool showColumnNo: false,
+                   bool showDots: true}) {
+    StringBuffer sb = new StringBuffer();
+    bool dots = true;
+    for (StackTraceLine line in lines) {
+      sb.write('  ');
+      line.printOn(sb,
+        fileLength: maxFileLength,
+        padding: showDots && dots ? ' .' : ' ',
+        lineNoLength: maxLineNoLength,
+        showColumnNo: showColumnNo,
+        columnNoLength: maxColumnNoLength);
+
+      dots = !dots;
+    }
+    return sb.toString();
+  }
+
+  String toString() {
+    return prettify();
+  }
+}
+
+/// A parsed line from a stack trace.
+class StackTraceLine {
   final int index;
   final String file;
   final String lineNo;
   final String columnNo;
   final String method;
 
-  _StackTraceLine(this.index, this.file, this.lineNo,
+  StackTraceLine(this.index, this.file, this.lineNo,
                   this.columnNo, this.method);
 
-  String toString() {
-    return 'index=$index, file=$file, '
-           'lineNo=$lineNo, columnNo=$columnNo, method=$method';
+  void printOn(StringBuffer sb,
+               {String padding: ' ',
+                int fileLength,
+                int lineNoLength,
+                int columnNoLength,
+                bool showColumnNo: false}) {
+    String fileText = '${file} ';
+    if (fileLength != null) {
+      fileText = pad(fileText, fileLength, dots: padding);
+    }
+    String lineNoText = lineNo;
+    if (lineNoLength != null) {
+      lineNoText = pad(lineNoText, lineNoLength, padLeft: true);
+    }
+    String columnNoText = showColumnNo ? '': columnNo;
+    if (columnNoLength != null) {
+        columnNoText = ':${pad(columnNoText, columnNoLength)}';
+    }
+    sb.write('$fileText $lineNoText$columnNoText $method\n');
   }
+
+  int get hashCode {
+    return 13 * index +
+           17 * file.hashCode +
+           19 * lineNo.hashCode +
+           23 * columnNo.hashCode +
+           29 * method.hashCode;
+  }
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! StackTraceLine) return false;
+    return index == other.index &&
+           file == other.file &&
+           lineNo == other.lineNo &&
+           columnNo == other.columnNo &&
+           method == other.method;
+  }
+
+  String toString() => "$method @ $file [$lineNo:$columnNo]";
 }
 
 // TODO(johnniwinther): Use this format for --throw-on-error.
@@ -84,91 +267,17 @@
  * [filePrefix] only the remainder is printed.
  * If [lambda] is non-null, anonymous closures are printed as [lambda].
  */
-String prettifyStackTrace(StackTrace s,
+String prettifyStackTrace(StackTrace stackTrace,
                           {int rangeStart,
                            int rangeEnd,
                            bool showColumnNo: false,
                            bool showDots: true,
                            String filePrefix,
                            String lambda: r'?'}) {
-  int index = -1;
-  int maxFileLength = 0;
-  int maxLineNoLength = 0;
-  int maxColumnNoLength = 0;
-
-  String stackTrace = '$s';
-  List<_StackTraceLine> lines = <_StackTraceLine>[];
-  for (String line in stackTrace.split('\n')) {
-    try {
-      index++;
-      if (rangeStart != null && index < rangeStart) continue;
-      if (rangeEnd != null && index > rangeEnd) continue;
-      if (line.isEmpty) continue;
-
-      // Strip index.
-      line = line.replaceFirst(new RegExp(r'#\d+\s*'), '');
-
-      int leftParenPos = line.indexOf('(');
-      int rightParenPos = line.indexOf(')', leftParenPos);
-      int lastColon = line.lastIndexOf(':', rightParenPos);
-      int nextToLastColon = line.lastIndexOf(':', lastColon-1);
-
-      String lineNo;
-      String columnNo;
-      if (nextToLastColon != -1) {
-        lineNo = line.substring(nextToLastColon+1, lastColon);
-        columnNo = line.substring(lastColon+1, rightParenPos);
-        try {
-          int.parse(lineNo);
-        } on FormatException catch (e) {
-          lineNo = columnNo;
-          columnNo = '';
-          nextToLastColon = lastColon;
-        }
-      } else {
-        lineNo = line.substring(lastColon+1, rightParenPos);
-        columnNo = '';
-        nextToLastColon = lastColon;
-      }
-
-      if (lineNo.length > maxLineNoLength) {
-        maxLineNoLength = lineNo.length;
-      }
-      if (columnNo.length > maxColumnNoLength) {
-        maxColumnNoLength = columnNo.length;
-      }
-
-      String file = line.substring(leftParenPos+1, nextToLastColon);
-      if (filePrefix != null && file.startsWith(filePrefix)) {
-        file = file.substring(filePrefix.length);
-      }
-      if (file.length > maxFileLength) {
-        maxFileLength = file.length;
-      }
-      String method = line.substring(0, leftParenPos-1);
-      if (lambda != null) {
-        method = method.replaceAll('<anonymous closure>', lambda);
-      }
-      lines.add(new _StackTraceLine(index, file, lineNo, columnNo, method));
-    } catch (e) {
-      print('Error prettifying "$line": $e');
-      return stackTrace;
-    }
-  }
-
-  StringBuffer sb = new StringBuffer();
-  bool dots = true;
-  for (_StackTraceLine line in lines) {
-    String file = pad('${line.file} ', maxFileLength,
-                      dots: showDots && dots ? ' .' : ' ');
-    String lineNo = pad(line.lineNo, maxLineNoLength, padLeft: true);
-    String columnNo =
-        showColumnNo ? ':${pad(line.columnNo, maxColumnNoLength)}' : '';
-    String method = line.method;
-    sb.write('  $file $lineNo$columnNo $method\n');
-    dots = !dots;
-  }
-  return sb.toString();
+  return new StackTraceLines.fromTrace(stackTrace,
+      rangeStart: rangeStart, rangeEnd: rangeEnd,
+      filePrefix: filePrefix, lambda: lambda)
+    .prettify(showColumnNo: showColumnNo, showDots: showDots);
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
index 52c5dca..b0b0c85 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
@@ -43,7 +43,7 @@
   void analyzeCall(CallSiteTypeInformation info) {
     Selector selector = info.selector;
     tracedElements.forEach((FunctionElement functionElement) {
-      if (!selector.signatureApplies(functionElement, compiler)) return;
+      if (!selector.signatureApplies(functionElement)) return;
       inferrer.updateParameterAssignments(info, functionElement, info.arguments,
           selector, remove: false, addToQueue: false);
     });
@@ -61,7 +61,7 @@
   visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
     super.visitStaticCallSiteTypeInformation(info);
     Element called = info.calledElement;
-    if (called.isForeign(compiler)) {
+    if (called.isForeign(compiler.backend)) {
       String name = called.name;
       if (name == 'JS' || name == 'DART_CLOSURE_TO_JS') {
         bailout('Used in JS ${info.call}');
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 1909dfb..eff3bb5 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -232,7 +232,7 @@
     for (BaseType baseType in baseTypes) {
       if (baseType.isClass()) {
         ClassBaseType classBaseType = baseType;
-        if (classBaseType.element.lookupSelector(selector, compiler) != null) {
+        if (classBaseType.element.lookupSelector(selector) != null) {
           newBaseTypes.add(baseType);
         }
       } else {
@@ -431,9 +431,11 @@
       final element = classBaseType.element;
       assert(element != null);
       if (element == compiler.backend.numImplementation) {
-        return new TypeMask.nonNullSubclass(compiler.backend.numImplementation);
+        return new TypeMask.nonNullSubclass(compiler.backend.numImplementation,
+                                            compiler.world);
       } else if (element == compiler.backend.intImplementation) {
-        return new TypeMask.nonNullSubclass(compiler.backend.intImplementation);
+        return new TypeMask.nonNullSubclass(compiler.backend.intImplementation,
+                                            compiler.world);
       } else {
         return new TypeMask.nonNullExact(element.declaration);
       }
@@ -449,7 +451,7 @@
     for (BaseType baseType in concreteType.baseTypes) {
       TypeMask baseMask = baseTypeToTypeMask(baseType);
       if (baseMask == const DynamicTypeMask()) return baseMask;
-      typeMask = typeMask.union(baseMask, compiler);
+      typeMask = typeMask.union(baseMask, compiler.world);
     }
     return typeMask;
   }
@@ -510,7 +512,7 @@
   @override
   Selector newTypedSelector(ConcreteType receiver, Selector selector) {
     return new TypedSelector(concreteTypeToTypeMask(receiver), selector,
-        compiler);
+        compiler.world);
   }
 
   @override
@@ -527,7 +529,7 @@
    * Helper method for [nonNullSubtype] and [nonNullSubclass].
    */
   ConcreteType nonNullSubX(ClassElement cls,
-                           Set<ClassElement> extractor(ClassElement cls)) {
+                           Iterable<ClassElement> extractor(ClassElement cls)) {
     if (cls == compiler.objectClass) {
       return dynamicType;
     }
@@ -542,10 +544,8 @@
       }
     }
     registerClass(cls);
-    Set<ClassElement> subtypes = extractor(cls);
-    if (subtypes != null) {
-      subtypes.forEach(registerClass);
-    }
+    Iterable<ClassElement> subtypes = extractor(cls);
+    subtypes.forEach(registerClass);
     return result;
   }
 
@@ -567,6 +567,11 @@
   }
 
   @override
+  bool selectorNeedsUpdate(ConcreteType type, Selector selector) {
+    return concreteTypeToTypeMask(type) != selector.mask;
+  }
+
+  @override
   ConcreteType refineReceiver(Selector selector, ConcreteType receiverType) {
     return receiverType.refine(selector, compiler);
   }
@@ -925,23 +930,23 @@
     throw new UnsupportedError("");
   }
 
-  bool containsOnlyInt(Compiler compiler) {
+  bool containsOnlyInt(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsOnlyDouble(Compiler compiler) {
+  bool containsOnlyDouble(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsOnlyNum(Compiler compiler) {
+  bool containsOnlyNum(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsOnlyBool(Compiler compiler) {
+  bool containsOnlyBool(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsOnlyString(Compiler compiler) {
+  bool containsOnlyString(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
@@ -949,31 +954,31 @@
     throw new UnsupportedError("");
   }
 
-  bool satisfies(ClassElement cls, Compiler compiler) {
+  bool satisfies(ClassElement cls, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool contains(ClassElement type, Compiler compiler) {
+  bool contains(ClassElement type, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsAll(Compiler compiler) {
+  bool containsAll(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  ClassElement singleClass(Compiler compiler) {
+  ClassElement singleClass(ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  TypeMask union(TypeMask other, Compiler compiler) {
+  TypeMask union(TypeMask other, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool canHit(Element element, Selector selector, Compiler compiler) {
+  bool canHit(Element element, Selector selector, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
@@ -981,15 +986,15 @@
     throw new UnsupportedError("");
   }
 
-  bool needsNoSuchMethodHandling(Selector selector, Compiler compiler) {
+  bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool isInMask(TypeMask other, Compiler compiler) {
+  bool isInMask(TypeMask other, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 
-  bool containsMask(TypeMask other, Compiler compiler) {
+  bool containsMask(TypeMask other, ClassWorld classWorld) {
     throw new UnsupportedError("");
   }
 }
@@ -1216,7 +1221,7 @@
     if (mask1 == const DynamicTypeMask() || mask2 == const DynamicTypeMask()) {
       return const DynamicTypeMask();
     }
-    return mask1.union(mask2, compiler);
+    return mask1.union(mask2, compiler.world);
   }
 
   /**
@@ -1226,7 +1231,7 @@
     // TODO(polux): memoize?
     Set<Element> result = new Set<Element>();
     for (ClassElement cls in seenClasses) {
-      Element elem = cls.lookupSelector(selector, compiler);
+      Element elem = cls.lookupSelector(selector);
       if (elem != null) {
         result.add(elem.implementation);
       }
@@ -1241,7 +1246,7 @@
     // TODO(polux): memoize?
     Set<ClassElement> result = new Set<ClassElement>()..add(cls);
     for (ClassElement candidate in seenClasses) {
-      if (compiler.world.isSubtype(cls, candidate)) {
+      if (compiler.world.isSubtypeOf(candidate, cls)) {
         result.add(candidate);
       }
     }
@@ -1492,7 +1497,7 @@
     } else {
       candidates.forEach((TypeMask receiverType, TypeMask returnType) {
         TypeMask intersection =
-            receiverType.intersection(selector.mask, compiler);
+            receiverType.intersection(selector.mask, compiler.world);
         if (!intersection.isEmpty || intersection.isNullable) {
           result = typeMaskUnion(result, returnType);
         }
@@ -1554,7 +1559,8 @@
       TypeMask receiverMask =
           (receiverType == compiler.backend.numImplementation
           || receiverType == compiler.backend.intImplementation)
-              ? new TypeMask.nonNullSubclass(receiverType.declaration)
+              ? new TypeMask.nonNullSubclass(receiverType.declaration,
+                  compiler.world)
               : new TypeMask.nonNullExact(receiverType.declaration);
       TypeMask resultMask = types.concreteTypeToTypeMask(result);
       augmentInferredSelectorType(selector, receiverMask, resultMask);
@@ -2119,7 +2125,7 @@
         if (!baseReceiverType.isNull()) {
           ClassBaseType classBaseType = baseReceiverType;
           ClassElement cls = classBaseType.element;
-          Element getterOrField = cls.lookupSelector(selector, compiler);
+          Element getterOrField = cls.lookupSelector(selector);
           if (getterOrField != null) {
             augmentResult(cls, getterOrField.implementation);
           }
@@ -2166,7 +2172,7 @@
         if (!baseReceiverType.isNull()) {
           ClassBaseType classBaseType = baseReceiverType;
           ClassElement cls = classBaseType.element;
-          Element setterOrField = cls.lookupSelector(selector, compiler);
+          Element setterOrField = cls.lookupSelector(selector);
           if (setterOrField != null) {
             augmentField(cls, setterOrField.implementation);
           }
@@ -2208,7 +2214,7 @@
         if (!baseReceiverType.isNull()) {
           ClassBaseType classBaseReceiverType = baseReceiverType;
           ClassElement cls = classBaseReceiverType.element;
-          Element method = cls.lookupSelector(selector, compiler);
+          Element method = cls.lookupSelector(selector);
           if (method != null) {
             if (method.isFunction) {
               assert(method is FunctionElement);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index 7d5a3c4..bc2e3ab 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -92,6 +92,12 @@
   T addPhiInput(Local variable, T phiType, T newType);
 
   /**
+   * Returns `true` if `selector` should be updated to reflect the new
+   * `receiverType`.
+   */
+  bool selectorNeedsUpdate(T receiverType, Selector selector);
+
+  /**
    * Returns a new receiver type for this [selector] applied to
    * [receiverType].
    */
@@ -761,10 +767,8 @@
     ClassElement cls = outermostElement.enclosingClass;
     if (compiler.world.isUsedAsMixin(cls)) {
       return _thisType = types.nonNullSubtype(cls);
-    } else if (compiler.world.hasAnySubclass(cls)) {
-      return _thisType = types.nonNullSubclass(cls);
     } else {
-      return _thisType = types.nonNullExact(cls);
+      return _thisType = types.nonNullSubclass(cls);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
index 907be9e..82ee9b5 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/list_tracer.dart
@@ -161,7 +161,7 @@
   visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
     super.visitStaticCallSiteTypeInformation(info);
     Element called = info.calledElement;
-    if (called.isForeign(compiler) && called.name == 'JS') {
+    if (called.isForeign(compiler.backend) && called.name == 'JS') {
       bailout('Used in JS ${info.call}');
     }
   }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
index cd9ae9f..1df3d9b 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/map_tracer.dart
@@ -61,7 +61,7 @@
   visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
     super.visitStaticCallSiteTypeInformation(info);
     Element called = info.calledElement;
-    if (called.isForeign(compiler) && called.name == 'JS') {
+    if (called.isForeign(compiler.backend) && called.name == 'JS') {
       bailout('Used in JS ${info.call}');
     }
   }
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 3d0941d..af97966 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -29,7 +29,10 @@
  */
 class TypeMaskSystem implements TypeSystem<TypeMask> {
   final Compiler compiler;
-  TypeMaskSystem(this.compiler);
+  final ClassWorld classWorld;
+  TypeMaskSystem(Compiler compiler)
+      : this.compiler = compiler,
+        this.classWorld = compiler.world;
 
   TypeMask narrowType(TypeMask type,
                       DartType annotation,
@@ -46,11 +49,11 @@
       otherType = nullType;
     } else {
       assert(annotation.isInterfaceType);
-      otherType = new TypeMask.nonNullSubtype(annotation.element);
+      otherType = new TypeMask.nonNullSubtype(annotation.element, classWorld);
     }
     if (isNullable) otherType = otherType.nullable();
     if (type == null) return otherType;
-    return type.intersection(otherType, compiler);
+    return type.intersection(otherType, classWorld);
   }
 
   TypeMask computeLUB(TypeMask firstType, TypeMask secondType) {
@@ -61,10 +64,10 @@
     } else if (firstType == secondType) {
       return firstType;
     } else {
-      TypeMask union = firstType.union(secondType, compiler);
+      TypeMask union = firstType.union(secondType, classWorld);
       // TODO(kasperl): If the union isn't nullable it seems wasteful
       // to use dynamic. Fix that.
-      return union.containsAll(compiler) ? dynamicType : union;
+      return union.containsAll(classWorld) ? dynamicType : union;
     }
   }
 
@@ -95,9 +98,9 @@
   TypeMask stringLiteralType(ast.DartString value) => stringType;
 
   TypeMask nonNullSubtype(ClassElement type)
-      => new TypeMask.nonNullSubtype(type.declaration);
+      => new TypeMask.nonNullSubtype(type.declaration, classWorld);
   TypeMask nonNullSubclass(ClassElement type)
-      => new TypeMask.nonNullSubclass(type.declaration);
+      => new TypeMask.nonNullSubclass(type.declaration, classWorld);
   TypeMask nonNullExact(ClassElement type)
       => new TypeMask.nonNullExact(type.declaration);
   TypeMask nonNullEmpty() => new TypeMask.nonNullEmpty();
@@ -119,7 +122,7 @@
   }
 
   Selector newTypedSelector(TypeMask receiver, Selector selector) {
-    return new TypedSelector(receiver, selector, compiler);
+    return new TypedSelector(receiver, selector, compiler.world);
   }
 
   TypeMask addPhiInput(Local variable,
@@ -140,9 +143,13 @@
     return phiType;
   }
 
+  bool selectorNeedsUpdate(TypeMask type, Selector selector) {
+    return type != selector.mask;
+  }
+
   TypeMask refineReceiver(Selector selector, TypeMask receiverType) {
     TypeMask newType = compiler.world.allFunctions.receiverType(selector);
-    return receiverType.intersection(newType, compiler);
+    return receiverType.intersection(newType, classWorld);
   }
 
   TypeMask getConcreteTypeFor(TypeMask mask) => mask;
@@ -156,11 +163,14 @@
 abstract class InferrerEngine<T, V extends TypeSystem>
     implements MinimalInferrerEngine<T> {
   final Compiler compiler;
+  final ClassWorld classWorld;
   final V types;
   final Map<ast.Node, T> concreteTypes = new Map<ast.Node, T>();
   final Set<Element> generativeConstructorsExposingThis = new Set<Element>();
 
-  InferrerEngine(this.compiler, this.types);
+  InferrerEngine(Compiler compiler, this.types)
+      : this.compiler = compiler,
+        this.classWorld = compiler.world;
 
   /**
    * Records the default type of parameter [parameter].
@@ -338,17 +348,8 @@
         mappedType = types.nullType;
       } else if (type.isDynamic) {
         return types.dynamicType;
-      } else if (!compiler.world.hasAnySubtype(type.element)) {
-        mappedType = types.nonNullExact(type.element);
       } else {
-        ClassElement element = type.element;
-        Set<ClassElement> subtypes = compiler.world.subtypesOf(element);
-        Set<ClassElement> subclasses = compiler.world.subclassesOf(element);
-        if (subclasses != null && subtypes.length == subclasses.length) {
-          mappedType = types.nonNullSubclass(element);
-        } else {
-          mappedType = types.nonNullSubtype(element);
-        }
+        mappedType = types.nonNullSubtype(type.element);
       }
       returnType = types.computeLUB(returnType, mappedType);
       if (returnType == types.dynamicType) {
@@ -680,9 +681,9 @@
   bool isThisOrSuper(ast.Node node) => node.isThis() || node.isSuper();
 
   bool isInClassOrSubclass(Element element) {
-    ClassElement cls = outermostElement.enclosingClass;
-    ClassElement enclosing = element.enclosingClass;
-    return (enclosing == cls) || compiler.world.isSubclass(cls, enclosing);
+    ClassElement cls = outermostElement.enclosingClass.declaration;
+    ClassElement enclosing = element.enclosingClass.declaration;
+    return compiler.world.isSubclassOf(enclosing, cls);
   }
 
   void checkIfExposesThis(Selector selector) {
@@ -928,7 +929,7 @@
     // are calling does not expose this.
     isThisExposed = true;
     if (Elements.isUnresolved(element)
-        || !selector.applies(element, compiler)) {
+        || !selector.applies(element, compiler.world)) {
       // Ensure we create a node, to make explicit the call to the
       // `noSuchMethod` handler.
       return handleDynamicSend(node, selector, superType, arguments);
@@ -978,14 +979,14 @@
         analyzeSuperConstructorCall(element, arguments);
       }
     }
-    if (element.isForeign(compiler)) {
+    if (element.isForeign(compiler.backend)) {
       return handleForeignSend(node);
     }
     Selector selector = elements.getSelector(node);
     // In erroneous code the number of arguments in the selector might not
     // match the function element.
     // TODO(polux): return nonNullEmpty and check it doesn't break anything
-    if (!selector.applies(element, compiler)) return types.dynamicType;
+    if (!selector.applies(element, compiler.world)) return types.dynamicType;
 
     T returnType = handleStaticSend(node, selector, element, arguments);
     if (Elements.isGrowableListConstructorCall(element, node, compiler)) {
@@ -1129,7 +1130,7 @@
                       T receiverType,
                       ArgumentsTypes arguments) {
     assert(receiverType != null);
-    if (selector.mask != receiverType) {
+    if (types.selectorNeedsUpdate(receiverType, selector)) {
       selector = (receiverType == types.dynamicType)
           ? selector.asUntyped
           : types.newTypedSelector(receiverType, selector);
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 d7375f6..c4a26ea 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -13,12 +13,17 @@
   show TypeMask, ContainerTypeMask, MapTypeMask, DictionaryTypeMask,
        ValueTypeMask, TypesInferrer;
 import '../universe/universe.dart' show Selector, TypedSelector, SideEffects;
-import '../dart2jslib.dart' show Compiler, TreeElementMapping;
+import '../dart2jslib.dart'
+    show ClassWorld,
+         Compiler,
+         Constant,
+         FunctionConstant,
+         invariant,
+         TreeElementMapping;
 import 'inferrer_visitor.dart' show TypeSystem, ArgumentsTypes;
 import '../native_handler.dart' as native;
 import '../util/util.dart' show Spannable, Setlet;
 import 'simple_types_inferrer.dart';
-import '../dart2jslib.dart' show invariant, Constant, FunctionConstant;
 
 part 'type_graph_nodes.dart';
 part 'closure_tracer.dart';
@@ -28,9 +33,11 @@
 
 bool _VERBOSE = false;
 bool _PRINT_SUMMARY = false;
+final _ANOMALY_WARN = false;
 
 class TypeInformationSystem extends TypeSystem<TypeInformation> {
   final Compiler compiler;
+  final ClassWorld classWorld;
 
   /// [ElementTypeInformation]s for elements.
   final Map<Element, TypeInformation> typeInformations =
@@ -55,7 +62,9 @@
   /// narrowing, phis, and containers).
   final List<TypeInformation> allocatedTypes = <TypeInformation>[];
 
-  TypeInformationSystem(this.compiler) {
+  TypeInformationSystem(Compiler compiler)
+      : this.compiler = compiler,
+        this.classWorld = compiler.world {
     nonNullEmptyType = getConcreteTypeFor(const TypeMask.nonNullEmpty());
   }
 
@@ -176,7 +185,6 @@
 
   TypeInformation nonNullEmptyType;
 
-
   TypeInformation stringLiteralType(ast.DartString value) {
     return new StringLiteralTypeInformation(
         value, compiler.typesTask.stringType);
@@ -192,7 +200,12 @@
       return dynamicType;
     }
     return getConcreteTypeFor(
-        firstType.type.union(secondType.type, compiler));
+        firstType.type.union(secondType.type, classWorld));
+  }
+
+  bool selectorNeedsUpdate(TypeInformation info, Selector selector)
+  {
+    return info.type != selector.mask;
   }
 
   TypeInformation refineReceiver(Selector selector, TypeInformation receiver) {
@@ -200,9 +213,10 @@
     TypeMask otherType = compiler.world.allFunctions.receiverType(selector);
     // If this is refining to nullable subtype of `Object` just return
     // the receiver. We know the narrowing is useless.
-    if (otherType.isNullable && otherType.containsAll(compiler)) {
+    if (otherType.isNullable && otherType.containsAll(classWorld)) {
       return receiver;
     }
+    assert(TypeMask.isNormalized(otherType, classWorld));
     TypeInformation newType = new NarrowTypeInformation(receiver, otherType);
     allocatedTypes.add(newType);
     return newType;
@@ -213,7 +227,7 @@
                              {bool isNullable: true}) {
     if (annotation.treatAsDynamic) return type;
     if (annotation.isVoid) return nullType;
-    if (annotation.element == compiler.objectClass) return type;
+    if (annotation.element == classWorld.objectClass && isNullable) return type;
     TypeMask otherType;
     if (annotation.isTypedef || annotation.isFunctionType) {
       otherType = functionType.type;
@@ -222,12 +236,15 @@
       return type;
     } else {
       assert(annotation.isInterfaceType);
-      otherType = new TypeMask.nonNullSubtype(annotation.element);
+      otherType = annotation.element == classWorld.objectClass
+          ? dynamicType.type.nonNullable()
+          : new TypeMask.nonNullSubtype(annotation.element, classWorld);
     }
     if (isNullable) otherType = otherType.nullable();
     if (type.type.isExact) {
       return type;
     } else {
+      assert(TypeMask.isNormalized(otherType, classWorld));
       TypeInformation newType = new NarrowTypeInformation(type, otherType);
       allocatedTypes.add(newType);
       return newType;
@@ -262,11 +279,13 @@
   }
 
   TypeInformation nonNullSubtype(ClassElement type) {
-    return getConcreteTypeFor(new TypeMask.nonNullSubtype(type.declaration));
+    return getConcreteTypeFor(
+        new TypeMask.nonNullSubtype(type.declaration, classWorld));
   }
 
   TypeInformation nonNullSubclass(ClassElement type) {
-    return getConcreteTypeFor(new TypeMask.nonNullSubclass(type.declaration));
+    return getConcreteTypeFor(
+        new TypeMask.nonNullSubclass(type.declaration, classWorld));
   }
 
   TypeInformation nonNullExact(ClassElement type) {
@@ -286,7 +305,7 @@
                                Element enclosing,
                                [TypeInformation elementType, int length]) {
     bool isTypedArray = (compiler.typedDataClass != null) &&
-        type.type.satisfies(compiler.typedDataClass, compiler);
+        type.type.satisfies(compiler.typedDataClass, classWorld);
     bool isConst = (type.type == compiler.typesTask.constListType);
     bool isFixed = (type.type == compiler.typesTask.fixedListType) ||
                    isConst ||
@@ -325,9 +344,9 @@
     TypeMask keyType, valueType;
     if (isFixed) {
       keyType = keyTypes.fold(nonNullEmptyType.type,
-          (type, info) => type.union(info.type, compiler));
+          (type, info) => type.union(info.type, classWorld));
       valueType = valueTypes.fold(nonNullEmptyType.type,
-          (type, info) => type.union(info.type, compiler));
+          (type, info) => type.union(info.type, classWorld));
     } else {
       keyType = valueType = dynamicType.type;
     }
@@ -364,7 +383,7 @@
     // kinds of [TypeInformation] have the empty type at this point of
     // analysis.
     return info.isConcrete
-        ? new TypedSelector(info.type, selector, compiler)
+        ? new TypedSelector(info.type, selector, classWorld)
         : selector;
   }
 
@@ -416,9 +435,9 @@
   TypeMask joinTypeMasks(Iterable<TypeMask> masks) {
     TypeMask newType = const TypeMask.nonNullEmpty();
     for (TypeMask mask in masks) {
-      newType = newType.union(mask, compiler);
+      newType = newType.union(mask, classWorld);
     }
-    return newType.containsAll(compiler) ? dynamicType.type : newType;
+    return newType.containsAll(classWorld) ? dynamicType.type : newType;
   }
 }
 
@@ -555,10 +574,11 @@
 
   void runOverAllElements() {
     if (compiler.disableTypeInference) return;
-    compiler.progress.reset();
-
+    if (compiler.verbose) {
+      compiler.progress.reset();
+    }
     sortResolvedElements().forEach((Element element) {
-      if (compiler.progress.elapsedMilliseconds > 500) {
+      if (compiler.shouldPrintProgress) {
         compiler.log('Added $addedInGraph elements in inferencing graph.');
         compiler.progress.reset();
       }
@@ -616,7 +636,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);
         trace(elements, new ClosureTracerVisitor(elements, info, this));
       } else {
         assert(info is ElementTypeInformation);
@@ -716,8 +736,9 @@
                 // Although we might find a better type, we have to keep
                 // the old type around to ensure that we get a complete view
                 // of the type graph and do not drop any flow edges.
-                type = new NarrowTypeInformation(type,
-                    value.computeMask(compiler));
+                TypeMask refinedType = value.computeMask(compiler);
+                assert(TypeMask.isNormalized(refinedType, classWorld));
+                type = new NarrowTypeInformation(type, refinedType);
                 types.allocatedTypes.add(type);
               }
             }
@@ -757,7 +778,7 @@
       if (info is StaticCallSiteTypeInformation) {
         compiler.world.addFunctionCalledInLoop(info.calledElement);
       } else if (info.selector.mask != null &&
-                 !info.selector.mask.containsAll(compiler)) {
+                 !info.selector.mask.containsAll(compiler.world)) {
         // For instance methods, we only register a selector called in a
         // loop if it is a typed selector, to avoid marking too many
         // methods as being called from within a loop. This cuts down
@@ -769,7 +790,7 @@
 
   void refine() {
     while (!workQueue.isEmpty) {
-      if (compiler.progress.elapsedMilliseconds > 500) {
+      if (compiler.shouldPrintProgress) {
         compiler.log('Inferred $overallRefineCount types.');
         compiler.progress.reset();
       }
@@ -783,6 +804,9 @@
         if (info.hasStableType(this)) {
           info.stabilize(this);
         } else if (info.refineCount > MAX_CHANGE_COUNT) {
+          if (_ANOMALY_WARN) {
+            print("ANOMALY WARNING: max refinement reached for $info");
+          }
           info.giveUp(this);
         }
       }
@@ -848,7 +872,8 @@
       int parameterIndex = 0;
       bool visitingRequiredParameter = true;
       signature.forEachParameter((Element parameter) {
-        if (parameter == signature.firstOptionalParameter) {
+        if (signature.hasOptionalParameters &&
+            parameter == signature.firstOptionalParameter) {
           visitingRequiredParameter = false;
         }
         TypeInformation type = visitingRequiredParameter
@@ -1166,7 +1191,7 @@
     for (Element element in elements) {
       TypeMask type =
           inferrer.typeOfElementWithSelector(element, selector).type;
-      result = result.union(type, compiler);
+      result = result.union(type, compiler.world);
     }
     return result;
   }
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 e17ce9c..da300ed 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -556,7 +556,7 @@
     if (selector.mask != receiverType) {
       return receiverType == inferrer.compiler.typesTask.dynamicType
           ? selector.asUntyped
-          : new TypedSelector(receiverType, selector, inferrer.compiler);
+          : new TypedSelector(receiverType, selector, inferrer.classWorld);
     } else {
       return selector;
     }
@@ -578,26 +578,26 @@
    */
   TypeInformation handleIntrisifiedSelector(Selector selector,
                                             TypeGraphInferrerEngine inferrer) {
-    Compiler compiler = inferrer.compiler;
-    if (!compiler.backend.intImplementation.isResolved) return null;
+    ClassWorld classWorld = inferrer.classWorld;
+    if (!classWorld.backend.intImplementation.isResolved) return null;
     TypeMask emptyType = const TypeMask.nonNullEmpty();
     if (selector.mask == null) return null;
-    if (!selector.mask.containsOnlyInt(compiler)) {
+    if (!selector.mask.containsOnlyInt(classWorld)) {
       return null;
     }
     if (!selector.isCall && !selector.isOperator) return null;
     if (!arguments.named.isEmpty) return null;
     if (arguments.positional.length > 1) return null;
 
-    ClassElement uint31Implementation = compiler.backend.uint31Implementation;
-    bool isInt(info) => info.type.containsOnlyInt(compiler);
+    ClassElement uint31Implementation = classWorld.backend.uint31Implementation;
+    bool isInt(info) => info.type.containsOnlyInt(classWorld);
     bool isEmpty(info) => info.type == emptyType;
     bool isUInt31(info) {
-      return info.type.satisfies(uint31Implementation, compiler);
+      return info.type.satisfies(uint31Implementation, classWorld);
     }
     bool isPositiveInt(info) {
       return info.type.satisfies(
-          compiler.backend.positiveIntImplementation, compiler);
+          classWorld.backend.positiveIntImplementation, classWorld);
     }
 
     String name = selector.name;
@@ -655,7 +655,6 @@
 
     Compiler compiler = inferrer.compiler;
     Selector selectorToUse = typedSelector.extendIfReachesAll(compiler);
-
     bool canReachAll = compiler.enabledInvokeOn &&
         (selectorToUse != typedSelector);
 
@@ -917,8 +916,23 @@
     addAssignment(narrowedType);
   }
 
+  addAssignment(TypeInformation info) {
+    super.addAssignment(info);
+    assert(assignments.length == 1);
+  }
+
   TypeMask refine(TypeGraphInferrerEngine inferrer) {
-    return assignments[0].type.intersection(typeAnnotation, inferrer.compiler);
+    TypeMask input = assignments[0].type;
+    TypeMask intersection = input.intersection(typeAnnotation,
+        inferrer.classWorld);
+    if (_ANOMALY_WARN) {
+      if (!input.containsMask(intersection, inferrer.classWorld) ||
+          !typeAnnotation.containsMask(intersection, inferrer.classWorld)) {
+        print("ANOMALY WARNING: narrowed $input to $intersection via "
+            "$typeAnnotation");
+      }
+    }
+    return intersection;
   }
 
   String toString() {
@@ -1159,7 +1173,7 @@
       for (var key in typeInfoMap.keys) {
         TypeInformation value = typeInfoMap[key];
         if (!mask.typeMap.containsKey(key) &&
-            !value.type.containsAll(inferrer.compiler) &&
+            !value.type.containsAll(inferrer.classWorld) &&
             !value.type.isNullable) {
           return toTypeMask(inferrer);
         }
diff --git a/sdk/lib/_internal/compiler/implementation/js/builder.dart b/sdk/lib/_internal/compiler/implementation/js/builder.dart
index 11347fe..4995c8c 100644
--- a/sdk/lib/_internal/compiler/implementation/js/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/builder.dart
@@ -292,15 +292,14 @@
 
   /// Creates a literal js string from [value].
   LiteralString escapedString(String value) {
+   // Start by escaping the backslashes.
+    String escaped = value.replaceAll('\\', '\\\\');
     // Do not escape unicode characters and ' because they are allowed in the
     // string literal anyway.
-    String escaped =
-        value.replaceAllMapped(new RegExp('\n|"|\\|\0|\b|\t|\v'), (match) {
+    escaped = escaped.replaceAllMapped(new RegExp('\n|"|\b|\t|\v'), (match) {
       switch (match.group(0)) {
         case "\n" : return r"\n";
-        case "\\" : return r"\\";
         case "\"" : return r'\"';
-        case "\0" : return r"\0";
         case "\b" : return r"\b";
         case "\t" : return r"\t";
         case "\f" : return r"\f";
diff --git a/sdk/lib/_internal/compiler/implementation/js/js.dart b/sdk/lib/_internal/compiler/implementation/js/js.dart
index 03700c7..94cae0f 100644
--- a/sdk/lib/_internal/compiler/implementation/js/js.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/js.dart
@@ -8,6 +8,8 @@
 import '../util/characters.dart' as charCodes;
 import '../util/util.dart';
 
+import '../js_emitter/js_emitter.dart' show USE_NEW_EMITTER;
+
 // TODO(floitsch): remove this dependency (currently necessary for the
 // CodeBuffer).
 import '../dart2jslib.dart' as leg;
diff --git a/sdk/lib/_internal/compiler/implementation/js/nodes.dart b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
index db260db..3f75313 100644
--- a/sdk/lib/_internal/compiler/implementation/js/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/nodes.dart
@@ -807,7 +807,8 @@
 }
 
 class VariableDeclaration extends VariableReference {
-  VariableDeclaration(String name) : super(name);
+  final bool allowRename;
+  VariableDeclaration(String name, {this.allowRename: true}) : super(name);
 
   accept(NodeVisitor visitor) => visitor.visitVariableDeclaration(this);
   VariableDeclaration _clone() => new VariableDeclaration(name);
@@ -1051,6 +1052,7 @@
 class InterpolatedParameter extends Expression
     implements Parameter, InterpolatedNode {
   final name;
+  bool get allowRename => false;
 
   InterpolatedParameter(this.name);
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index 448e5f1..1a512cf 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -67,7 +67,11 @@
           // parsing error is avoided, so we can only do this trick if the
           // next line is not something that can be glued onto a valid
           // expression to make a new valid expression.
-          if (expressionContinuationRegExp.hasMatch(str)) {
+
+          // If we're using the new emitter where most pretty printed code
+          // is escaped in strings, it is a lot easier to deal with semicolons
+          // than newlines because the former doesn't need escaping.
+          if (USE_NEW_EMITTER || expressionContinuationRegExp.hasMatch(str)) {
             outBuffer.add(";");
           } else {
             outBuffer.add("\n");
@@ -966,7 +970,7 @@
   void visitThis(This node) {}
 
   void visitVariableDeclaration(VariableDeclaration decl) {
-    vars.add(decl.name);
+    if (decl.allowRename) vars.add(decl.name);
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js/template.dart b/sdk/lib/_internal/compiler/implementation/js/template.dart
index 94024d3..1c56d37 100644
--- a/sdk/lib/_internal/compiler/implementation/js/template.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/template.dart
@@ -213,8 +213,8 @@
       Parameter toParameter(item) {
         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');
+        return error('Interpolated value #$position is not a Parameter or '
+                     'List of Parameters: $value');
       }
       if (value is Iterable) return value.map(toParameter);
       return toParameter(value);
@@ -251,8 +251,8 @@
         Statement toStatement(item) {
           if (item is Statement) return item;
           if (item is Expression) return item.toStatement();;
-          error('Interpolated value #$position is not '
-              'a Statement or List of Statements: $value');
+          return error('Interpolated value #$position is not '
+                       'a Statement or List of Statements: $value');
         }
         if (value is Iterable) return value.map(toStatement);
         return toStatement(value);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index bf436d2..cff6083 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -173,12 +173,59 @@
   TypeMask get dynamicType => compiler.typesTask.dynamicType;
   TypeMask get nullType => compiler.typesTask.nullType;
   TypeMask get emptyType => const TypeMask.nonNullEmpty();
-  TypeMask indexablePrimitiveType;
-  TypeMask readableArrayType;
-  TypeMask mutableArrayType;
-  TypeMask fixedArrayType;
-  TypeMask extendableArrayType;
-  TypeMask nonNullType;
+
+  TypeMask _indexablePrimitiveTypeCache;
+  TypeMask get indexablePrimitiveType {
+    if (_indexablePrimitiveTypeCache == null) {
+      _indexablePrimitiveTypeCache =
+          new TypeMask.nonNullSubtype(jsIndexableClass, compiler.world);
+    }
+    return _indexablePrimitiveTypeCache;
+  }
+
+  TypeMask _readableArrayTypeCache;
+  TypeMask get readableArrayType {
+    if (_readableArrayTypeCache == null) {
+      _readableArrayTypeCache = new TypeMask.nonNullSubclass(jsArrayClass,
+          compiler.world);
+    }
+    return _readableArrayTypeCache;
+  }
+
+  TypeMask _mutableArrayTypeCache;
+  TypeMask get mutableArrayType {
+    if (_mutableArrayTypeCache == null) {
+      _mutableArrayTypeCache = new TypeMask.nonNullSubclass(jsMutableArrayClass,
+          compiler.world);
+    }
+    return _mutableArrayTypeCache;
+  }
+
+  TypeMask _fixedArrayTypeCache;
+  TypeMask get fixedArrayType {
+    if (_fixedArrayTypeCache == null) {
+      _fixedArrayTypeCache = new TypeMask.nonNullExact(jsFixedArrayClass);
+    }
+    return _fixedArrayTypeCache;
+  }
+
+  TypeMask _extendableArrayTypeCache;
+  TypeMask get extendableArrayType {
+    if (_extendableArrayTypeCache == null) {
+      _extendableArrayTypeCache =
+          new TypeMask.nonNullExact(jsExtendableArrayClass);
+    }
+    return _extendableArrayTypeCache;
+  }
+
+  TypeMask _nonNullTypeCache;
+  TypeMask get nonNullType {
+    if (_nonNullTypeCache == null) {
+      _nonNullTypeCache =
+          compiler.typesTask.dynamicType.nonNullable();
+    }
+    return _nonNullTypeCache;
+  }
 
   /// Maps special classes to their implementation (JSXxx) class.
   Map<ClassElement, ClassElement> implementationClasses;
@@ -505,7 +552,7 @@
 
     if (elements == null) return false;
     if (elements.isEmpty) return false;
-    return elements.any((element) => selector.applies(element, compiler));
+    return elements.any((element) => selector.applies(element, compiler.world));
   }
 
   final Map<String, Set<ClassElement>> interceptedClassesCache =
@@ -539,17 +586,14 @@
   }
 
   Set<ClassElement> nativeSubclassesOfMixin(ClassElement mixin) {
-    Set<MixinApplicationElement> uses = compiler.world.mixinUses[mixin];
-    if (uses == null) return null;
+    Iterable<MixinApplicationElement> uses = compiler.world.mixinUsesOf(mixin);
     Set<ClassElement> result = null;
     for (MixinApplicationElement use in uses) {
       Iterable<ClassElement> subclasses = compiler.world.subclassesOf(use);
-      if (subclasses != null) {
-        for (ClassElement subclass in subclasses) {
-          if (Elements.isNativeOrExtendsNative(subclass)) {
-            if (result == null) result = new Set<ClassElement>();
-            result.add(subclass);
-          }
+      for (ClassElement subclass in subclasses) {
+        if (Elements.isNativeOrExtendsNative(subclass)) {
+          if (result == null) result = new Set<ClassElement>();
+          result.add(subclass);
         }
       }
     }
@@ -848,15 +892,19 @@
     enqueueInResolution(getCopyTypeArguments(), registry);
   }
 
-  void registerGenericCallMethod(Element callMethod,
-                                 Enqueuer enqueuer, Registry registry) {
+  void registerCallMethodWithFreeTypeVariables(
+      Element callMethod,
+      Enqueuer enqueuer,
+      Registry registry) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
       registerComputeSignature(enqueuer, registry);
     }
   }
 
-  void registerGenericClosure(Element closure,
-                              Enqueuer enqueuer, Registry registry) {
+  void registerClosureWithFreeTypeVariables(
+      Element closure,
+      Enqueuer enqueuer,
+      Registry registry) {
     if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
       registerComputeSignature(enqueuer, registry);
     }
@@ -939,9 +987,11 @@
     enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
-  void enableNoSuchMethod(context, Enqueuer world) {
+  void enableNoSuchMethod(Element context, Enqueuer world) {
     enqueue(world, getCreateInvocationMirror(), compiler.globalDependencies);
     world.registerInvocation(compiler.noSuchMethodSelector);
+    // TODO(tyoverby): Send the context element to DumpInfoTask to be
+    // blamed.
   }
 
   void enableIsolateSupport(Enqueuer enqueuer) {
@@ -1703,13 +1753,6 @@
         ..add(jsInterceptorClass)
         ..add(jsNullClass);
 
-    indexablePrimitiveType = new TypeMask.nonNullSubtype(jsIndexableClass);
-    readableArrayType = new TypeMask.nonNullSubclass(jsArrayClass);
-    mutableArrayType = new TypeMask.nonNullSubclass(jsMutableArrayClass);
-    fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
-    extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
-    nonNullType = compiler.typesTask.dynamicType.nonNullable();
-
     validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
     // The null-interceptor must also implement *all* methods.
     validateInterceptorImplementsAllObjectMethods(jsNullClass);
@@ -1967,17 +2010,20 @@
     // abstract class any user-defined class can implement. So we also
     // check for the interface [JavaScriptIndexingBehavior].
     return compiler.typedDataClass != null
-        && mask.satisfies(compiler.typedDataClass, compiler)
-        && mask.satisfies(jsIndexingBehaviorInterface, compiler);
+        && mask.satisfies(compiler.typedDataClass, compiler.world)
+        && mask.satisfies(jsIndexingBehaviorInterface, compiler.world);
   }
 
   bool couldBeTypedArray(TypeMask mask) {
     bool intersects(TypeMask type1, TypeMask type2) =>
-        !type1.intersection(type2, compiler).isEmpty;
-
-    return compiler.typedDataClass != null
-        && intersects(mask, new TypeMask.subtype(compiler.typedDataClass))
-        && intersects(mask, new TypeMask.subtype(jsIndexingBehaviorInterface));
+        !type1.intersection(type2, compiler.world).isEmpty;
+    // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
+    //               jsIndexingBehaviourInterface.
+    return compiler.typedDataClass != null &&
+           intersects(mask, new TypeMask.subtype(compiler.typedDataClass,
+                                                 compiler.world)) &&
+           intersects(mask, new TypeMask.subtype(jsIndexingBehaviorInterface,
+                                                 compiler.world));
   }
 
   /// Returns all static fields that are referenced through [targetsUsed].
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 d19369a..9ee8974 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -337,7 +337,7 @@
 
   jsAst.Expression visitConstructed(ConstructedConstant constant) {
     Element element = constant.type.element;
-    if (element.isForeign(compiler)
+    if (element.isForeign(backend)
         && element.name == 'JS_CONST') {
       StringConstant str = constant.fields[0];
       String value = str.value.slowToString();
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index 30836e4..b9c668f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -25,8 +25,6 @@
 import '../util/characters.dart';
 import '../util/util.dart';
 
-import '../dump_info.dart';
-
 part 'backend.dart';
 part 'checked_mode_helpers.dart';
 part 'constant_emitter.dart';
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 21bdcc3..f465267 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -127,12 +127,10 @@
       classesNeedingRti.add(cls);
 
       // TODO(ngeoffray): This should use subclasses, not subtypes.
-      Set<ClassElement> classes = compiler.world.subtypesOf(cls);
-      if (classes != null) {
-        classes.forEach((ClassElement sub) {
-          potentiallyAddForRti(sub);
-        });
-      }
+      Iterable<ClassElement> classes = compiler.world.subtypesOf(cls);
+      classes.forEach((ClassElement sub) {
+        potentiallyAddForRti(sub);
+      });
 
       Set<ClassElement> dependencies = rtiDependencies[cls];
       if (dependencies != null) {
@@ -186,8 +184,10 @@
               methodsNeedingRti.add(method);
             }
           }
-          compiler.resolverWorld.genericClosures.forEach(analyzeMethod);
-          compiler.resolverWorld.genericCallMethods.forEach(analyzeMethod);
+          compiler.resolverWorld.closuresWithFreeTypeVariables.forEach(
+              analyzeMethod);
+          compiler.resolverWorld.callMethodsWithFreeTypeVariables.forEach(
+              analyzeMethod);
         }
       }
     });
@@ -200,8 +200,10 @@
           methodsNeedingRti.add(method);
         }
       }
-      compiler.resolverWorld.genericClosures.forEach(analyzeMethod);
-      compiler.resolverWorld.genericCallMethods.forEach(analyzeMethod);
+      compiler.resolverWorld.closuresWithFreeTypeVariables.forEach(
+          analyzeMethod);
+      compiler.resolverWorld.callMethodsWithFreeTypeVariables.forEach(
+          analyzeMethod);
     }
     // Add the classes that need RTI because they use a type variable as
     // expression.
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 277917e..ca0a1e4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -477,7 +477,7 @@
     assert(field.isField);
     if (fieldAccessNeverThrows(field)) return false;
     return backend.shouldRetainGetter(field)
-        || compiler.codegenWorld.hasInvokedGetter(field, compiler);
+        || compiler.codegenWorld.hasInvokedGetter(field, compiler.world);
   }
 
   bool fieldNeedsSetter(VariableElement field) {
@@ -485,7 +485,7 @@
     if (fieldAccessNeverThrows(field)) return false;
     return (!field.isFinal && !field.isConst)
         && (backend.shouldRetainSetter(field)
-            || compiler.codegenWorld.hasInvokedSetter(field, compiler));
+            || compiler.codegenWorld.hasInvokedSetter(field, compiler.world));
   }
 
   // We never access a field in a closure (a captured variable) without knowing
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 800b63e..45af651 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
@@ -4,6 +4,8 @@
 
 part of dart2js.js_emitter;
 
+const USE_NEW_EMITTER = const bool.fromEnvironment("dart2js.use.new.emitter");
+
 /**
  * Generates the code for all used classes in the program. Static fields (even
  * in classes) are ignored, since they can be treated as non-class elements.
@@ -597,8 +599,7 @@
                 // Use try-finally, not try-catch/throw as it destroys the
                 // stack trace.
                 if (result === sentinelUndefined)
-                  if ($isolate[fieldName] === sentinelInProgress)
-                    $isolate[fieldName] = null;
+                  $isolate[fieldName] = null;
               }
             } else {
               if (result === sentinelInProgress)
@@ -1207,7 +1208,7 @@
         if (!element.isNative) continue;
         Element member = element.lookupLocalMember(noSuchMethodName);
         if (member == null) continue;
-        if (noSuchMethodSelector.applies(member, compiler)) {
+        if (noSuchMethodSelector.applies(member, compiler.world)) {
           nativeEmitter.handleNoSuchMethod = true;
           break;
         }
@@ -1336,7 +1337,7 @@
 
     for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
       if (!descriptors.containsKey(outputUnit)) continue;
- 
+
       ClassBuilder descriptor = descriptors[outputUnit];
 
       jsAst.Fun metadata = metadataEmitter.buildMetadataFunction(library);
@@ -1400,12 +1401,17 @@
 
       computeNeededDeclarations();
 
+      if (USE_NEW_EMITTER) {
+        new new_js_emitter.Emitter(compiler, this).emitProgram();
+        return;
+      }
+
       OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
 
       mainBuffer.add(buildGeneratedBy());
       addComment(HOOKS_API_USAGE, mainBuffer);
 
-      if (!compiler.deferredLoadTask.splitProgram) {
+      if (!compiler.deferredLoadTask.isProgramSplit) {
         mainBuffer.add('(function(${namer.currentIsolate})$_{$n');
       }
 
@@ -1704,7 +1710,7 @@
           buildPrecompiledFunction();
       emitInitFunction(mainBuffer);
       emitMain(mainBuffer);
-      if (!compiler.deferredLoadTask.splitProgram) {
+      if (!compiler.deferredLoadTask.isProgramSplit) {
         mainBuffer.add('})()\n');
       } else {
         mainBuffer.add('\n');
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 d9f1537..c256b0d 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -217,7 +217,7 @@
     Set<Selector> untypedSelectors = new Set<Selector>();
     if (selectors != null) {
       for (Selector selector in selectors) {
-        if (!selector.appliesUnnamed(member, compiler)) continue;
+        if (!selector.appliesUnnamed(member, compiler.world)) continue;
         if (untypedSelectors.add(selector.asUntyped)) {
           // TODO(ahe): Is the last argument to [addParameterStub] needed?
           addParameterStub(member, selector, defineStub, new Set<String>());
@@ -232,7 +232,7 @@
           selector = new Selector.call(
               member.name, member.library,
               selector.argumentCount, selector.namedArguments);
-          if (!selector.appliesUnnamed(member, compiler)) continue;
+          if (!selector.appliesUnnamed(member, compiler.world)) continue;
           if (untypedSelectors.add(selector)) {
             // TODO(ahe): Is the last argument to [addParameterStub] needed?
             addParameterStub(member, selector, defineStub, new Set<String>());
@@ -280,7 +280,7 @@
     // stubs.
     Set<Selector> generatedSelectors = new Set<Selector>();
     for (Selector selector in selectors) {
-      if (selector.applies(member, compiler)) {
+      if (selector.applies(member, compiler.world)) {
         selector = selector.asUntyped;
         if (generatedSelectors.contains(selector)) continue;
         generatedSelectors.add(selector);
@@ -369,7 +369,7 @@
       } else {
         // Careful with operators.
         canTearOff =
-            compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
+            compiler.codegenWorld.hasInvokedGetter(member, compiler.world) ||
             (canBeReflected && !member.isOperator);
         assert(!needsSuperGetter(member) || canTearOff);
         tearOffName = namer.getterName(member);
@@ -436,8 +436,7 @@
 
     String callSelectorString = 'null';
     if (member.isFunction) {
-      Selector callSelector =
-          new Selector.fromElement(member, compiler).toCallSelector();
+      Selector callSelector = new Selector.fromElement(member).toCallSelector();
       callSelectorString = '"${namer.invocationName(callSelector)}"';
     }
 
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 4f3e694..f51a7b9be 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
@@ -256,9 +256,10 @@
       //    }
       bool containsArray = classes.contains(backend.jsArrayClass);
       bool containsString = classes.contains(backend.jsStringClass);
-      bool containsJsIndexable = classes.any((cls) {
-        return compiler.world.isSubtype(
-            backend.jsIndexingBehaviorInterface, cls);
+      bool containsJsIndexable =
+          backend.jsIndexingBehaviorInterface.isResolved && classes.any((cls) {
+        return compiler.world.isSubtypeOf(cls,
+            backend.jsIndexingBehaviorInterface);
       });
       // The index set operator requires a check on its set value in
       // checked mode, so we don't optimize the interceptor if the
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
index 7199112..56beb9f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
@@ -8,6 +8,8 @@
 
 import '../js/js.dart' as jsAst;
 
+import '../new_js_emitter/emitter.dart' as new_js_emitter;
+
 import '../closure.dart' show
     ClosureClassElement,
     ClosureClassMap,
@@ -39,7 +41,7 @@
     TypeChecks,
     TypeVariableHandler;
 
-import '../helpers/helpers.dart';
+import '../helpers/helpers.dart';  // Included for debug helpers.
 
 import '../source_file.dart' show
     SourceFile,
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
index 0ec41fb..eaa84c7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
@@ -37,10 +37,10 @@
       for (Selector selector in selectors) {
         TypeMask mask = selector.mask;
         if (mask == null) {
-          mask = new TypeMask.subclass(compiler.objectClass);
+          mask = new TypeMask.subclass(compiler.objectClass, compiler.world);
         }
 
-        if (!mask.needsNoSuchMethodHandling(selector, compiler)) continue;
+        if (!mask.needsNoSuchMethodHandling(selector, compiler.world)) continue;
         String jsName = namer.invocationMirrorInternalName(selector);
         addedJsNames[jsName] = selector;
         String reflectionName = task.getReflectionName(selector, jsName);
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 3ec8830..407ec71 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
@@ -394,7 +394,8 @@
         return false;
       } else if (function.isInstanceMember) {
         if (!function.enclosingClass.isClosure) {
-          return compiler.codegenWorld.hasInvokedGetter(function, compiler);
+          return compiler.codegenWorld.hasInvokedGetter(
+              function, compiler.world);
         }
       }
       return false;
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index f10becf..1217a11 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -22,7 +22,7 @@
          ErroneousElementX,
          LibraryElementX,
          PrefixElementX;
-import 'helpers/helpers.dart';
+import 'helpers/helpers.dart';  // Included for debug helpers.
 import 'native_handler.dart' as native;
 import 'tree/tree.dart';
 import 'util/util.dart' show Link, LinkBuilder;
@@ -498,23 +498,33 @@
       return new Future.value(library);
     }
     return compiler.withCurrentElement(importingLibrary, () {
-      return compiler.readScript(node, readableUri)
-          .then((Script script) {
-            if (script == null) return null;
-            LibraryElement element = new LibraryElementX(script, resolvedUri);
-            compiler.withCurrentElement(element, () {
-              handler.registerNewLibrary(element);
-              native.maybeEnableNative(compiler, element);
-              libraryCanonicalUriMap[resolvedUri] = element;
-              compiler.scanner.scanLibrary(element);
-            });
-            return processLibraryTags(handler, element).then((_) {
-              compiler.withCurrentElement(element, () {
-                handler.registerLibraryExports(element);
-              });
-              return element;
-            });
+      return compiler.readScript(node, readableUri).then((Script script) {
+        if (script == null) return null;
+        LibraryElement element =
+            createLibrarySync(handler, script, resolvedUri);
+        return processLibraryTags(handler, element).then((_) {
+          compiler.withCurrentElement(element, () {
+            handler.registerLibraryExports(element);
           });
+          return element;
+        });
+      });
+    });
+  }
+
+  LibraryElement createLibrarySync(
+      LibraryDependencyHandler handler,
+      Script script,
+      Uri resolvedUri) {
+    LibraryElement element = new LibraryElementX(script, resolvedUri);
+    return compiler.withCurrentElement(element, () {
+      if (handler != null) {
+        handler.registerNewLibrary(element);
+        libraryCanonicalUriMap[resolvedUri] = element;
+      }
+      native.maybeEnableNative(compiler, element);
+      compiler.scanner.scanLibrary(element);
+      return element;
     });
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart b/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart
new file mode 100644
index 0000000..dc1ca83
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart
@@ -0,0 +1,154 @@
+// 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.new_js_emitter.emitter;
+
+import 'model.dart';
+import '../common.dart';
+import '../js/js.dart' as js;
+
+import '../js_backend/js_backend.dart' show Namer, JavaScriptBackend;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
+import '../universe/universe.dart' show Universe;
+import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
+
+part 'registry.dart';
+
+class Emitter {
+  final Compiler _compiler;
+  final CodeEmitterTask _oldEmitter;
+
+  final Registry _registry;
+
+  Emitter(Compiler compiler, this._oldEmitter)
+      : this._compiler = compiler,
+        this._registry = new Registry(compiler.deferredLoadTask);
+
+  JavaScriptBackend get backend => _compiler.backend;
+  Namer get namer => _oldEmitter.namer;
+  Universe get universe => _compiler.codegenWorld;
+
+  /// Mapping from [ClassElement] to constructed [Class]. We need this to
+  /// update the superclass in the [Class].
+  final Map<ClassElement, Class> _classes = <ClassElement, Class>{};
+
+  void emitProgram() {
+    Program program = _buildProgram();
+    program.emit(_compiler);
+  }
+
+  Program _buildProgram() {
+    Set<ClassElement> neededClasses = _oldEmitter.neededClasses;
+    Iterable<Element> neededStatics = backend.generatedCode.keys
+        .where((Element e) => !e.isInstanceMember && !e.isField);
+
+    Elements.sortedByPosition(neededClasses).forEach(_registry.registerElement);
+    Elements.sortedByPosition(neededStatics).forEach(_registry.registerElement);
+
+    // TODO(kasperl): There's code that implicitly needs access to the special
+    // $ holder so we have to register that. Can we track if we have to?
+    _registry.registerHolder(r'$');
+
+    MainOutput mainOutput = _buildMainOutput(_registry.mainFragment);
+    Iterable<Output> deferredOutputs = _registry.deferredFragments
+        .skip(1) // Skip the main library elements.
+        .map((fragment) => _buildDeferredOutput(mainOutput, fragment));
+
+    List<Output> outputs = new List<Output>(_registry.fragmentCount);
+    outputs[0] = mainOutput;
+    outputs.setAll(1, deferredOutputs);
+
+    Program result = new Program(outputs);
+
+    // Resolve the superclass references after we've processed all the classes.
+    _classes.forEach((ClassElement element, Class c) {
+      if (element.superclass != null) {
+        c.setSuperclass(_classes[element.superclass]);
+      }
+    });
+    return result;
+  }
+
+  MainOutput _buildMainOutput(Fragment fragment) {
+    // Construct the main output from the libraries and the registered holders.
+    return new MainOutput(
+        namer.elementAccess(_compiler.mainFunction),
+        _buildLibraries(fragment),
+        _registry.holders.toList(growable: false));
+  }
+
+  DeferredOutput _buildDeferredOutput(MainOutput mainOutput,
+                                      Fragment fragment) {
+    return new DeferredOutput(mainOutput, _buildLibraries(fragment));
+  }
+
+  List<Library> _buildLibraries(Fragment fragment) {
+    List<Library> libraries = new List<Library>(fragment.length);
+    int count = 0;
+    fragment.forEach((LibraryElement library, List<Element> elements) {
+      libraries[count++] = _buildLibrary(library, elements);
+    });
+    return libraries;
+  }
+
+  // Note that a library-element may have multiple [Library]s, if it is split
+  // into multiple output units.
+  Library _buildLibrary(LibraryElement library, List<Element> elements) {
+    String uri = library.canonicalUri.toString();
+
+    List<StaticMethod> statics = elements
+        .where((e) => e is FunctionElement).map(_buildStaticMethod).toList();
+
+    statics.addAll(elements
+        .where((e) => e is FunctionElement)
+        .where((e) => universe.staticFunctionsNeedingGetter.contains(e))
+        .map(_buildStaticMethodTearOff));
+
+    List<Class> classes = elements
+        .where((e) => e is ClassElement)
+        .map(_buildClass)
+        .toList(growable: false);
+
+    return new Library(uri, statics, classes);
+  }
+
+  Class _buildClass(ClassElement element) {
+    List<Method> methods = [];
+    void visitMember(ClassElement enclosing, Element member) {
+      assert(invariant(element, member.isDeclaration));
+      if (!member.isAbstract && member.isInstanceMember && member.isFunction) {
+        js.Expression code = backend.generatedCode[member];
+        // TODO(kasperl): Figure out under which conditions code is null.
+        if (code != null) methods.add(_buildMethod(member, code));
+      }
+    }
+    ClassElement implementation = element.implementation;
+    implementation.forEachMember(visitMember, includeBackendMembers: true);
+    String name = namer.getNameOfClass(element);
+    String holder = namer.globalObjectFor(element);
+    Class result = new Class(name, _registry.registerHolder(holder), methods);
+    _classes[element] = result;
+    return result;
+  }
+
+  Method _buildMethod(FunctionElement element, js.Expression code) {
+    String name = namer.getNameOfInstanceMember(element);
+    return new Method(name, code);
+  }
+
+  StaticMethod _buildStaticMethod(FunctionElement element) {
+    String name = namer.getNameOfMember(element);
+    String holder = namer.globalObjectFor(element);
+    js.Expression code = backend.generatedCode[element];
+    return new StaticMethod(name, _registry.registerHolder(holder), code);
+  }
+
+  StaticMethod _buildStaticMethodTearOff(FunctionElement element) {
+    String name = namer.getStaticClosureName(element);
+    String holder = namer.globalObjectFor(element);
+    // TODO(kasperl): This clearly doesn't work yet.
+    js.Expression code = js.js.string("<<unimplemented>>");
+    return new StaticMethod(name, _registry.registerHolder(holder), code);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/new_js_emitter/model.dart b/sdk/lib/_internal/compiler/implementation/new_js_emitter/model.dart
new file mode 100644
index 0000000..c902087
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/new_js_emitter/model.dart
@@ -0,0 +1,265 @@
+// 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.new_js_emitter.model;
+
+import '../dart2jslib.dart' show Compiler;
+import '../js/js.dart' as js;
+
+js.LiteralString unparse(Compiler compiler, js.Expression value) {
+  String text = js.prettyPrint(value, compiler).getText();
+  if (value is js.Fun) text = '($text)';
+  return js.js.escapedString(text);
+}
+
+class Program {
+  final List<Output> outputs;
+  Program(this.outputs);
+
+  void emit(Compiler compiler) {
+    MainOutput mainUnit = outputs.first;
+    String mainCode = js.prettyPrint(mainUnit.emit(compiler), compiler)
+        .getText();
+    compiler.outputProvider('', 'js')
+        ..add(_buildGeneratedBy(compiler))
+        ..add(mainCode)
+        ..close();
+    compiler.assembledCode = mainCode;
+
+    outputs.skip(1).forEach((DeferredOutput deferredUnit) {
+      String code = js.prettyPrint(deferredUnit.emit(compiler), compiler)
+          .getText();
+      compiler.outputProvider('', 'js')
+          ..add(code)
+          ..close();
+    });
+  }
+
+  String _buildGeneratedBy(compiler) {
+    var suffix = '';
+    if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}';
+    return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
+  }
+}
+
+class Holder {
+  final String name;
+  final int index;
+  Holder(this.name, this.index);
+}
+
+abstract class Output {
+  bool get isMainOutput => mainOutput == this;
+  MainOutput get mainOutput;
+  final List<Library> libraries;
+
+  Output(this.libraries);
+}
+
+class MainOutput extends Output {
+  final js.Expression main;
+  final List<Holder> holders;
+
+  MainOutput(this.main, List<Library> libraries, this.holders)
+      : super(libraries);
+
+  MainOutput get mainOutput => this;
+
+  js.Expression emit(Compiler compiler) {
+    js.Expression program = new js.ArrayInitializer.from(
+        libraries.map((e) => e.emit(compiler)));
+    return js.js(boilerplate, [emitHolders(), main, program]);
+  }
+
+  js.Block emitHolders() {
+    // The top-level variables for holders must *not* be renamed by the
+    // JavaScript pretty printer because a lot of code already uses the
+    // non-renamed names. The generated code looks like this:
+    //
+    //    var H = {}, ..., G = {};
+    //    var holders = [ H, ..., G ];
+    //
+    // and it is inserted at the top of the top-level function expression
+    // that covers the entire program.
+
+    List<js.Statement> statements = [
+        new js.ExpressionStatement(
+            new js.VariableDeclarationList(holders.map((e) =>
+                new js.VariableInitialization(
+                    new js.VariableDeclaration(e.name, allowRename: false),
+                    new js.ObjectInitializer(const []))).toList())),
+        js.js.statement('var holders = #', new js.ArrayInitializer.from(
+            holders.map((e) => new js.VariableUse(e.name))))
+    ];
+    return new js.Block(statements);
+  }
+}
+
+class DeferredOutput extends Output {
+  final MainOutput mainOutput;
+
+  List<Holder> get holders => mainOutput.holders;
+
+  DeferredOutput(this.mainOutput, List<Library> libraries)
+      : super(libraries);
+
+  js.Expression emit(Compiler compiler) {
+    throw "Unimplemented";
+  }
+}
+
+class Library {
+  final String uri;
+  final List<StaticMethod> statics;
+  final List<Class> classes;
+  Library(this.uri, this.statics, this.classes);
+
+  js.Expression emit(Compiler compiler) {
+    Iterable staticDescriptors = statics.expand((e) =>
+        [ js.string(e.name), js.js.number(e.holder.index), e.emit(compiler) ]);
+    Iterable classDescriptors = classes.expand((e) =>
+        [ js.string(e.name), js.js.number(e.holder.index), e.emit(compiler) ]);
+
+    js.Expression staticArray = new js.ArrayInitializer.from(staticDescriptors);
+    js.Expression classArray = new js.ArrayInitializer.from(classDescriptors);
+
+    return new js.ArrayInitializer.from([staticArray, classArray]);
+  }
+}
+
+class Class {
+  final String name;
+  final Holder holder;
+  Class superclass;
+  final List<Method> methods;
+  Class(this.name, this.holder, this.methods);
+
+  void setSuperclass(Class superclass) {
+    this.superclass = superclass;
+  }
+
+  String get superclassName
+      => (superclass == null) ? "" : superclass.name;
+  int get superclassHolderIndex
+      => (superclass == null) ? 0 : superclass.holder.index;
+
+  js.Expression emit(Compiler compiler) {
+    List elements = [ js.string(superclassName),
+                      js.js.number(superclassHolderIndex) ];
+    elements.addAll(methods.expand((e) => [ js.string(e.name), e.code ]));
+    return unparse(compiler, new js.ArrayInitializer.from(elements));
+  }
+}
+
+class Method {
+  final String name;
+  final js.Expression code;
+  Method(this.name, this.code);
+}
+
+class StaticMethod extends Method {
+  final Holder holder;
+  StaticMethod(String name, this.holder, js.Expression code)
+      : super(name, code);
+
+  js.Expression emit(Compiler compiler) {
+    return unparse(compiler, code);
+  }
+}
+
+final String boilerplate = r"""
+!function(start, program) {
+
+  // Initialize holder objects.
+  #;
+
+  function setupProgram() {
+    for (var i = 0; i < program.length; i++) {
+      setupLibrary(program[i]);
+    }
+  }
+
+  function setupLibrary(library) {
+    var statics = library[0];
+    for (var i = 0; i < statics.length; i += 3) {
+      var holderIndex = statics[i + 1];
+      setupStatic(statics[i], holders[holderIndex], statics[i + 2]);
+    }
+
+    var classes = library[1];
+    for (var i = 0; i < classes.length; i += 3) {
+      var holderIndex = classes[i + 1];
+      setupClass(classes[i], holders[holderIndex], classes[i + 2]);
+    }
+  }
+
+  function setupStatic(name, holder, descriptor) {
+    holder[name] = function() {
+      var method = compile(descriptor);
+      holder[name] = method;
+      return method.apply(this, arguments);
+    };
+  }
+
+  function setupClass(name, holder, descriptor) {
+    var resolve = function() {
+      var constructor = compileConstructor(name, descriptor);
+      holder[name] = constructor;
+      return constructor;
+    };
+
+    var patch = function() {
+      var constructor = resolve();
+      var object = new constructor();
+      constructor.apply(object, arguments);
+      return object;
+    };
+
+    // We store the resolve function on the patch function to make it possible
+    // to resolve superclass references without constructing instances. The
+    // resolve property also serves as a marker that indicates whether or not
+    // a class has been resolved yet.
+    patch.resolve = resolve;
+    holder[name] = patch;
+  }
+
+  function compileConstructor(name, descriptor) {
+    descriptor = compile(descriptor);
+    var prototype = determinePrototype(descriptor);
+    for (var i = 2; i < descriptor.length; i += 2) {
+      prototype[descriptor[i]] = descriptor[i + 1];
+    }
+    var result = function() { };  // TODO(kasperl): Compile.
+    result.prototype = prototype;
+    return result;
+  }
+
+  function determinePrototype(descriptor) {
+    var superclassName = descriptor[0];
+    if (!superclassName) return { };
+
+    // Look up the superclass constructor function in the right holder.
+    var holderIndex = descriptor[1];
+    var superclass = holders[holderIndex][superclassName];
+    if (superclass.resolve) superclass = superclass.resolve();
+
+    // Create a new prototype object chained to the superclass prototype.
+    var intermediate = function() { };
+    intermediate.prototype = superclass.prototype;
+    return new intermediate();
+  }
+
+  function compile(s) {
+    'use strict';
+    return eval(s);
+  }
+
+  setupProgram();
+  var end = Date.now();
+  print('Setup: ' + (end - start) + ' ms.');
+
+  if (true) #();
+
+}(Date.now(), #)
+""";
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart b/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart
new file mode 100644
index 0000000..cc8b230
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.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.
+
+part of dart2js.new_js_emitter.emitter;
+
+/// A Fragment maps [LibraryElement]s to their [Element]s.
+///
+/// Fundamentally, this class is a `Map<LibraryElement, List<Element>>`.
+class Fragment {
+  final Map<LibraryElement, List<Element>> _mapping = <LibraryElement,
+      List<Element>>{};
+
+  // It is very common to access the same library multiple times in a row, so
+  // we cache the last access.
+  LibraryElement _lastLibrary;
+  List<Element> _lastElements;
+
+  void add(LibraryElement library, Element element) {
+    if (_lastLibrary != library) {
+      _lastLibrary = library;
+      _lastElements = _mapping.putIfAbsent(library, () => <Element>[]);
+    }
+    _lastElements.add(element);
+  }
+
+  int get length => _mapping.length;
+
+  void forEach(void f(LibraryElement library, List<Element> elements)) {
+    _mapping.forEach(f);
+  }
+}
+
+class Registry {
+  final DeferredLoadTask _deferredLoadTask;
+  final Map<String, Holder> _holdersMap = <String, Holder>{};
+  final Map<OutputUnit, Fragment> _fragmentsMap = <OutputUnit, Fragment>{};
+
+  Iterable<Holder> get holders => _holdersMap.values;
+  Iterable<Fragment> get deferredFragments => _fragmentsMap.values.skip(1);
+  int get fragmentCount => _fragmentsMap.length;
+
+  /// A fastpath for `_libraryElements[_mainOutputUnit]`.
+  final Fragment mainFragment = new Fragment();
+
+  Registry(this._deferredLoadTask) {
+    _fragmentsMap[_mainOutputUnit] = mainFragment;
+  }
+
+  bool get _isProgramSplit => _deferredLoadTask.isProgramSplit;
+  OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit;
+
+  Fragment _computeTargetFragment(Element element) {
+    if (!_isProgramSplit) return mainFragment;
+    OutputUnit targetUnit = _deferredLoadTask.outputUnitForElement(element);
+    return (targetUnit == _mainOutputUnit)
+        ? mainFragment
+        : _fragmentsMap.putIfAbsent(targetUnit, () => new Fragment());
+  }
+
+  /// Adds the element to the list of elements of the library in the right
+  /// fragment.
+  void registerElement(Element element) {
+    _computeTargetFragment(element).add(element.library, element);
+  }
+
+  Holder registerHolder(String name) {
+    return _holdersMap.putIfAbsent(
+        name,
+        () => new Holder(name, _holdersMap.length));
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index 22c2d9d..2e7c423 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -117,7 +117,7 @@
 import 'dart:async';
 
 import "dart2jslib.dart" as leg;  // CompilerTask, Compiler.
-import "helpers/helpers.dart";
+import "helpers/helpers.dart";  // Included for debug helpers.
 import "scanner/scannerlib.dart";  // Scanner, Parsers, Listeners
 import "elements/elements.dart";
 import "elements/modelx.dart"
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
index 8bd0042..5e753f8 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
@@ -19,7 +19,7 @@
          MessageKind,
          invariant,
          isPrivateName;
-import '../helpers/helpers.dart';
+import '../helpers/helpers.dart';  // Included for debug helpers.
 import '../util/util.dart';
 
 part 'member_impl.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 56941d8..d9ffe9d 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -712,13 +712,11 @@
         ClassElement enclosingClass = element.enclosingClass;
         if (enclosingClass != null) {
           // TODO(johnniwinther): Find another way to obtain mixin uses.
-          Set<MixinApplicationElement> mixinUses =
-              compiler.world.mixinUses[enclosingClass];
-          if (mixinUses != null) {
-            ClassElement mixin = enclosingClass;
-            for (MixinApplicationElement mixinApplication in mixinUses) {
-              checkMixinSuperUses(resolutionTree, mixinApplication, mixin);
-            }
+          Iterable<MixinApplicationElement> mixinUses =
+              compiler.world.mixinUsesOf(enclosingClass);
+          ClassElement mixin = enclosingClass;
+          for (MixinApplicationElement mixinApplication in mixinUses) {
+            checkMixinSuperUses(resolutionTree, mixinApplication, mixin);
           }
         }
         return resolutionTree;
@@ -746,6 +744,9 @@
     }
     ResolverVisitor visitor = visitorFor(element);
     ResolutionRegistry registry = visitor.registry;
+    // TODO(johnniwinther): Maybe remove this when placeholderCollector migrates
+    // to the backend ast.
+    registry.defineElement(tree.definitions.nodes.head, element);
     // TODO(johnniwinther): Share the resolved type between all variables
     // declared in the same declaration.
     if (tree.type != null) {
@@ -1612,7 +1613,8 @@
       visitor.compiler.reportError(
           diagnosticNode, kind, {'constructorName': fullConstructorName});
     } else {
-      if (!call.applies(lookedupConstructor, visitor.compiler)) {
+      lookedupConstructor.computeSignature(visitor.compiler);
+      if (!call.applies(lookedupConstructor, visitor.compiler.world)) {
         MessageKind kind = isImplicitSuperCall
                            ? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT
                            : MessageKind.NO_MATCHING_CONSTRUCTOR;
@@ -2387,7 +2389,10 @@
     Link<Node> parameterNodes = (node.parameters == null)
         ? const Link<Node>() : node.parameters.nodes;
     functionParameters.forEachParameter((ParameterElement element) {
-      if (element == functionParameters.optionalParameters.head) {
+      // TODO(karlklose): should be a list of [FormalElement]s, but the actual
+      // implementation uses [Element].
+      Link<Element> optionals = functionParameters.optionalParameters;
+      if (!optionals.isEmpty && element == optionals.head) {
         NodeList nodes = parameterNodes.head;
         parameterNodes = nodes.nodes;
       }
@@ -2596,7 +2601,7 @@
       }
       // TODO(johnniwinther): Ensure correct behavior if currentClass is a
       // patch.
-      target = currentClass.lookupSuperSelector(selector, compiler);
+      target = currentClass.lookupSuperSelector(selector);
       // [target] may be null which means invoking noSuchMethod on
       // super.
       if (target == null) {
@@ -2896,19 +2901,25 @@
         // 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.
-      } else if (!selector.applies(target, compiler)) {
-        registry.registerThrowNoSuchMethod();
-        if (node.isSuperCall) {
-          // Similar to what we do when we can't find super via selector
-          // in [resolveSend] above, we still need to register the invocation,
-          // because we might call [:super.noSuchMethod:] which calls
-          // [JSInvocationMirror._invokeOn].
-          registry.registerDynamicInvocation(selector);
-          registry.registerSuperNoSuchMethod();
+      } else {
+        if (target is FunctionElement) {
+          FunctionElement function = target;
+          function.computeSignature(compiler);
+        }
+        if (!selector.applies(target, compiler.world)) {
+          registry.registerThrowNoSuchMethod();
+          if (node.isSuperCall) {
+            // Similar to what we do when we can't find super via selector
+            // in [resolveSend] above, we still need to register the invocation,
+            // because we might call [:super.noSuchMethod:] which calls
+            // [JSInvocationMirror._invokeOn].
+            registry.registerDynamicInvocation(selector);
+            registry.registerSuperNoSuchMethod();
+          }
         }
       }
 
-      if (target != null && target.isForeign(compiler)) {
+      if (target != null && target.isForeign(compiler.backend)) {
         if (selector.name == 'JS') {
           registry.registerJsCall(node, this);
         } else if (selector.name == 'JS_INTERCEPTOR_CONSTANT') {
@@ -3011,7 +3022,7 @@
       registerSend(getterSelector, getter);
       registry.setGetterSelectorInComplexSendSet(node, getterSelector);
       if (node.isSuperCall) {
-        getter = currentClass.lookupSuperSelector(getterSelector, compiler);
+        getter = currentClass.lookupSuperSelector(getterSelector);
         if (getter == null) {
           target = warnAndCreateErroneousElement(
               node, selector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
@@ -3269,7 +3280,8 @@
     if (Elements.isUnresolved(constructor)) {
       return new ElementResult(constructor);
     }
-    if (!callSelector.applies(constructor, compiler)) {
+    constructor.computeSignature(compiler);
+    if (!callSelector.applies(constructor, compiler.world)) {
       registry.registerThrowNoSuchMethod();
     }
 
@@ -3717,7 +3729,6 @@
     Map<String, LabelDefinition> continueLabels = <String, LabelDefinition>{};
 
     Link<Node> cases = node.cases.nodes;
-    SwitchCase switchCase = cases.head;
     CaseMatch firstCase = null;
     DartType firstCaseType = null;
     bool hasReportedProblem = false;
@@ -4220,8 +4231,10 @@
             kind, arguments, '', element);
         registry.registerThrowNoSuchMethod();
       } else {
+        ConstructorElement superConstructor = superMember;
         Selector callToMatch = new Selector.call("", element.library, 0);
-        if (!callToMatch.applies(superMember, compiler)) {
+        superConstructor.computeSignature(compiler);
+        if (!callToMatch.applies(superConstructor, compiler.world)) {
           MessageKind kind = MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT;
           compiler.reportError(node, kind);
           superMember = new ErroneousElementX(kind, {}, '', element);
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
index 59d9920..605eaf2 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -31,6 +31,10 @@
 
   /// Register [node] as the declaration of [element].
   void defineFunction(FunctionExpression node, FunctionElement element) {
+    // TODO(sigurdm): Remove when not needed by the dart2dart backend.
+    if (node.name != null) {
+      mapping[node.name] = element;
+    }
     mapping[node] = element;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 22596d4..468473e 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -634,13 +634,13 @@
     return skipToEof(token);
   }
 
-  Link<Token> expectedDeclaration(Token token) {
+  Token expectedDeclaration(Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
     } else {
       error("expected a declaration, but got '${token.value}'", token);
     }
-    return const Link<Token>();
+    return skipToEof(token);
   }
 
   Token unmatched(Token token) {
@@ -1213,14 +1213,14 @@
     return unexpected(token);
   }
 
-  Link<Token> expectedDeclaration(Token token) {
+  Token expectedDeclaration(Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
     } else {
       reportFatalError(token,
                        "Expected a declaration, but got '${token.value}'.");
     }
-    return const Link<Token>();
+    return skipToEof(token);
   }
 
   Token unmatched(Token token) {
@@ -1604,6 +1604,7 @@
   Token expectedClassBody(Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
+      return skipToEof(token);
     } else {
       reportFatalError(token,
                        "Expected a class body, but got '${token.value}'.");
@@ -2168,7 +2169,7 @@
   }
 }
 
-abstract class PartialElement implements Element {
+abstract class PartialElement {
   Token get beginToken;
   Token get endToken;
 
@@ -2253,16 +2254,17 @@
   }
 }
 
-class PartialFieldList extends VariableList {
+class PartialFieldList extends VariableList with PartialElement {
   final Token beginToken;
   final Token endToken;
-  final bool hasParseError;
 
   PartialFieldList(this.beginToken,
                    this.endToken,
                    Modifiers modifiers,
-                   this.hasParseError)
-      : super(modifiers);
+                   bool hasParseError)
+      : super(modifiers) {
+    super.hasParseError = hasParseError;
+  }
 
   VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
     if (definitions != null) return definitions;
@@ -2364,7 +2366,8 @@
     doParse(new Parser(listener));
   } on ParserError catch (e) {
     if (element is PartialElement) {
-      element.hasParseError = true;
+      PartialElement partial = element as PartialElement;
+      partial.hasParseError = true;
     }
     return new ErrorNode(element.position, e.reason);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index e6163a9..33fbfeb 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -656,7 +656,7 @@
 
     Link<Token> identifiers = findMemberName(token);
     if (identifiers.isEmpty) {
-      return listener.unexpected(start);
+      return listener.expectedDeclaration(start);
     }
     Token name = identifiers.head;
     identifiers = identifiers.tail;
@@ -905,7 +905,7 @@
       }
       token = token.next;
     }
-    return listener.expectedDeclaration(start);
+    return const Link<Token>();
   }
 
   Token parseVariableInitializerOpt(Token token) {
@@ -1076,7 +1076,7 @@
 
     Link<Token> identifiers = findMemberName(token);
     if (identifiers.isEmpty) {
-      return listener.unexpected(start);
+      return listener.expectedDeclaration(start);
     }
     Token name = identifiers.head;
     Token afterName = name.next;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index 34cac3a..8a38802 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -628,7 +628,8 @@
         hasDigits = true;
       } else {
         if (!hasDigits) {
-          return unterminated('0x');
+          unterminated('0x', shouldAdvance: false);
+          return next;
         }
         appendSubstringToken(HEXADECIMAL_INFO, start, true);
         return next;
@@ -949,7 +950,6 @@
 
   int tokenizeSingleLineRawString(int next, int quoteChar, int start) {
     bool asciiOnly = true;
-    next = advance(); // Advance past the quote.
     while (next != $EOF) {
       if (identical(next, quoteChar)) {
         if (!asciiOnly) handleUnicode(start);
@@ -1078,6 +1078,7 @@
     return unterminated(
         new String.fromCharCodes([quoteChar, quoteChar, quoteChar]));
   }
+
   int unterminatedRawMultiLineString(int quoteChar) {
     return unterminated(
         'r${new String.fromCharCodes([quoteChar, quoteChar, quoteChar])}');
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index a4594ad2..af0048d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -1118,7 +1118,7 @@
       Selector selector,
       FunctionElement function,
       List<HInstruction> providedArguments) {
-    assert(selector.applies(function, compiler));
+    assert(selector.applies(function, compiler.world));
     FunctionSignature signature = function.functionSignature;
     List<HInstruction> compiledArguments = new List<HInstruction>(
         signature.parameterCount + 1); // Plus one for receiver.
@@ -1205,7 +1205,7 @@
       assert(selector != null
              || Elements.isStaticOrTopLevel(element)
              || element.isGenerativeConstructorBody);
-      if (selector != null && !selector.applies(function, compiler)) {
+      if (selector != null && !selector.applies(function, compiler.world)) {
         return false;
       }
 
@@ -1400,9 +1400,9 @@
         // of the class that mixins the enclosing class. These two
         // classes do not have a subclass relationship, so, for
         // simplicity, we mark the type as an interface type.
-        result = new TypeMask.nonNullSubtype(cls.declaration);
+        result = new TypeMask.nonNullSubtype(cls.declaration, compiler.world);
       } else {
-        result = new TypeMask.nonNullSubclass(cls.declaration);
+        result = new TypeMask.nonNullSubclass(cls.declaration, compiler.world);
       }
       cachedTypeOfThis = result;
     }
@@ -1768,7 +1768,7 @@
           target,
           compileArgument,
           handleConstantForOptionalParameter,
-          compiler);
+          compiler.world);
       if (!match) {
         // If this fails, the selector we constructed for the call to a
         // forwarding constructor in a mixin application did not match the
@@ -1848,7 +1848,7 @@
                                     target.implementation,
                                     null,
                                     handleConstantForOptionalParameter,
-                                    compiler);
+                                    compiler.world);
         inlineSuperOrRedirect(target,
                               arguments,
                               constructors,
@@ -2252,7 +2252,7 @@
     type = type.unalias(compiler);
     assert(assertTypeInContext(type, original));
     if (type.isInterfaceType && !type.treatAsRaw) {
-      TypeMask subtype = new TypeMask.subtype(type.element);
+      TypeMask subtype = new TypeMask.subtype(type.element, compiler.world);
       HInstruction representations = buildTypeArgumentRepresentations(type);
       add(representations);
       return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
@@ -2912,7 +2912,7 @@
 
     Element methodElement = nestedClosureData.closureElement;
     if (compiler.backend.methodNeedsRti(methodElement)) {
-      registry.registerGenericClosure(methodElement);
+      registry.registerClosureWithFreeTypeVariables(methodElement);
     }
   }
 
@@ -3052,7 +3052,7 @@
   }
 
   void generateGetter(ast.Send send, Element element) {
-    if (element != null && element.isForeign(compiler)) {
+    if (element != null && element.isForeign(backend)) {
       visitForeignGetter(send);
     } else if (Elements.isStaticOrTopLevelField(element)) {
       Constant value;
@@ -3078,7 +3078,8 @@
         // does not look at elements in the list.
         TypeMask type =
             TypeMaskFactory.inferredTypeForElement(element, compiler);
-        if (!type.containsAll(compiler) && !instruction.isConstantNull()) {
+        if (!type.containsAll(compiler.world) &&
+            !instruction.isConstantNull()) {
           // TODO(13429): The inferrer should know that an element
           // cannot be null.
           instruction.instructionType = type.nonNullable();
@@ -3305,7 +3306,7 @@
       add(representations);
       String operator = backend.namer.operatorIs(element);
       HInstruction isFieldName = addConstantString(operator);
-      HInstruction asFieldName = compiler.world.hasAnySubtype(element)
+      HInstruction asFieldName = compiler.world.hasAnyStrictSubtype(element)
           ? addConstantString(backend.namer.substitutionName(element))
           : graph.addConstantNull(compiler);
       List<HInstruction> inputs = <HInstruction>[expression,
@@ -3331,7 +3332,7 @@
   }
 
   HInstruction buildFunctionType(FunctionType type) {
-    type.accept(new TypeBuilder(), this);
+    type.accept(new TypeBuilder(compiler.world), this);
     return pop();
   }
 
@@ -3391,7 +3392,7 @@
                                        element,
                                        compileArgument,
                                        handleConstantForOptionalParameter,
-                                       compiler);
+                                       compiler.world);
   }
 
   void addGenericSendArgumentsToList(Link<ast.Node> link, List<HInstruction> list) {
@@ -3855,7 +3856,7 @@
     if (node.isPropertyAccess) {
       push(buildInvokeSuper(selector, element, inputs));
     } else if (element.isFunction || element.isGenerativeConstructor) {
-      if (selector.applies(element, compiler)) {
+      if (selector.applies(element, compiler.world)) {
         // TODO(5347): Try to avoid the need for calling [implementation] before
         // calling [addStaticSendArgumentsToList].
         FunctionElement function = element.implementation;
@@ -3882,8 +3883,8 @@
   bool needsSubstitutionForTypeVariableAccess(ClassElement cls) {
     if (compiler.world.isUsedAsMixin(cls)) return true;
 
-    Set<ClassElement> subclasses = compiler.world.subclassesOf(cls);
-    return subclasses != null && subclasses.any((ClassElement subclass) {
+    Iterable<ClassElement> subclasses = compiler.world.strictSubclassesOf(cls);
+    return subclasses.any((ClassElement subclass) {
       return !rti.isTrivialSubstitution(subclass, cls);
     });
   }
@@ -4075,13 +4076,13 @@
         isFixedList = true;
         TypeMask inferred =
             TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
-        return inferred.containsAll(compiler)
+        return inferred.containsAll(compiler.world)
             ? backend.fixedArrayType
             : inferred;
       } else if (isGrowableListConstructorCall) {
         TypeMask inferred =
             TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
-        return inferred.containsAll(compiler)
+        return inferred.containsAll(compiler.world)
             ? backend.extendableArrayType
             : inferred;
       } else if (Elements.isConstructorOfTypedArraySubclass(
@@ -4091,7 +4092,7 @@
             TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
         ClassElement cls = element.enclosingClass;
         assert(cls.thisType.element.isNative);
-        return inferred.containsAll(compiler)
+        return inferred.containsAll(compiler.world)
             ? new TypeMask.nonNullExact(cls.thisType.element)
             : inferred;
       } else if (element.isGenerativeConstructor) {
@@ -4312,7 +4313,7 @@
     if (elements.isAssert(node)) {
       element = backend.assertMethod;
     }
-    if (element.isForeign(compiler) && element.isFunction) {
+    if (element.isForeign(backend) && element.isFunction) {
       visitForeignSend(node);
       return;
     }
@@ -4539,11 +4540,11 @@
       if (isLength || selector.isIndex) {
         TypeMask type = new TypeMask.nonNullExact(
             element.enclosingClass.declaration);
-        return type.satisfies(backend.jsIndexableClass, compiler);
+        return type.satisfies(backend.jsIndexableClass, compiler.world);
       } else if (selector.isIndexSet) {
         TypeMask type = new TypeMask.nonNullExact(
             element.enclosingClass.declaration);
-        return type.satisfies(backend.jsMutableIndexableClass, compiler);
+        return type.satisfies(backend.jsMutableIndexableClass, compiler.world);
       } else {
         return false;
       }
@@ -4730,7 +4731,7 @@
       }
       Selector setterSelector = elements.getSelector(node);
       if (Elements.isUnresolved(element)
-          || !setterSelector.applies(element, compiler)) {
+          || !setterSelector.applies(element, compiler.world)) {
         generateSuperNoSuchMethodSend(
             node, setterSelector, setterInputs);
         pop();
@@ -5031,7 +5032,7 @@
 
     TypeMask type =
         TypeMaskFactory.inferredForNode(sourceElement, node, compiler);
-    if (!type.containsAll(compiler)) instruction.instructionType = type;
+    if (!type.containsAll(compiler.world)) instruction.instructionType = type;
     stack.add(instruction);
   }
 
@@ -5264,10 +5265,12 @@
     // The instruction type will always be a subtype of the mapLiteralClass, but
     // type inference might discover a more specific type, or find nothing (in
     // dart2js unit tests).
-    TypeMask mapType = new TypeMask.nonNullSubtype(backend.mapLiteralClass);
+    TypeMask mapType =
+        new TypeMask.nonNullSubtype(backend.mapLiteralClass, compiler.world);
     TypeMask returnTypeMask = TypeMaskFactory.inferredReturnTypeForElement(
         constructor, compiler);
-    TypeMask instructionType = mapType.intersection(returnTypeMask, compiler);
+    TypeMask instructionType =
+        mapType.intersection(returnTypeMask, compiler.world);
 
     addInlinedInstantiation(expectedType);
     pushInvokeStatic(node, constructor, inputs, instructionType);
@@ -5935,9 +5938,9 @@
     // directly.
     Selector selector =
         new TypedSelector(expression.instructionType,
-            new Selector.call('toString', null, 0), compiler);
+            new Selector.call('toString', null, 0), compiler.world);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
-    if (type.containsOnlyString(compiler)) {
+    if (type.containsOnlyString(compiler.world)) {
       builder.pushInvokeDynamic(node, selector, <HInstruction>[expression]);
       append(builder.pop());
       return;
@@ -6358,6 +6361,10 @@
 }
 
 class TypeBuilder implements DartTypeVisitor<dynamic, SsaBuilder> {
+  final World world;
+
+  TypeBuilder(this.world);
+
   void visitType(DartType type, _) {
     throw 'Internal error $type';
   }
@@ -6370,7 +6377,7 @@
   void visitTypeVariableType(TypeVariableType type,
                              SsaBuilder builder) {
     ClassElement cls = builder.backend.findHelper('RuntimeType');
-    TypeMask instructionType = new TypeMask.subclass(cls);
+    TypeMask instructionType = new TypeMask.subclass(cls, world);
     if (!builder.sourceElement.enclosingElement.isClosure &&
         builder.sourceElement.isInstanceMember) {
       HInstruction receiver = builder.localsHandler.readThis();
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 72a6060..d34a26d 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1576,7 +1576,7 @@
       // invoke dynamic knows more than the receiver.
       ClassElement enclosing = node.element.enclosingClass;
       TypeMask receiverType = new TypeMask.nonNullExact(enclosing.declaration);
-      return new TypedSelector(receiverType, selector, compiler);
+      return new TypedSelector(receiverType, selector, compiler.world);
     }
     // If [JSInvocationMirror._invokeOn] is enabled, and this call
     // might hit a `noSuchMethod`, we register an untyped selector.
@@ -1674,7 +1674,7 @@
         // [world]. The emitter needs to know if it needs to emit a
         // bound closure for a method.
         TypeMask receiverType = new TypeMask.nonNullExact(superClass);
-        selector = new TypedSelector(receiverType, selector, compiler);
+        selector = new TypedSelector(receiverType, selector, compiler.world);
         // TODO(floitsch): we know the target. We shouldn't register a
         // dynamic getter.
         registry.registerDynamicGetter(selector);
@@ -2465,39 +2465,40 @@
   }
 
   js.Expression generateTest(HInstruction input, TypeMask checkedType) {
+    ClassWorld classWorld = compiler.world;
     TypeMask receiver = input.instructionType;
     // Figure out if it is beneficial to turn this into a null check.
     // V8 generally prefers 'typeof' checks, but for integers and
     // indexable primitives we cannot compile this test into a single
     // typeof check so the null check is cheaper.
     bool turnIntoNumCheck = input.isIntegerOrNull(compiler)
-        && checkedType.containsOnlyInt(compiler);
+        && checkedType.containsOnlyInt(classWorld);
     bool turnIntoNullCheck = !turnIntoNumCheck
         && (checkedType.nullable() == receiver)
-        && (checkedType.containsOnlyInt(compiler)
-            || checkedType.satisfies(backend.jsIndexableClass, compiler));
+        && (checkedType.containsOnlyInt(classWorld)
+            || checkedType.satisfies(backend.jsIndexableClass, classWorld));
     js.Expression test;
     if (turnIntoNullCheck) {
       use(input);
       test = new js.Binary("==", pop(), new js.LiteralNull());
-    } else if (checkedType.containsOnlyInt(compiler) && !turnIntoNumCheck) {
+    } else if (checkedType.containsOnlyInt(classWorld) && !turnIntoNumCheck) {
       // input is !int
       checkInt(input, '!==');
       test = pop();
-    } else if (checkedType.containsOnlyNum(compiler) || turnIntoNumCheck) {
+    } else if (checkedType.containsOnlyNum(classWorld) || turnIntoNumCheck) {
       // input is !num
       checkNum(input, '!==');
       test = pop();
-    } else if (checkedType.containsOnlyBool(compiler)) {
+    } else if (checkedType.containsOnlyBool(classWorld)) {
       // input is !bool
       checkBool(input, '!==');
       test = pop();
-    } else if (checkedType.containsOnlyString(compiler)) {
+    } else if (checkedType.containsOnlyString(classWorld)) {
       // input is !string
       checkString(input, '!==');
       test = pop();
     } else if (checkedType.satisfies(backend.jsExtendableArrayClass,
-                                     compiler)) {
+                                     classWorld)) {
       // input is !Object || input is !Array || input.isFixed
       checkObject(input, '!==');
       js.Expression objectTest = pop();
@@ -2506,7 +2507,7 @@
       checkFixedArray(input);
       test = new js.Binary('||', objectTest, arrayTest);
       test = new js.Binary('||', test, pop());
-    } else if (checkedType.satisfies(backend.jsMutableArrayClass, compiler)) {
+    } else if (checkedType.satisfies(backend.jsMutableArrayClass, classWorld)) {
       // input is !Object
       // || ((input is !Array || input.isImmutable)
       //     && input is !JsIndexingBehavior)
@@ -2521,7 +2522,7 @@
           ? new js.Binary('&&', notArrayOrImmutable, pop())
           : notArrayOrImmutable;
       test = new js.Binary('||', objectTest, notIndexing);
-    } else if (checkedType.satisfies(backend.jsArrayClass, compiler)) {
+    } else if (checkedType.satisfies(backend.jsArrayClass, classWorld)) {
       // input is !Object
       // || (input is !Array && input is !JsIndexingBehavior)
       checkObject(input, '!==');
@@ -2533,7 +2534,7 @@
           ? new js.Binary('&&', arrayTest, pop())
           : arrayTest;
       test = new js.Binary('||', objectTest, notIndexing);
-    } else if (checkedType.satisfies(backend.jsIndexableClass, compiler)) {
+    } else if (checkedType.satisfies(backend.jsIndexableClass, classWorld)) {
       // input is !String
       // && (input is !Object
       //     || (input is !Array && input is !JsIndexingBehavior))
@@ -2558,9 +2559,10 @@
 
   void visitTypeConversion(HTypeConversion node) {
     if (node.isArgumentTypeCheck || node.isReceiverTypeCheck) {
+      ClassWorld classWorld = compiler.world;
       // An int check if the input is not int or null, is not
       // sufficient for doing a argument or receiver check.
-      assert(!node.checkedType.containsOnlyInt(compiler) ||
+      assert(!node.checkedType.containsOnlyInt(classWorld) ||
              node.checkedInput.isIntegerOrNull(compiler));
       js.Expression test = generateTest(node.checkedInput, node.checkedType);
       js.Block oldContainer = currentContainer;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 7a1b241..1846bd2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -67,6 +67,8 @@
   bool canUseSelfForInterceptor(HInstruction receiver,
                                 Set<ClassElement> interceptedClasses) {
     JavaScriptBackend backend = compiler.backend;
+    ClassWorld classWorld = compiler.world;
+
     if (receiver.canBePrimitive(compiler)) {
       // Primitives always need interceptors.
       return false;
@@ -79,8 +81,8 @@
 
     // All intercepted classes extend `Interceptor`, so if the receiver can't be
     // a class extending `Interceptor` then it can be called directly.
-    return new TypeMask.nonNullSubclass(backend.jsInterceptorClass)
-        .intersection(receiver.instructionType, compiler)
+    return new TypeMask.nonNullSubclass(backend.jsInterceptorClass, classWorld)
+        .intersection(receiver.instructionType, classWorld)
         .isEmpty;
   }
 
@@ -95,6 +97,7 @@
     }
 
     ClassElement constantInterceptor;
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     if (input.canBeNull()) {
       if (input.isNull()) {
@@ -129,7 +132,7 @@
       // for a subclass or call methods defined on a subclass.  Provided the
       // code is completely insensitive to the specific instance subclasses, we
       // can use the non-leaf class directly.
-      ClassElement element = input.instructionType.singleClass(compiler);
+      ClassElement element = input.instructionType.singleClass(classWorld);
       if (element != null && element.isNative) {
         constantInterceptor = element;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index 8904866..288bee3 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -108,7 +108,7 @@
     TypeMask receiverType =
         instruction.getDartReceiver(compiler).instructionType;
     Selector refined = new TypedSelector(receiverType, instruction.selector,
-        compiler);
+        compiler.world);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(refined, compiler);
     return new HIndex(
         instruction.inputs[1], instruction.inputs[2],
@@ -234,7 +234,7 @@
         selector.argumentCount);
     return selector.mask == null
         ? newSelector
-        : new TypedSelector(selector.mask, newSelector, compiler);
+        : new TypedSelector(selector.mask, newSelector, compiler.world);
   }
 }
 
@@ -636,9 +636,9 @@
     if (right.isConstantNull() || left.isPrimitiveOrNull(compiler)) {
       return newBuiltinVariant(instruction, compiler);
     }
-    Selector selector =
-        new TypedSelector(instructionType, instruction.selector, compiler);
     World world = compiler.world;
+    Selector selector =
+        new TypedSelector(instructionType, instruction.selector, world);
     JavaScriptBackend backend = compiler.backend;
     Iterable<Element> matches = world.allFunctions.filter(selector);
     // This test relies the on `Object.==` and `Interceptor.==` always being
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 5987b54..ec6c70b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -866,33 +866,37 @@
   }
 
   bool canBePrimitiveNumber(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     // TODO(sra): It should be possible to test only jsDoubleClass and
     // jsUInt31Class, since all others are superclasses of these two.
-    return instructionType.contains(backend.jsNumberClass, compiler)
-        || instructionType.contains(backend.jsIntClass, compiler)
-        || instructionType.contains(backend.jsPositiveIntClass, compiler)
-        || instructionType.contains(backend.jsUInt32Class, compiler)
-        || instructionType.contains(backend.jsUInt31Class, compiler)
-        || instructionType.contains(backend.jsDoubleClass, compiler);
+    return instructionType.contains(backend.jsNumberClass, classWorld)
+        || instructionType.contains(backend.jsIntClass, classWorld)
+        || instructionType.contains(backend.jsPositiveIntClass, classWorld)
+        || instructionType.contains(backend.jsUInt32Class, classWorld)
+        || instructionType.contains(backend.jsUInt31Class, classWorld)
+        || instructionType.contains(backend.jsDoubleClass, classWorld);
   }
 
   bool canBePrimitiveBoolean(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.contains(backend.jsBoolClass, compiler);
+    return instructionType.contains(backend.jsBoolClass, classWorld);
   }
 
   bool canBePrimitiveArray(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.contains(backend.jsArrayClass, compiler)
-        || instructionType.contains(backend.jsFixedArrayClass, compiler)
-        || instructionType.contains(backend.jsExtendableArrayClass, compiler);
+    return instructionType.contains(backend.jsArrayClass, classWorld)
+        || instructionType.contains(backend.jsFixedArrayClass, classWorld)
+        || instructionType.contains(backend.jsExtendableArrayClass, classWorld);
   }
 
   bool isIndexablePrimitive(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.containsOnlyString(compiler)
-        || instructionType.satisfies(backend.jsIndexableClass, compiler);
+    return instructionType.containsOnlyString(classWorld)
+        || instructionType.satisfies(backend.jsIndexableClass, classWorld);
   }
 
   bool isFixedArray(Compiler compiler) {
@@ -906,93 +910,112 @@
   }
 
   bool isMutableArray(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.satisfies(backend.jsMutableArrayClass, compiler);
+    return instructionType.satisfies(backend.jsMutableArrayClass, classWorld);
   }
 
   bool isReadableArray(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.satisfies(backend.jsArrayClass, compiler);
+    return instructionType.satisfies(backend.jsArrayClass, classWorld);
   }
 
   bool isMutableIndexable(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.satisfies(backend.jsMutableIndexableClass, compiler);
+    return instructionType.satisfies(
+        backend.jsMutableIndexableClass, classWorld);
   }
 
   bool isArray(Compiler compiler) => isReadableArray(compiler);
 
   bool canBePrimitiveString(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.contains(backend.jsStringClass, compiler);
+    return instructionType.contains(backend.jsStringClass, classWorld);
   }
 
   bool isInteger(Compiler compiler) {
-    return instructionType.containsOnlyInt(compiler)
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyInt(classWorld)
         && !instructionType.isNullable;
   }
 
   bool isUInt32(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     return !instructionType.isNullable
-        && instructionType.satisfies(backend.jsUInt32Class, compiler);
+        && instructionType.satisfies(backend.jsUInt32Class, classWorld);
   }
 
   bool isUInt31(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     return !instructionType.isNullable
-        && instructionType.satisfies(backend.jsUInt31Class, compiler);
+        && instructionType.satisfies(backend.jsUInt31Class, classWorld);
   }
 
   bool isPositiveInteger(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     return !instructionType.isNullable
-        && instructionType.satisfies(backend.jsPositiveIntClass, compiler);
+        && instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
   }
 
   bool isPositiveIntegerOrNull(Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
-    return instructionType.satisfies(backend.jsPositiveIntClass, compiler);
+    return instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
   }
 
   bool isIntegerOrNull(Compiler compiler) {
-    return instructionType.containsOnlyInt(compiler);
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyInt(classWorld);
   }
 
   bool isNumber(Compiler compiler) {
-    return instructionType.containsOnlyNum(compiler)
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyNum(classWorld)
         && !instructionType.isNullable;
   }
 
   bool isNumberOrNull(Compiler compiler) {
-    return instructionType.containsOnlyNum(compiler);
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyNum(classWorld);
   }
 
   bool isDouble(Compiler compiler) {
-    return instructionType.containsOnlyDouble(compiler)
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyDouble(classWorld)
         && !instructionType.isNullable;
   }
 
   bool isDoubleOrNull(Compiler compiler) {
-    return instructionType.containsOnlyDouble(compiler);
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyDouble(classWorld);
   }
 
   bool isBoolean(Compiler compiler) {
-    return instructionType.containsOnlyBool(compiler)
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyBool(classWorld)
         && !instructionType.isNullable;
   }
 
   bool isBooleanOrNull(Compiler compiler) {
-    return instructionType.containsOnlyBool(compiler);
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyBool(classWorld);
   }
 
   bool isString(Compiler compiler) {
-    return instructionType.containsOnlyString(compiler)
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyString(classWorld)
         && !instructionType.isNullable;
   }
 
   bool isStringOrNull(Compiler compiler) {
-    return instructionType.containsOnlyString(compiler);
+    ClassWorld classWorld = compiler.world;
+    return instructionType.containsOnlyString(classWorld);
   }
 
   bool isPrimitive(Compiler compiler) {
@@ -1242,7 +1265,8 @@
     } else if (kind == HTypeConversion.CHECKED_MODE_CHECK && !type.treatAsRaw) {
       throw 'creating compound check to $type (this = ${this})';
     } else {
-      TypeMask subtype = new TypeMask.subtype(element.declaration);
+      TypeMask subtype = new TypeMask.subtype(element.declaration,
+                                              compiler.world);
       return new HTypeConversion(type, kind, subtype, this);
     }
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 2201a4a..0f31a5b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -91,12 +91,13 @@
 }
 
 bool isFixedLength(mask, Compiler compiler) {
+  ClassWorld classWorld = compiler.world;
   JavaScriptBackend backend = compiler.backend;
   if (mask.isContainer && mask.length != null) {
     // A container on which we have inferred the length.
     return true;
   } else if (mask.containsOnly(backend.jsFixedArrayClass)
-             || mask.containsOnlyString(compiler)
+             || mask.containsOnlyString(classWorld)
              || backend.isTypedArray(mask)) {
     return true;
   }
@@ -147,7 +148,7 @@
           // If we can replace [instruction] with [replacement], then
           // [replacement]'s type can be narrowed.
           TypeMask newType = replacement.instructionType.intersection(
-              instruction.instructionType, compiler);
+              instruction.instructionType, compiler.world);
           replacement.instructionType = newType;
         }
 
@@ -186,7 +187,7 @@
     if (input.isBoolean(compiler)) return input;
     // All values that cannot be 'true' are boolified to false.
     TypeMask mask = input.instructionType;
-    if (!mask.contains(backend.jsBoolClass, compiler)) {
+    if (!mask.contains(backend.jsBoolClass, compiler.world)) {
       return graph.addConstantBool(false, compiler);
     }
     return node;
@@ -265,12 +266,13 @@
     Selector selector = node.selector;
     HInstruction input = node.inputs[1];
 
+    World world = compiler.world;
     if (selector.isCall || selector.isOperator) {
       Element target;
       if (input.isExtendableArray(compiler)) {
-        if (selector.applies(backend.jsArrayRemoveLast, compiler)) {
+        if (selector.applies(backend.jsArrayRemoveLast, world)) {
           target = backend.jsArrayRemoveLast;
-        } else if (selector.applies(backend.jsArrayAdd, compiler)) {
+        } else if (selector.applies(backend.jsArrayAdd, world)) {
           // The codegen special cases array calls, but does not
           // inline argument type checks.
           if (!compiler.enableTypeAssertions) {
@@ -278,12 +280,12 @@
           }
         }
       } else if (input.isStringOrNull(compiler)) {
-        if (selector.applies(backend.jsStringSplit, compiler)) {
+        if (selector.applies(backend.jsStringSplit, world)) {
           HInstruction argument = node.inputs[2];
           if (argument.isString(compiler)) {
             target = backend.jsStringSplit;
           }
-        } else if (selector.applies(backend.jsStringOperatorAdd, compiler)) {
+        } else if (selector.applies(backend.jsStringOperatorAdd, world)) {
           // `operator+` is turned into a JavaScript '+' so we need to
           // make sure the receiver and the argument are not null.
           // TODO(sra): Do this via [node.specializer].
@@ -293,7 +295,7 @@
             return new HStringConcat(input, argument, null,
                                      node.instructionType);
           }
-        } else if (selector.applies(backend.jsStringToString, compiler)
+        } else if (selector.applies(backend.jsStringToString, world)
                    && !input.canBeNull()) {
           return input;
         }
@@ -313,7 +315,7 @@
         return result;
       }
     } else if (selector.isGetter) {
-      if (selector.asUntyped.applies(backend.jsIndexableLength, compiler)) {
+      if (selector.asUntyped.applies(backend.jsIndexableLength, world)) {
         HInstruction optimized = tryOptimizeLengthInterceptedGetter(node);
         if (optimized != null) return optimized;
       }
@@ -329,8 +331,8 @@
     }
 
     TypeMask receiverType = node.getDartReceiver(compiler).instructionType;
-    Selector selector = new TypedSelector(receiverType, node.selector,
-        compiler);
+    Selector selector =
+        new TypedSelector(receiverType, node.selector, compiler.world);
     Element element = compiler.world.locateSingleElement(selector);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
     if (element != null
@@ -502,7 +504,7 @@
     // Intersection of int and double return conflicting, so
     // we don't optimize on numbers to preserve the runtime semantics.
     if (!(left.isNumberOrNull(compiler) && right.isNumberOrNull(compiler))) {
-      TypeMask intersection = leftType.intersection(rightType, compiler);
+      TypeMask intersection = leftType.intersection(rightType, compiler.world);
       if (intersection.isEmpty && !intersection.isNullable) {
         return graph.addConstantBool(false, compiler);
       }
@@ -588,6 +590,7 @@
       return graph.addConstantBool(true, compiler);
     }
 
+    ClassWorld classWorld = compiler.world;
     HInstruction expression = node.expression;
     if (expression.isInteger(compiler)) {
       if (identical(element, compiler.intClass)
@@ -632,11 +635,12 @@
     } else if (!RuntimeTypes.hasTypeArguments(type)) {
       TypeMask expressionMask = expression.instructionType;
       TypeMask typeMask = (element == compiler.nullClass)
-          ? new TypeMask.subtype(element)
-          : new TypeMask.nonNullSubtype(element);
-      if (expressionMask.union(typeMask, compiler) == typeMask) {
+          ? new TypeMask.subtype(element, classWorld)
+          : new TypeMask.nonNullSubtype(element, classWorld);
+      if (expressionMask.union(typeMask, classWorld) == typeMask) {
         return graph.addConstantBool(true, compiler);
-      } else if (expressionMask.intersection(typeMask, compiler).isEmpty) {
+      } else if (expressionMask.intersection(typeMask,
+                                             compiler.world).isEmpty) {
         return graph.addConstantBool(false, compiler);
       }
     }
@@ -668,20 +672,22 @@
   }
 
   HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) {
-    if (checkedType.containsAll(compiler)) return node;
+    ClassWorld classWorld = compiler.world;
+    if (checkedType.containsAll(classWorld)) return node;
     HInstruction input = node.checkedInput;
     TypeMask inputType = input.instructionType;
-    return inputType.isInMask(checkedType, compiler) ? input : node;
+    return inputType.isInMask(checkedType, classWorld) ? input : node;
   }
 
   VariableElement findConcreteFieldForDynamicAccess(HInstruction receiver,
                                                     Selector selector) {
     TypeMask receiverType = receiver.instructionType;
     return compiler.world.locateSingleField(
-        new TypedSelector(receiverType, selector, compiler));
+        new TypedSelector(receiverType, selector, compiler.world));
   }
 
   HInstruction visitFieldGet(HFieldGet node) {
+    if (node.isNullCheck) return node;
     var receiver = node.receiver;
     if (node.element == backend.jsIndexableLength) {
       JavaScriptItemCompilationContext context = work.compilationContext;
@@ -712,6 +718,21 @@
         }
       }
     }
+
+    // HFieldGet of a constructed constant can be replaced with the constant's
+    // field.
+    if (receiver is HConstant) {
+      Constant constant = receiver.constant;
+      if (constant.isConstructedObject) {
+        ConstructedConstant constructedConstant = constant;
+        Map<Element, Constant> fields = constructedConstant.fieldElements;
+        Constant value = fields[node.element];
+        if (value != null) {
+          return graph.addConstant(value, compiler);
+        }
+      }
+    }
+
     return node;
   }
 
@@ -1615,7 +1636,8 @@
 
     if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
 
-    TypeMask convertedType = new TypeMask.nonNullSubtype(element);
+    TypeMask convertedType =
+        new TypeMask.nonNullSubtype(element, compiler.world);
     HInstruction input = instruction.expression;
 
     for (HIf ifUser in ifUsers) {
@@ -1873,7 +1895,7 @@
     // Typed arrays of different types might have a shared buffer.
     if (couldBeTypedArray(first) && couldBeTypedArray(second)) return true;
     TypeMask intersection = first.instructionType.intersection(
-        second.instructionType, compiler);
+        second.instructionType, compiler.world);
     if (intersection.isEmpty) return false;
     return true;
   }
@@ -2043,7 +2065,7 @@
     if (first == null || second == null) return null;
     if (first == second) return first;
     TypeMask phiType = second.instructionType.union(
-          first.instructionType, compiler);
+          first.instructionType, compiler.world);
     if (first is HPhi && first.block == block) {
       HPhi phi = first;
       phi.addInput(second);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
index 191e07f..9f10f80 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa.dart
@@ -24,9 +24,6 @@
 import '../scanner/scannerlib.dart'
     show PartialFunctionElement, Token, PLUS_TOKEN;
 
-import '../elements/visitor.dart'
-    show ElementVisitor;
-
 import '../elements/modelx.dart'
     show ElementX,
          VariableElementX,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
index 9aa417e..278bc34 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
@@ -145,7 +145,7 @@
       prefix = 'd';
     } else if (instruction.isNumber(compiler)) {
       prefix = 'n';
-    } else if (instruction.instructionType.containsAll(compiler)) {
+    } else if (instruction.instructionType.containsAll(compiler.world)) {
       prefix = 'v';
     } else {
       prefix = 'U';
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types.dart b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
index c88e521..404518ca 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types.dart
@@ -39,12 +39,13 @@
 
   static TypeMask fromNativeBehavior(native.NativeBehavior nativeBehavior,
                                      Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     if (nativeBehavior.typesReturned.isEmpty) return backend.dynamicType;
 
     TypeMask result = nativeBehavior.typesReturned
         .map((type) => fromNativeType(type, compiler))
-        .reduce((t1, t2) => t1.union(t2, compiler));
+        .reduce((t1, t2) => t1.union(t2, classWorld));
     assert(!(result.isEmpty && !result.isNullable));
     return result;
   }
@@ -52,6 +53,7 @@
   // [type] is either an instance of [DartType] or special objects
   // like [native.SpecialType.JsObject].
   static TypeMask fromNativeType(type, Compiler compiler) {
+    ClassWorld classWorld = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     if (type == native.SpecialType.JsObject) {
       return new TypeMask.nonNullExact(compiler.objectClass);
@@ -61,12 +63,8 @@
       return backend.nullType;
     } else if (type.treatAsDynamic) {
       return backend.dynamicType;
-    } else if (compiler.world.hasAnySubtype(type.element)) {
-      return new TypeMask.nonNullSubtype(type.element);
-    } else if (compiler.world.hasAnySubclass(type.element)) {
-      return new TypeMask.nonNullSubclass(type.element);
     } else {
-      return new TypeMask.nonNullExact(type.element);
+      return new TypeMask.nonNullSubtype(type.element, classWorld);
     }
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 618f223..eb21bb4 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -11,10 +11,13 @@
       new Map<HInstruction, Function>();
 
   final Compiler compiler;
+  final ClassWorld classWorld;
   JavaScriptBackend get backend => compiler.backend;
   String get name => 'type propagator';
 
-  SsaTypePropagator(this.compiler);
+  SsaTypePropagator(Compiler compiler)
+      : this.compiler = compiler,
+        this.classWorld = compiler.world;
 
   TypeMask computeType(HInstruction instruction) {
     return instruction.accept(this);
@@ -141,7 +144,7 @@
     TypeMask candidateType = backend.emptyType;
     for (int i = 0, length = phi.inputs.length; i < length; i++) {
       TypeMask inputType = phi.inputs[i].instructionType;
-      candidateType = candidateType.union(inputType, compiler);
+      candidateType = candidateType.union(inputType, classWorld);
     }
     return candidateType;
   }
@@ -154,25 +157,25 @@
       // We must make sure a type conversion for receiver or argument check
       // does not try to do an int check, because an int check is not enough.
       // We only do an int check if the input is integer or null.
-      if (checkedType.containsOnlyNum(compiler)
-          && !checkedType.containsOnlyDouble(compiler)
+      if (checkedType.containsOnlyNum(classWorld)
+          && !checkedType.containsOnlyDouble(classWorld)
           && input.isIntegerOrNull(compiler)) {
         instruction.checkedType = backend.intType;
-      } else if (checkedType.containsOnlyInt(compiler)
+      } else if (checkedType.containsOnlyInt(classWorld)
                  && !input.isIntegerOrNull(compiler)) {
         instruction.checkedType = backend.numType;
       }
     }
 
-    TypeMask outputType = checkedType.intersection(inputType, compiler);
+    TypeMask outputType = checkedType.intersection(inputType, classWorld);
     if (outputType.isEmpty && !outputType.isNullable) {
       // Intersection of double and integer conflicts (is empty), but JS numbers
       // can be both int and double at the same time.  For example, the input
       // can be a literal double '8.0' that is marked as an integer (because 'is
       // int' will return 'true').  What we really need to do is make the
       // overlap between int and double values explicit in the TypeMask system.
-      if (inputType.containsOnlyInt(compiler)
-          && checkedType.containsOnlyDouble(compiler)) {
+      if (inputType.containsOnlyInt(classWorld)
+          && checkedType.containsOnlyDouble(classWorld)) {
         if (inputType.isNullable && checkedType.isNullable) {
           outputType = backend.doubleType.nullable();
         } else {
@@ -185,7 +188,8 @@
 
   TypeMask visitTypeKnown(HTypeKnown instruction) {
     HInstruction input = instruction.checkedInput;
-    return instruction.knownType.intersection(input.instructionType, compiler);
+    return instruction.knownType.intersection(
+        input.instructionType, classWorld);
   }
 
   void convertInput(HInvokeDynamic instruction,
@@ -206,7 +210,7 @@
     // In some cases, we want the receiver to be an integer,
     // but that does not mean we will get a NoSuchMethodError
     // if it's not: the receiver could be a double.
-    if (type.containsOnlyInt(compiler)) {
+    if (type.containsOnlyInt(classWorld)) {
       // If the instruction's type is integer or null, the codegen
       // will emit a null check, which is enough to know if it will
       // hit a noSuchMethod.
@@ -234,12 +238,13 @@
       if (targets.length == 1) {
         Element target = targets.first;
         ClassElement cls = target.enclosingClass;
-        TypeMask type = new TypeMask.nonNullSubclass(cls.declaration);
+        TypeMask type = new TypeMask.nonNullSubclass(
+            cls.declaration, classWorld);
         // TODO(ngeoffray): We currently only optimize on primitive
         // types.
-        if (!type.satisfies(backend.jsIndexableClass, compiler)
-            && !type.containsOnlyNum(compiler)
-            && !type.containsOnlyBool(compiler)) {
+        if (!type.satisfies(backend.jsIndexableClass, classWorld) &&
+            !type.containsOnlyNum(classWorld) &&
+            !type.containsOnlyBool(classWorld)) {
           return false;
         }
         if (!isCheckEnoughForNsmOrAe(receiver, type)) return false;
@@ -321,15 +326,15 @@
 
     HInstruction receiver = instruction.getDartReceiver(compiler);
     TypeMask receiverType = receiver.instructionType;
-    Selector selector = new TypedSelector(receiverType, instruction.selector,
-        compiler);
+    Selector selector =
+        new TypedSelector(receiverType, instruction.selector, classWorld);
     instruction.selector = selector;
 
     // Try to specialize the receiver after this call.
     if (receiver.dominatedUsers(instruction).length != 1
         && !selector.isClosureCall) {
       TypeMask newType = compiler.world.allFunctions.receiverType(selector);
-      newType = newType.intersection(receiverType, compiler);
+      newType = newType.intersection(receiverType, classWorld);
       var next = instruction.next;
       if (next is HTypeKnown && next.checkedInput == receiver) {
         // We already have refined [receiver]. We still update the
diff --git a/sdk/lib/_internal/compiler/implementation/tree/tree.dart b/sdk/lib/_internal/compiler/implementation/tree/tree.dart
index b302f31..f69c3a4 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/tree.dart
@@ -19,4 +19,3 @@
 part 'nodes.dart';
 part 'prettyprint.dart';
 part 'unparser.dart';
-part 'visitors.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/tree/visitors.dart b/sdk/lib/_internal/compiler/implementation/tree/visitors.dart
deleted file mode 100644
index 9096cff..0000000
--- a/sdk/lib/_internal/compiler/implementation/tree/visitors.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-part of tree;
-
-/**
- * This visitor takes another visitor and applies it to every
- * node in the tree. There is currently no way to control the
- * traversal.
- */
-class TraversingVisitor extends Visitor {
-  final Visitor visitor;
-
-  TraversingVisitor(Visitor this.visitor);
-
-  visitNode(Node node) {
-    node.accept(visitor);
-    node.visitChildren(this);
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/tree_validator.dart b/sdk/lib/_internal/compiler/implementation/tree_validator.dart
deleted file mode 100644
index e3dfcc9..0000000
--- a/sdk/lib/_internal/compiler/implementation/tree_validator.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-part of dart2js;
-
-class TreeValidatorTask extends CompilerTask {
-  TreeValidatorTask(Compiler compiler) : super(compiler);
-
-  void validate(Node tree) {
-    assert(check(tree));
-  }
-
-  bool check(Node tree) {
-    List<InvalidNodeError> errors = [];
-    void report(node, message) {
-      final error = new InvalidNodeError(node, message);
-      errors.add(error);
-      compiler.reportWarning(node, MessageKind.GENERIC, {'text': message});
-    };
-    final validator = new ValidatorVisitor(report);
-    tree.accept(new TraversingVisitor(validator));
-
-    return errors.isEmpty;
-  }
-}
-
-class ValidatorVisitor extends Visitor {
-  final Function reportInvalidNode;
-
-  ValidatorVisitor(Function this.reportInvalidNode);
-
-  expect(Node node, bool test, [message]) {
-    if (!test) reportInvalidNode(node, message);
-  }
-
-  visitNode(Node node) {}
-
-  visitSendSet(SendSet node) {
-    final selector = node.selector;
-    final name = node.assignmentOperator.source;
-    final arguments = node.arguments;
-
-    expect(node, arguments != null);
-    expect(node,
-           selector is Identifier || selector is FunctionExpression,
-           'selector is not assignable');
-    if (identical(name, '++') || identical(name, '--')) {
-      expect(node, node.assignmentOperator is Operator);
-      if (node.isIndex) {
-        expect(node.arguments.tail.head, node.arguments.tail.isEmpty);
-      } else {
-        expect(node.arguments.head, node.arguments.isEmpty);
-      }
-    } else {
-      expect(node, !node.arguments.isEmpty);
-    }
-  }
-
-  visitReturn(Return node) {
-    if (node.hasExpression) {
-      // We allow non-expression expressions in Return nodes, but only when
-      // using them to hold redirecting factory constructors.
-      expect(node, node.expression.asExpression() != null);
-    }
-  }
-}
-
-class InvalidNodeError {
-  final Node node;
-  final String message;
-  InvalidNodeError(this.node, [this.message]);
-
-  toString() {
-    String nodeString = node.toDebugString();
-    String result = 'invalid node: $nodeString';
-    if (message != null) result = '$result ($message)';
-    return result;
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/types/container_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/container_type_mask.dart
index b1a09fb..5f22462 100644
--- a/sdk/lib/_internal/compiler/implementation/types/container_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/container_type_mask.dart
@@ -53,20 +53,21 @@
 
   bool equalsDisregardNull(other) {
     if (other is! ContainerTypeMask) return false;
-    return allocationNode == other.allocationNode
-        && elementType == other.elementType
-        && length == other.length;
+    return super.equalsDisregardNull(other) &&
+        allocationNode == other.allocationNode &&
+        elementType == other.elementType &&
+        length == other.length;
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
     if (forwardIntersection.isEmpty) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
   }
 
-  TypeMask union(other, Compiler compiler) {
+  TypeMask union(other, ClassWorld classWorld) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -77,13 +78,17 @@
                && elementType != null
                && other.elementType != null) {
       TypeMask newElementType =
-          elementType.union(other.elementType, compiler);
+          elementType.union(other.elementType, classWorld);
       int newLength = (length == other.length) ? length : null;
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, compiler);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
       return new ContainerTypeMask(
-          newForwardTo, null, null, newElementType, newLength);
+          newForwardTo,
+          allocationNode == other.allocationNode ? allocationNode : null,
+          allocationElement == other.allocationElement ? allocationElement
+                                                       : null,
+          newElementType, newLength);
     } else {
-      return forwardTo.union(other, compiler);
+      return forwardTo.union(other, classWorld);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/types/dictionary_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/dictionary_type_mask.dart
index 3bd0f6f..27419779 100644
--- a/sdk/lib/_internal/compiler/implementation/types/dictionary_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/dictionary_type_mask.dart
@@ -57,15 +57,15 @@
 
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
     if (forwardIntersection.isEmpty) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
   }
 
-  TypeMask union(other, Compiler compiler) {
+  TypeMask union(other, ClassWorld classWorld) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -73,9 +73,9 @@
     } else if (other.isEmpty) {
       return other.isNullable ? this.nullable() : this;
     } else if (other.isDictionary) {
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, compiler);
-      TypeMask newKeyType = keyType.union(other.keyType, compiler);
-      TypeMask newValueType = valueType.union(other.valueType, compiler);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
+      TypeMask newKeyType = keyType.union(other.keyType, classWorld);
+      TypeMask newValueType = valueType.union(other.valueType, classWorld);
       Map<String, TypeMask> mappings = <String, TypeMask>{};
       typeMap.forEach((k,v) {
               if (!other.typeMap.containsKey(k)) {
@@ -84,7 +84,7 @@
             });
       other.typeMap.forEach((k,v) {
         if (typeMap.containsKey(k)) {
-          mappings[k] = v.union(typeMap[k], compiler);
+          mappings[k] = v.union(typeMap[k], classWorld);
         } else {
           mappings[k] = v.nullable();
         }
@@ -94,13 +94,13 @@
     } else if (other.isMap &&
                (other.keyType != null) &&
                (other.valueType != null)) {
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, compiler);
-      TypeMask newKeyType = keyType.union(other.keyType, compiler);
-      TypeMask newValueType = valueType.union(other.valueType, compiler);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
+      TypeMask newKeyType = keyType.union(other.keyType, classWorld);
+      TypeMask newValueType = valueType.union(other.valueType, classWorld);
       return new MapTypeMask(newForwardTo, null, null,
                              newKeyType, newValueType);
     } else {
-      return forwardTo.union(other, compiler);
+      return forwardTo.union(other, classWorld);
     }
   }
 
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 bf6ac53..63edb95 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -9,7 +9,6 @@
  * base type.
  */
 class FlatTypeMask implements TypeMask {
-
   static const int EMPTY    = 0;
   static const int EXACT    = 1;
   static const int SUBCLASS = 2;
@@ -42,6 +41,25 @@
     assert(base == null || base.isDeclaration);
   }
 
+  /**
+   * Ensures that the generated mask is normalized, i.e., a call to
+   * [TypeMask.isNormalized] with the factory's result returns `true`.
+   */
+  factory FlatTypeMask.normalized(ClassElement base, int flags, World world) {
+    if ((flags >> 1) == EMPTY || ((flags >> 1) == EXACT)) {
+      return new FlatTypeMask.internal(base, flags);
+    }
+    if ((flags >> 1) == SUBTYPE) {
+      if (!world.hasAnySubtype(base) || world.hasOnlySubclasses(base)) {
+        flags = (flags & 0x1) | (SUBCLASS << 1);
+      }
+    }
+    if (((flags >> 1) == SUBCLASS) && !world.hasAnySubclass(base)) {
+      flags = (flags & 0x1) | (EXACT << 1);
+    }
+    return new FlatTypeMask.internal(base, flags);
+  }
+
   bool get isEmpty => (flags >> 1) == EMPTY;
   bool get isExact => (flags >> 1) == EXACT;
   bool get isNullable => (flags & 1) != 0;
@@ -67,7 +85,7 @@
     return isNullable ? new FlatTypeMask.internal(base, flags & ~1) : this;
   }
 
-  bool contains(ClassElement type, Compiler compiler) {
+  bool contains(ClassElement type, ClassWorld classWorld) {
     assert(type.isDeclaration);
     if (isEmpty) {
       return false;
@@ -76,93 +94,111 @@
     } else if (isExact) {
       return false;
     } else if (isSubclass) {
-      return isSubclassOf(type, base, compiler);
+      return classWorld.isSubclassOf(type, base);
     } else {
       assert(isSubtype);
-      return isSubtypeOf(type, base, compiler);
+      return classWorld.isSubtypeOf(type, base);
     }
   }
 
-  bool isSingleImplementationOf(ClassElement cls, Compiler compiler) {
+  bool isSingleImplementationOf(ClassElement cls, ClassWorld classWorld) {
     // Special case basic types so that, for example, JSString is the
     // single implementation of String.
     // The general optimization is to realize there is only one class that
     // implements [base] and [base] is not instantiated. We however do
     // not track correctly the list of truly instantiated classes.
-    Backend backend = compiler.backend;
-    if (containsOnlyString(compiler)) {
-      return cls == compiler.stringClass || cls == backend.stringImplementation;
+    Backend backend = classWorld.backend;
+    if (containsOnlyString(classWorld)) {
+      return cls == classWorld.stringClass ||
+             cls == backend.stringImplementation;
     }
-    if (containsOnlyBool(compiler)) {
-      return cls == compiler.boolClass || cls == backend.boolImplementation;
+    if (containsOnlyBool(classWorld)) {
+      return cls == classWorld.boolClass || cls == backend.boolImplementation;
     }
-    if (containsOnlyInt(compiler)) {
-      return cls == compiler.intClass
+    if (containsOnlyInt(classWorld)) {
+      return cls == classWorld.intClass
           || cls == backend.intImplementation
           || cls == backend.positiveIntImplementation
           || cls == backend.uint32Implementation
           || cls == backend.uint31Implementation;
     }
-    if (containsOnlyDouble(compiler)) {
-      return cls == compiler.doubleClass
-          || cls == compiler.backend.doubleImplementation;
+    if (containsOnlyDouble(classWorld)) {
+      return cls == classWorld.doubleClass
+          || cls == backend.doubleImplementation;
     }
     return false;
   }
 
-  bool isInMask(TypeMask other, Compiler compiler) {
-    if (isEmpty) {
-      return isNullable ? other.isNullable : true;
-    }
+  bool isInMask(TypeMask other, ClassWorld classWorld) {
+    // null is treated separately, so the empty mask might still contain it.
+    if (isEmpty) return isNullable ? other.isNullable : true;
+    // The empty type contains no classes.
     if (other.isEmpty) return false;
+    // Quick check whether to handle null.
     if (isNullable && !other.isNullable) return false;
-    if (other is! FlatTypeMask) return other.containsMask(this, compiler);
+    other = TypeMask.nonForwardingMask(other);
+    // If other is union, delegate to UnionTypeMask.containsMask.
+    if (other is! FlatTypeMask) return other.containsMask(this, classWorld);
+    // The other must be flat, so compare base and flags.
     FlatTypeMask flatOther = other;
     ClassElement otherBase = flatOther.base;
+    // If other is exact, it only contains its base.
+    // TODO(herhut): Get rid of isSingleImplementationOf.
     if (flatOther.isExact) {
       return (isExact && base == otherBase)
-          || isSingleImplementationOf(otherBase, compiler);
+          || isSingleImplementationOf(otherBase, classWorld);
     }
+    // If other is subclass, this has to be subclass, as well. Unless
+    // flatOther.base covers all subtypes of this. Currently, we only
+    // consider object to behave that way.
+    // TODO(herhut): Add check whether flatOther.base is superclass of
+    //               all subclasses of this.base.
     if (flatOther.isSubclass) {
-      if (isSubtype) return false;
-      return base == otherBase || isSubclassOf(base, otherBase, compiler);
+      if (isSubtype) return (otherBase == classWorld.objectClass);
+      return classWorld.isSubclassOf(base, otherBase);
     }
     assert(flatOther.isSubtype);
-    return satisfies(otherBase, compiler);
+    // Check whether this TypeMask satisfies otherBase's interface.
+    return satisfies(otherBase, classWorld);
   }
 
-  bool containsMask(TypeMask other, Compiler compiler) {
-    return other.isInMask(this, compiler);
+  bool containsMask(TypeMask other, ClassWorld classWorld) {
+    return other.isInMask(this, classWorld);
   }
 
-  bool containsOnlyInt(Compiler compiler) {
-    return base == compiler.intClass
-        || base == compiler.backend.intImplementation
-        || base == compiler.backend.positiveIntImplementation
-        || base == compiler.backend.uint31Implementation
-        || base == compiler.backend.uint32Implementation;
+  bool containsOnlyInt(ClassWorld classWorld) {
+    Backend backend = classWorld.backend;
+    return base == classWorld.intClass
+        || base == backend.intImplementation
+        || base == backend.positiveIntImplementation
+        || base == backend.uint31Implementation
+        || base == backend.uint32Implementation;
   }
 
-  bool containsOnlyDouble(Compiler compiler) {
-    return base == compiler.doubleClass
-        || base == compiler.backend.doubleImplementation;
+  bool containsOnlyDouble(ClassWorld classWorld) {
+    Backend backend = classWorld.backend;
+    return base == classWorld.doubleClass
+        || base == backend.doubleImplementation;
   }
 
-  bool containsOnlyNum(Compiler compiler) {
-    return containsOnlyInt(compiler)
-        || containsOnlyDouble(compiler)
-        || base == compiler.numClass
-        || base == compiler.backend.numImplementation;
+  bool containsOnlyNum(ClassWorld classWorld) {
+    Backend backend = classWorld.backend;
+    return containsOnlyInt(classWorld)
+        || containsOnlyDouble(classWorld)
+        || base == classWorld.numClass
+        || base == backend.numImplementation;
   }
 
-  bool containsOnlyBool(Compiler compiler) {
-    return base == compiler.boolClass
-        || base == compiler.backend.boolImplementation;
+  bool containsOnlyBool(ClassWorld classWorld) {
+    Backend backend = classWorld.backend;
+    return base == classWorld.boolClass
+        || base == backend.boolImplementation;
   }
 
-  bool containsOnlyString(Compiler compiler) {
-    return base == compiler.stringClass
-        || base == compiler.backend.stringImplementation;
+  bool containsOnlyString(ClassWorld classWorld) {
+    Backend backend = classWorld.backend;
+    return base == classWorld.stringClass
+        || base == backend.stringImplementation;
   }
 
   bool containsOnly(ClassElement cls) {
@@ -170,11 +206,10 @@
     return base == cls;
   }
 
-  bool satisfies(ClassElement cls, Compiler compiler) {
+  bool satisfies(ClassElement cls, ClassWorld classWorld) {
     assert(cls.isDeclaration);
     if (isEmpty) return false;
-    if (base == cls) return true;
-    if (isSubtypeOf(base, cls, compiler)) return true;
+    if (classWorld.isSubtypeOf(base, cls)) return true;
     return false;
   }
 
@@ -182,13 +217,13 @@
    * Returns the [ClassElement] if this type represents a single class,
    * otherwise returns `null`.  This method is conservative.
    */
-  ClassElement singleClass(Compiler compiler) {
+  ClassElement singleClass(ClassWorld classWorld) {
     if (isEmpty) return null;
     if (isNullable) return null;  // It is Null and some other class.
     if (isExact) {
       return base;
     } else if (isSubclass) {
-      return compiler.world.hasAnySubclass(base) ? null : base;
+      return classWorld.hasAnyStrictSubclass(base) ? null : base;
     } else {
       assert(isSubtype);
       return null;
@@ -198,39 +233,44 @@
   /**
    * Returns whether or not this type mask contains all types.
    */
-  bool containsAll(Compiler compiler) {
+  bool containsAll(ClassWorld classWorld) {
     if (isEmpty || isExact) return false;
-    return identical(base, compiler.objectClass);
+    return identical(base, classWorld.objectClass);
   }
 
-  TypeMask union(TypeMask other, Compiler compiler) {
+  TypeMask union(TypeMask other, ClassWorld classWorld) {
     assert(other != null);
-    if (other is! FlatTypeMask) return other.union(this, compiler);
+    assert(TypeMask.isNormalized(this, classWorld));
+    assert(TypeMask.isNormalized(other, classWorld));
+    if (other is! FlatTypeMask) return other.union(this, classWorld);
     FlatTypeMask flatOther = other;
     if (isEmpty) {
       return isNullable ? flatOther.nullable() : flatOther;
     } else if (flatOther.isEmpty) {
       return flatOther.isNullable ? nullable() : this;
     } else if (base == flatOther.base) {
-      return unionSame(flatOther, compiler);
-    } else if (isSubclassOf(flatOther.base, base, compiler)) {
-      return unionSubclass(flatOther, compiler);
-    } else if (isSubclassOf(base, flatOther.base, compiler)) {
-      return flatOther.unionSubclass(this, compiler);
-    } else if (isSubtypeOf(flatOther.base, base, compiler)) {
-      return unionSubtype(flatOther, compiler);
-    } else if (isSubtypeOf(base, flatOther.base, compiler)) {
-      return flatOther.unionSubtype(this, compiler);
+      return unionSame(flatOther, classWorld);
+    } else if (classWorld.isSubclassOf(flatOther.base, base)) {
+      return unionStrictSubclass(flatOther, classWorld);
+    } else if (classWorld.isSubclassOf(base, flatOther.base)) {
+      return flatOther.unionStrictSubclass(this, classWorld);
+    } else if (classWorld.isSubtypeOf(flatOther.base, base)) {
+      return unionStrictSubtype(flatOther, classWorld);
+    } else if (classWorld.isSubtypeOf(base, flatOther.base)) {
+      return flatOther.unionStrictSubtype(this, classWorld);
     } else {
-      return new UnionTypeMask._(<FlatTypeMask>[this, flatOther]);
+      return new UnionTypeMask._internal(<FlatTypeMask>[this, flatOther]);
     }
   }
 
-  TypeMask unionSame(FlatTypeMask other, Compiler compiler) {
+  TypeMask unionSame(FlatTypeMask other, ClassWorld classWorld) {
     assert(base == other.base);
+    assert(TypeMask.isNormalized(this, classWorld));
+    assert(TypeMask.isNormalized(other, classWorld));
     // The two masks share the base type, so we must chose the least
     // constraining kind (the highest) of the two. If either one of
     // the masks are nullable the result should be nullable too.
+    // As both masks are normalized, the result will be, too.
     int combined = (flags > other.flags)
         ? flags | (other.flags & 1)
         : other.flags | (flags & 1);
@@ -243,10 +283,13 @@
     }
   }
 
-  TypeMask unionSubclass(FlatTypeMask other, Compiler compiler) {
-    assert(isSubclassOf(other.base, base, compiler));
+  TypeMask unionStrictSubclass(FlatTypeMask other, ClassWorld classWorld) {
+    assert(base != other.base);
+    assert(classWorld.isSubclassOf(other.base, base));
+    assert(TypeMask.isNormalized(this, classWorld));
+    assert(TypeMask.isNormalized(other, classWorld));
     int combined;
-    if ((isExact && other.isExact) || base == compiler.objectClass) {
+    if ((isExact && other.isExact) || base == classWorld.objectClass) {
       // Since the other mask is a subclass of this mask, we need the
       // resulting union to be a subclass too. If either one of the
       // masks are nullable the result should be nullable too.
@@ -259,50 +302,63 @@
           ? flags | (other.flags & 1)
           : other.flags | (flags & 1);
     }
+    // If we weaken the constraint on this type, we have to make sure that
+    // the result is normalized.
     return (flags != combined)
-        ? new FlatTypeMask.internal(base, combined)
+        ? (combined >> 1 == flags >> 1)
+            ? new FlatTypeMask.internal(base, combined)
+            : new FlatTypeMask.normalized(base, combined, classWorld)
         : this;
   }
 
-  TypeMask unionSubtype(FlatTypeMask other, Compiler compiler) {
-    assert(isSubtypeOf(other.base, base, compiler));
+  TypeMask unionStrictSubtype(FlatTypeMask other, ClassWorld classWorld) {
+    assert(base != other.base);
+    assert(!classWorld.isSubclassOf(other.base, base));
+    assert(classWorld.isSubtypeOf(other.base, base));
+    assert(TypeMask.isNormalized(this, classWorld));
+    assert(TypeMask.isNormalized(other, classWorld));
     // Since the other mask is a subtype of this mask, we need the
     // resulting union to be a subtype too. If either one of the masks
     // are nullable the result should be nullable too.
     int combined = (SUBTYPE << 1) | ((flags | other.flags) & 1);
+    // We know there is at least one subtype, [other.base], so no need
+    // to normalize.
     return (flags != combined)
         ? new FlatTypeMask.internal(base, combined)
         : this;
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
     assert(other != null);
-    if (other is! FlatTypeMask) return other.intersection(this, compiler);
+    if (other is! FlatTypeMask) return other.intersection(this, classWorld);
+    assert(TypeMask.isNormalized(this, classWorld));
+    assert(TypeMask.isNormalized(other, classWorld));
     FlatTypeMask flatOther = other;
     if (isEmpty) {
       return flatOther.isNullable ? this : nonNullable();
     } else if (flatOther.isEmpty) {
       return isNullable ? flatOther : other.nonNullable();
     } else if (base == flatOther.base) {
-      return intersectionSame(flatOther, compiler);
-    } else if (isSubclassOf(flatOther.base, base, compiler)) {
-      return intersectionSubclass(flatOther, compiler);
-    } else if (isSubclassOf(base, flatOther.base, compiler)) {
-      return flatOther.intersectionSubclass(this, compiler);
-    } else if (isSubtypeOf(flatOther.base, base, compiler)) {
-      return intersectionSubtype(flatOther, compiler);
-    } else if (isSubtypeOf(base, flatOther.base, compiler)) {
-      return flatOther.intersectionSubtype(this, compiler);
+      return intersectionSame(flatOther);
+    } else if (classWorld.isSubclassOf(flatOther.base, base)) {
+      return intersectionStrictSubclass(flatOther, classWorld);
+    } else if (classWorld.isSubclassOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubclass(this, classWorld);
+    } else if (classWorld.isSubtypeOf(flatOther.base, base)) {
+      return intersectionStrictSubtype(flatOther, classWorld);
+    } else if (classWorld.isSubtypeOf(base, flatOther.base)) {
+      return flatOther.intersectionStrictSubtype(this, classWorld);
     } else {
-      return intersectionDisjoint(flatOther, compiler);
+      return intersectionDisjoint(flatOther, classWorld);
     }
   }
 
-  TypeMask intersectionSame(FlatTypeMask other, Compiler compiler) {
+  TypeMask intersectionSame(FlatTypeMask other) {
     assert(base == other.base);
     // The two masks share the base type, so we must chose the most
     // constraining kind (the lowest) of the two. Only if both masks
     // are nullable, will the result be nullable too.
+    // The result will be normalized, as the two inputs are normalized, too.
     int combined = (flags < other.flags)
         ? flags & ((other.flags & 1) | ~1)
         : other.flags & ((flags & 1) | ~1);
@@ -315,14 +371,17 @@
     }
   }
 
-  TypeMask intersectionSubclass(FlatTypeMask other, Compiler compiler) {
-    assert(isSubclassOf(other.base, base, compiler));
+  TypeMask intersectionStrictSubclass(FlatTypeMask other, ClassWorld world) {
+    assert(base != other.base);
+    assert(world.isSubclassOf(other.base, base));
     // If this mask isn't at least a subclass mask, then the
     // intersection with the other mask is empty.
     if (isExact) return intersectionEmpty(other);
     // Only the other mask puts constraints on the intersection mask,
     // so base the combined flags on the other mask. Only if both
     // masks are nullable, will the result be nullable too.
+    // The result is guaranteed to be normalized, as the other type
+    // was normalized.
     int combined = other.flags & ((flags & 1) | ~1);
     if (other.flags == combined) {
       return other;
@@ -331,12 +390,16 @@
     }
   }
 
-  TypeMask intersectionSubtype(FlatTypeMask other, Compiler compiler) {
-    assert(isSubtypeOf(other.base, base, compiler));
-    if (!isSubtype) return intersectionHelper(other, compiler);
+  TypeMask intersectionStrictSubtype(FlatTypeMask other,
+                                     ClassWorld classWorld) {
+    assert(base != other.base);
+    assert(classWorld.isSubtypeOf(other.base, base));
+    if (!isSubtype) return intersectionHelper(other, classWorld);
     // Only the other mask puts constraints on the intersection mask,
     // so base the combined flags on the other mask. Only if both
     // masks are nullable, will the result be nullable too.
+    // The result is guaranteed to be normalized, as the other type
+    // was normalized.
     int combined = other.flags & ((flags & 1) | ~1);
     if (other.flags == combined) {
       return other;
@@ -345,17 +408,17 @@
     }
   }
 
-  TypeMask intersectionDisjoint(FlatTypeMask other, Compiler compiler) {
+  TypeMask intersectionDisjoint(FlatTypeMask other, ClassWorld classWorld) {
     assert(base != other.base);
-    assert(!isSubtypeOf(base, other.base, compiler));
-    assert(!isSubtypeOf(other.base, base, compiler));
-    return intersectionHelper(other, compiler);
+    assert(!classWorld.isSubtypeOf(base, other.base));
+    assert(!classWorld.isSubtypeOf(other.base, base));
+    return intersectionHelper(other, classWorld);
   }
 
-  TypeMask intersectionHelper(FlatTypeMask other, Compiler compiler) {
+  TypeMask intersectionHelper(FlatTypeMask other, ClassWorld classWorld) {
     assert(base != other.base);
-    assert(!isSubclassOf(base, other.base, compiler));
-    assert(!isSubclassOf(other.base, base, compiler));
+    assert(!classWorld.isSubclassOf(base, other.base));
+    assert(!classWorld.isSubclassOf(other.base, base));
     // If one of the masks are exact or if both of them are subclass
     // masks, then the intersection is empty.
     if (isExact || other.isExact) return intersectionEmpty(other);
@@ -363,7 +426,7 @@
     assert(isSubtype || other.isSubtype);
     int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE;
     // Compute the set of classes that are contained in both type masks.
-    Set<ClassElement> common = commonContainedClasses(this, other, compiler);
+    Set<ClassElement> common = commonContainedClasses(this, other, classWorld);
     if (common == null || common.isEmpty) return intersectionEmpty(other);
     // Narrow down the candidates by only looking at common classes
     // that do not have a superclass or supertype that will be a
@@ -384,18 +447,18 @@
       return true;
     });
     // Run through the list of candidates and compute the union. The
-    // result will only be nullable if both masks are nullable.
+    // result will only be nullable if both masks are nullable. We have
+    // to normalize here, as we generate types based on new base classes.
     int combined = (kind << 1) | (flags & other.flags & 1);
-    TypeMask result;
-    for (ClassElement each in candidates) {
-      TypeMask mask = new FlatTypeMask.internal(each, combined);
-      result = (result == null) ? mask : result.union(mask, compiler);
-    }
-    return result;
+    Iterable<TypeMask> masks = candidates.map((ClassElement cls) {
+      return new FlatTypeMask.normalized(cls, combined, classWorld);
+    });
+    return UnionTypeMask.unionOf(masks, classWorld);
   }
 
   TypeMask intersectionEmpty(FlatTypeMask other) {
-    return new TypeMask(null, EMPTY, isNullable && other.isNullable);
+    return isNullable && other.isNullable ? new TypeMask.empty()
+        : new TypeMask.nonNullEmpty();
   }
 
   /**
@@ -405,22 +468,20 @@
    */
   static bool hasElementIn(ClassElement cls,
                            Selector selector,
-                           Element element,
-                           Compiler compiler) {
+                           Element element) {
     // Use [:implementation:] of [element]
     // because our function set only stores declarations.
-    Element result = findMatchIn(cls, selector, compiler);
+    Element result = findMatchIn(cls, selector);
     return result == null
         ? false
         : result.implementation == element.implementation;
   }
 
   static Element findMatchIn(ClassElement cls,
-                             Selector selector,
-                             Compiler compiler) {
+                             Selector selector) {
     // Use the [:implementation] of [cls] in case the found [element]
     // is in the patch class.
-    return cls.implementation.lookupSelector(selector, compiler);
+    return cls.implementation.lookupSelector(selector);
   }
 
   /**
@@ -428,12 +489,14 @@
    * invoked on this type mask. [selector] is used to ensure library
    * privacy is taken into account.
    */
-  bool canHit(Element element, Selector selector, Compiler compiler) {
+  bool canHit(Element element, Selector selector, ClassWorld classWorld) {
+    // TODO(johnniwinther): Remove the need for [World].
+    World world = classWorld.compiler.world;
+    Backend backend = classWorld.backend;
     assert(element.name == selector.name);
     if (isEmpty) {
       if (!isNullable) return false;
-      return hasElementIn(
-          compiler.backend.nullImplementation, selector, element, compiler);
+      return hasElementIn(backend.nullImplementation, selector, element);
     }
 
     // TODO(kasperl): Can't we just avoid creating typed selectors
@@ -446,31 +509,30 @@
     }
 
     ClassElement other = element.enclosingClass;
-    if (compiler.backend.isNullImplementation(other)) {
+    if (other == backend.nullImplementation) {
       return isNullable;
     } else if (isExact) {
-      return hasElementIn(self, selector, element, compiler);
+      return hasElementIn(self, selector, element);
     } else if (isSubclass) {
-      assert(compiler.phase > Compiler.PHASE_RESOLVING);
-      return hasElementIn(self, selector, element, compiler)
+      assert(world.isClosed);
+      return hasElementIn(self, selector, element)
           || other.isSubclassOf(self)
-          || compiler.world.hasAnySubclassThatMixes(self, other);
+          || classWorld.hasAnySubclassThatMixes(self, other);
     } else {
       assert(isSubtype);
-      assert(compiler.phase > Compiler.PHASE_RESOLVING);
-      bool result = hasElementIn(self, selector, element, compiler)
+      assert(world.isClosed);
+      bool result = hasElementIn(self, selector, element)
           || other.implementsInterface(self)
-          || compiler.world.hasAnySubclassThatImplements(other, base)
-          || compiler.world.hasAnySubclassOfMixinUseThatImplements(other, base);
+          || world.hasAnySubclassThatImplements(other, base)
+          || classWorld.hasAnySubclassOfMixinUseThatImplements(other, base);
       if (result) return true;
       // If the class is used as a mixin, we have to check if the element
       // can be hit from any of the mixin applications.
-      Iterable<ClassElement> mixinUses = compiler.world.mixinUses[self];
-      if (mixinUses == null) return false;
+      Iterable<ClassElement> mixinUses = classWorld.mixinUsesOf(self);
       return mixinUses.any((mixinApplication) =>
-           hasElementIn(mixinApplication, selector, element, compiler)
+           hasElementIn(mixinApplication, selector, element)
         || other.isSubclassOf(mixinApplication)
-        || compiler.world.hasAnySubclassThatMixes(mixinApplication, other));
+        || classWorld.hasAnySubclassThatMixes(mixinApplication, other));
     }
   }
 
@@ -480,18 +542,21 @@
    */
   static bool hasConcreteMatch(ClassElement cls,
                                Selector selector,
-                               Compiler compiler) {
-    Element element = findMatchIn(cls, selector, compiler);
+                               World world) {
+    assert(invariant(cls,
+        world.compiler.enqueuer.resolution.isInstantiated(cls),
+        message: '$cls has not been instantiated.'));
+    Element element = findMatchIn(cls, selector);
     if (element == null) return false;
 
     if (element.isAbstract) {
       ClassElement enclosingClass = element.enclosingClass;
-      return hasConcreteMatch(enclosingClass.superclass, selector, compiler);
+      return hasConcreteMatch(enclosingClass.superclass, selector, world);
     }
-    return selector.appliesUntyped(element, compiler);
+    return selector.appliesUntyped(element, world);
   }
 
-  bool needsNoSuchMethodHandling(Selector selector, Compiler compiler) {
+  bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
     // A call on an empty type mask is either dead code, or a call on
     // `null`.
     if (isEmpty) return false;
@@ -539,27 +604,37 @@
     // handler because we may have to call B.noSuchMethod since B
     // does not implement bar.
 
-    bool hasMatch = hasConcreteMatch(base, selector, compiler);
-    if (isExact) return !hasMatch;
-    if (!base.isAbstract && !hasMatch) return true;
-
-    Set<ClassElement> subtypesToCheck;
-    if (isSubtype) {
-      subtypesToCheck = compiler.world.subtypesOf(base);
-    } else {
-      assert(isSubclass);
-      subtypesToCheck = compiler.world.subclassesOf(base);
+    /// Returns `true` if [cls] is an instantiated class that does not have
+    /// a concrete method matching [selector].
+    bool needsNoSuchMethod(ClassElement cls) {
+      // We can skip uninstantiated subclasses.
+      // TODO(johnniwinther): Put filtering into the (Class)World.
+      if (!classWorld.isInstantiated(cls)) {
+        return false;
+      }
+      // We can just skip abstract classes because we know no
+      // instance of them will be created at runtime, and
+      // therefore there is no instance that will require
+      // [noSuchMethod] handling.
+      return !cls.isAbstract
+          && !hasConcreteMatch(cls, selector, classWorld);
     }
 
-    return subtypesToCheck != null
-        && subtypesToCheck.any((ClassElement cls) {
-              // We can just skip abstract classes because we know no
-              // instance of them will be created at runtime, and
-              // therefore there is no instance that will require
-              // [noSuchMethod] handling.
-              return !cls.isAbstract
-                  && !hasConcreteMatch(cls, selector, compiler);
-           });
+    bool baseNeedsNoSuchMethod = needsNoSuchMethod(base);
+    if (isExact || baseNeedsNoSuchMethod) {
+      return baseNeedsNoSuchMethod;
+    }
+
+    Iterable<ClassElement> subclassesToCheck;
+    if (isSubtype) {
+      subclassesToCheck = classWorld.subtypesOf(base);
+    } else {
+      assert(isSubclass);
+      subclassesToCheck = classWorld.subclassesOf(base);
+    }
+
+    return subclassesToCheck != null &&
+           subclassesToCheck.any(needsNoSuchMethod);
   }
 
   Element locateSingleElement(Selector selector, Compiler compiler) {
@@ -596,28 +671,14 @@
     return "[$buffer]";
   }
 
-  static bool isSubclassOf(ClassElement x, ClassElement y, Compiler compiler) {
-    assert(x.isDeclaration && y.isDeclaration);
-    Set<ClassElement> subclasses = compiler.world.subclassesOf(y);
-    return (subclasses != null) ? subclasses.contains(x) : false;
-  }
-
-  static bool isSubtypeOf(ClassElement x, ClassElement y, Compiler compiler) {
-    assert(x.isDeclaration && y.isDeclaration);
-    Set<ClassElement> subtypes = compiler.world.subtypesOf(y);
-    if (subtypes != null && subtypes.contains(x)) return true;
-    if (y != compiler.functionClass) return false;
-    return x.callType != null;
-  }
-
   static Set<ClassElement> commonContainedClasses(FlatTypeMask x,
                                                   FlatTypeMask y,
-                                                  Compiler compiler) {
-    Set<ClassElement> xSubset = containedSubset(x, compiler);
+                                                  ClassWorld classWorld) {
+    Iterable<ClassElement> xSubset = containedSubset(x, classWorld);
     if (xSubset == null) return null;
-    Set<ClassElement> ySubset = containedSubset(y, compiler);
+    Iterable<ClassElement> ySubset = containedSubset(y, classWorld);
     if (ySubset == null) return null;
-    Set<ClassElement> smallSet, largeSet;
+    Iterable<ClassElement> smallSet, largeSet;
     if (xSubset.length <= ySubset.length) {
       smallSet = xSubset;
       largeSet = ySubset;
@@ -629,15 +690,16 @@
     return result.toSet();
   }
 
-  static Set<ClassElement> containedSubset(FlatTypeMask x, Compiler compiler) {
+  static Iterable<ClassElement> containedSubset(FlatTypeMask x,
+                                                ClassWorld classWorld) {
     ClassElement element = x.base;
     if (x.isExact) {
       return null;
     } else if (x.isSubclass) {
-      return compiler.world.subclassesOf(element);
+      return classWorld.subclassesOf(element);
     } else {
       assert(x.isSubtype);
-      return compiler.world.subtypesOf(element);
+      return classWorld.subtypesOf(element);
     }
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/types/forwarding_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/forwarding_type_mask.dart
index 2d71c7d..c57817a 100644
--- a/sdk/lib/_internal/compiler/implementation/types/forwarding_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/forwarding_type_mask.dart
@@ -25,55 +25,55 @@
   bool get isValue => false;
   bool get isForwarding => true;
 
-  bool isInMask(TypeMask other, Compiler compiler) {
-    return forwardTo.isInMask(other, compiler);
+  bool isInMask(TypeMask other, ClassWorld classWorld) {
+    return forwardTo.isInMask(other, classWorld);
   }
 
-  bool containsMask(TypeMask other, Compiler compiler) {
-    return forwardTo.containsMask(other, compiler);
+  bool containsMask(TypeMask other, ClassWorld classWorld) {
+    return forwardTo.containsMask(other, classWorld);
   }
 
-  bool containsOnlyInt(Compiler compiler) {
-    return forwardTo.containsOnlyInt(compiler);
+  bool containsOnlyInt(ClassWorld classWorld) {
+    return forwardTo.containsOnlyInt(classWorld);
   }
 
-  bool containsOnlyDouble(Compiler compiler) {
-    return forwardTo.containsOnlyDouble(compiler);
+  bool containsOnlyDouble(ClassWorld classWorld) {
+    return forwardTo.containsOnlyDouble(classWorld);
   }
 
-  bool containsOnlyNum(Compiler compiler) {
-    return forwardTo.containsOnlyNum(compiler);
+  bool containsOnlyNum(ClassWorld classWorld) {
+    return forwardTo.containsOnlyNum(classWorld);
   }
 
-  bool containsOnlyBool(Compiler compiler) {
-    return forwardTo.containsOnlyBool(compiler);
+  bool containsOnlyBool(ClassWorld classWorld) {
+    return forwardTo.containsOnlyBool(classWorld);
   }
 
-  bool containsOnlyString(Compiler compiler) {
-    return forwardTo.containsOnlyString(compiler);
+  bool containsOnlyString(ClassWorld classWorld) {
+    return forwardTo.containsOnlyString(classWorld);
   }
 
   bool containsOnly(ClassElement element) {
     return forwardTo.containsOnly(element);
   }
 
-  bool satisfies(ClassElement cls, Compiler compiler) {
-    return forwardTo.satisfies(cls, compiler);
+  bool satisfies(ClassElement cls, ClassWorld classWorld) {
+    return forwardTo.satisfies(cls, classWorld);
   }
 
-  bool contains(ClassElement type, Compiler compiler) {
-    return forwardTo.contains(type, compiler);
+  bool contains(ClassElement type, ClassWorld classWorld) {
+    return forwardTo.contains(type, classWorld);
   }
 
-  bool containsAll(Compiler compiler) {
-    return forwardTo.containsAll(compiler);
+  bool containsAll(ClassWorld classWorld) {
+    return forwardTo.containsAll(classWorld);
   }
 
-  ClassElement singleClass(Compiler compiler) {
-    return forwardTo.singleClass(compiler);
+  ClassElement singleClass(ClassWorld classWorld) {
+    return forwardTo.singleClass(classWorld);
   }
 
-  TypeMask union(other, Compiler compiler) {
+  TypeMask union(other, ClassWorld classWorld) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -81,31 +81,36 @@
     } else if (other.isEmpty) {
       return other.isNullable ? this.nullable() : this;
     }
-    return forwardTo.union(other, compiler);
+    return forwardTo.union(other, classWorld);
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
-    return forwardTo.intersection(other, compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
+    return forwardTo.intersection(other, classWorld);
   }
 
-  bool needsNoSuchMethodHandling(Selector selector, Compiler compiler) {
-    return forwardTo.needsNoSuchMethodHandling(selector, compiler);
+  bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
+    return forwardTo.needsNoSuchMethodHandling(selector, classWorld);
   }
 
-  bool canHit(Element element, Selector selector, Compiler compiler) {
-    return forwardTo.canHit(element, selector, compiler);
+  bool canHit(Element element, Selector selector, ClassWorld classWorld) {
+    return forwardTo.canHit(element, selector, classWorld);
   }
 
   Element locateSingleElement(Selector selector, Compiler compiler) {
     return forwardTo.locateSingleElement(selector, compiler);
   }
 
-  bool equalsDisregardNull(other);
+  bool equalsDisregardNull(other) {
+    if (other is! ForwardingTypeMask) return false;
+    if (forwardTo.isNullable) {
+      return forwardTo == other.forwardTo.nullable();
+    } else {
+      return forwardTo == other.forwardTo.nonNullable();
+    }
+  }
 
   bool operator==(other) {
-    return equalsDisregardNull(other) &&
-        isNullable == other.isNullable &&
-        forwardTo == other.forwardTo;
+    return equalsDisregardNull(other) && isNullable == other.isNullable;
   }
 
   int get hashCode => throw "Subclass should implement hashCode getter";
diff --git a/sdk/lib/_internal/compiler/implementation/types/map_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/map_type_mask.dart
index 8673d59..39ed50b 100644
--- a/sdk/lib/_internal/compiler/implementation/types/map_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/map_type_mask.dart
@@ -56,20 +56,21 @@
 
   bool equalsDisregardNull(other) {
     if (other is! MapTypeMask) return false;
-    return allocationNode == other.allocationNode &&
+    return super.equalsDisregardNull(other) &&
+        allocationNode == other.allocationNode &&
         keyType == other.keyType &&
         valueType == other.valueType;
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
     if (forwardIntersection.isEmpty) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
         : nonNullable();
   }
 
-  TypeMask union(other, Compiler compiler) {
+  TypeMask union(other, ClassWorld classWorld) {
     if (this == other) {
       return this;
     } else if (equalsDisregardNull(other)) {
@@ -82,23 +83,27 @@
                valueType != null &&
                other.valueType != null) {
       TypeMask newKeyType =
-          keyType.union(other.keyType, compiler);
+          keyType.union(other.keyType, classWorld);
       TypeMask newValueType =
-          valueType.union(other.valueType, compiler);
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, compiler);
+          valueType.union(other.valueType, classWorld);
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
       return new MapTypeMask(
           newForwardTo, null, null, newKeyType, newValueType);
     } else if (other.isDictionary) {
-      TypeMask newKeyType =
-          keyType.union(compiler.typesTask.stringType, compiler);
+      assert(other.keyType == classWorld.compiler.typesTask.stringType);
+      TypeMask newKeyType = keyType.union(other.keyType, classWorld);
       TypeMask newValueType =
-          other.typeMap.values.fold(keyType, (p,n) => p.union(n, compiler));
-      TypeMask newForwardTo = forwardTo.union(other.forwardTo, compiler);
+          other.typeMap.values.fold(keyType, (p,n) => p.union(n, classWorld));
+      TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
       MapTypeMask newMapTypeMask = new MapTypeMask(
-          newForwardTo, null, null, newKeyType, newValueType);
+          newForwardTo,
+          allocationNode == other.allocationNode ? allocationNode : null,
+          allocationElement == other.allocationElement ? allocationElement
+                                                       : null,
+          newKeyType, newValueType);
       return newMapTypeMask;
     } else {
-      return forwardTo.union(other, compiler);
+      return forwardTo.union(other, classWorld);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/types/type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
index 520f084..19babe0 100644
--- a/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/type_mask.dart
@@ -10,28 +10,95 @@
  * yield conservative answers that contain too many classes.
  */
 abstract class TypeMask {
-  factory TypeMask(ClassElement base, int kind, bool isNullable)
-      => new FlatTypeMask(base, kind, isNullable);
+  factory TypeMask(ClassElement base,
+                   int kind,
+                   bool isNullable,
+                   ClassWorld classWorld) {
+    return new FlatTypeMask.normalized(
+        base, (kind << 1) | (isNullable ? 1 : 0), classWorld);
+  }
 
   const factory TypeMask.empty() = FlatTypeMask.empty;
 
   factory TypeMask.exact(ClassElement base)
       => new FlatTypeMask.exact(base);
-  factory TypeMask.subclass(ClassElement base)
-      => new FlatTypeMask.subclass(base);
-  factory TypeMask.subtype(ClassElement base)
-      => new FlatTypeMask.subtype(base);
+
+  factory TypeMask.subclass(ClassElement base, ClassWorld classWorld) {
+    if (classWorld.hasAnySubclass(base)) {
+      return new FlatTypeMask.subclass(base);
+    } else {
+      return new FlatTypeMask.exact(base);
+    }
+  }
+
+  factory TypeMask.subtype(ClassElement base, ClassWorld classWorld) {
+    if (classWorld.hasOnlySubclasses(base)) {
+      return new TypeMask.subclass(base, classWorld);
+    }
+    if (classWorld.hasAnySubtype(base)) {
+      return new FlatTypeMask.subtype(base);
+    } else {
+      return new FlatTypeMask.exact(base);
+    }
+  }
 
   const factory TypeMask.nonNullEmpty() = FlatTypeMask.nonNullEmpty;
+
   factory TypeMask.nonNullExact(ClassElement base)
       => new FlatTypeMask.nonNullExact(base);
-  factory TypeMask.nonNullSubclass(ClassElement base)
-      => new FlatTypeMask.nonNullSubclass(base);
-  factory TypeMask.nonNullSubtype(ClassElement base)
-      => new FlatTypeMask.nonNullSubtype(base);
 
-  factory TypeMask.unionOf(Iterable<TypeMask> masks, Compiler compiler) {
-    return UnionTypeMask.unionOf(masks, compiler);
+  factory TypeMask.nonNullSubclass(ClassElement base, ClassWorld classWorld) {
+    if (classWorld.hasAnySubclass(base)) {
+      return new FlatTypeMask.nonNullSubclass(base);
+    } else {
+      return new FlatTypeMask.nonNullExact(base);
+    }
+  }
+
+  factory TypeMask.nonNullSubtype(ClassElement base, ClassWorld classWorld) {
+    if (classWorld.hasOnlySubclasses(base)) {
+      return new TypeMask.nonNullSubclass(base, classWorld);
+    }
+    if (classWorld.hasAnySubtype(base)) {
+      return new FlatTypeMask.nonNullSubtype(base);
+    } else {
+      return new FlatTypeMask.nonNullExact(base);
+    }
+  }
+
+  factory TypeMask.unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
+    return UnionTypeMask.unionOf(masks, classWorld);
+  }
+
+  /**
+   * If [mask] is forwarding, returns the first non-forwarding [TypeMask] in
+   * [mask]'s forwarding chain.
+   */
+  static TypeMask nonForwardingMask(mask) {
+    while (mask.isForwarding) {
+      mask = mask.forwardTo;
+    }
+    return mask;
+  }
+
+  /**
+   * Checks whether this mask uses the smallest possible representation for
+   * its types. Currently, we normalize subtype and subclass to exact if no
+   * subtypes or subclasses are present and subtype to subclass if only
+   * subclasses exist.
+   */
+  static bool isNormalized(TypeMask mask, ClassWorld classWorld) {
+    mask = nonForwardingMask(mask);
+    if (mask is FlatTypeMask) {
+      if (mask.isExact || mask.isEmpty) return true;
+      if (mask.isSubclass) return classWorld.hasAnySubclass(mask.base);
+      assert(mask.isSubtype);
+      return classWorld.hasAnySubtype(mask.base) &&
+             !classWorld.hasOnlySubclasses(mask.base);
+    } else if (mask is UnionTypeMask) {
+      return mask.disjointMasks.every((mask) => isNormalized(mask, classWorld));
+    }
+    return false;
   }
 
   /**
@@ -48,77 +115,102 @@
   bool get isNullable;
   bool get isExact;
 
+  /// Returns true if this mask is a union type.
   bool get isUnion;
+
+  /// Returns `true` if this mask is a [ContainerTypeMask].
   bool get isContainer;
+
+  /// Returns `true` if this mask is a [MapTypeMask].
   bool get isMap;
+
+  /// Returns `true` if this mask is a [MapTypeMask] in dictionary mode, i.e.,
+  /// all keys are known string values and we have specific type information for
+  /// corresponding values.
   bool get isDictionary;
+
+  /// Returns `true` if this mask is wrapping another mask for the purpose of
+  /// tracing.
   bool get isForwarding;
+
+  /// Returns `true` if this mask holds encodes an exact value within a type.
   bool get isValue;
 
-  bool containsOnlyInt(Compiler compiler);
-  bool containsOnlyDouble(Compiler compiler);
-  bool containsOnlyNum(Compiler compiler);
-  bool containsOnlyBool(Compiler compiler);
-  bool containsOnlyString(Compiler compiler);
+  bool containsOnlyInt(ClassWorld classWorld);
+  bool containsOnlyDouble(ClassWorld classWorld);
+  bool containsOnlyNum(ClassWorld classWorld);
+  bool containsOnlyBool(ClassWorld classWorld);
+  bool containsOnlyString(ClassWorld classWorld);
   bool containsOnly(ClassElement element);
 
   /**
-   * Returns whether this type mask is a subtype of [other].
+   * Compares two [TypeMask] objects for structural equality.
+   *
+   * Note: This may differ from semantic equality in the set containment sense.
+   *   Use [containsMask] and [isInMask] for that, instead.
    */
-  bool isInMask(TypeMask other, Compiler compiler);
+  bool operator==(other);
 
   /**
-   * Returns whether [other] is a subtype of this type mask.
+   * Returns `true` if [other] is a supertype of this mask, i.e., if
+   * this mask is in [other].
    */
-  bool containsMask(TypeMask other, Compiler compiler);
+  bool isInMask(TypeMask other, ClassWorld classWorld);
+
+  /**
+   * Returns `true` if [other] is a subtype of this mask, i.e., if
+   * this mask contains [other].
+   */
+  bool containsMask(TypeMask other, ClassWorld classWorld);
 
   /**
    * Returns whether this type mask is an instance of [cls].
    */
-  bool satisfies(ClassElement cls, Compiler compiler);
+  bool satisfies(ClassElement cls, ClassWorld classWorld);
 
   /**
    * Returns whether or not this type mask contains the given type.
    */
-  bool contains(ClassElement type, Compiler compiler);
+  bool contains(ClassElement type, ClassWorld classWorld);
 
   /**
    * Returns whether or not this type mask contains all types.
    */
-  bool containsAll(Compiler compiler);
+  bool containsAll(ClassWorld classWorld);
 
   /**
    * Returns the [ClassElement] if this type represents a single class,
    * otherwise returns `null`.  This method is conservative.
    */
-  ClassElement singleClass(Compiler compiler);
+  ClassElement singleClass(ClassWorld classWorld);
 
   /**
    * Returns a type mask representing the union of [this] and [other].
    */
-  TypeMask union(TypeMask other, Compiler compiler);
+  TypeMask union(TypeMask other, ClassWorld classWorld);
 
   /**
    * Returns a type mask representing the intersection of [this] and [other].
    */
-  TypeMask intersection(TypeMask other, Compiler compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld);
 
   /**
    * Returns whether this [TypeMask] applied to [selector] can hit a
    * [noSuchMethod].
    */
-  bool needsNoSuchMethodHandling(Selector selector, Compiler compiler);
+  bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld);
 
   /**
    * Returns whether [element] is a potential target when being
    * invoked on this type mask. [selector] is used to ensure library
    * privacy is taken into account.
    */
-  bool canHit(Element element, Selector selector, Compiler compiler);
+  bool canHit(Element element, Selector selector, ClassWorld classWorld);
 
   /**
    * Returns the [element] that is known to always be hit at runtime
    * on this mask. Returns null if there is none.
    */
+  // TODO(johnniwinther): Move this method to [World].
   Element locateSingleElement(Selector selector, Compiler compiler);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/types/types.dart b/sdk/lib/_internal/compiler/implementation/types/types.dart
index 3185550..55e62bd 100644
--- a/sdk/lib/_internal/compiler/implementation/types/types.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/types.dart
@@ -43,10 +43,13 @@
   static final bool DUMP_GOOD_CPA_RESULTS = false;
 
   final String name = 'Type inference';
+  final ClassWorld classWorld;
   TypesInferrer typesInferrer;
   ConcreteTypesInferrer concreteTypesInferrer;
 
-  TypesTask(Compiler compiler) : super(compiler) {
+  TypesTask(Compiler compiler)
+      : this.classWorld = compiler.world,
+        super(compiler) {
     typesInferrer = new TypeGraphInferrer(compiler);
     if (compiler.enableConcreteTypeInference) {
       concreteTypesInferrer = new ConcreteTypesInferrer(compiler);
@@ -75,14 +78,16 @@
 
   TypeMask get dynamicType {
     if (dynamicTypeCache == null) {
-      dynamicTypeCache = new TypeMask.subclass(compiler.objectClass);
+      dynamicTypeCache =
+          new TypeMask.subclass(classWorld.objectClass, classWorld);
     }
     return dynamicTypeCache;
   }
 
   TypeMask get nonNullType {
     if (nonNullTypeCache == null) {
-      nonNullTypeCache = new TypeMask.nonNullSubclass(compiler.objectClass);
+      nonNullTypeCache =
+          new TypeMask.nonNullSubclass(classWorld.objectClass, classWorld);
     }
     return nonNullTypeCache;
   }
@@ -90,7 +95,7 @@
   TypeMask get intType {
     if (intTypeCache == null) {
       intTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.intImplementation);
+          compiler.backend.intImplementation, compiler.world);
     }
     return intTypeCache;
   }
@@ -98,7 +103,7 @@
   TypeMask get uint32Type {
     if (uint32TypeCache == null) {
       uint32TypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.uint32Implementation);
+          compiler.backend.uint32Implementation, compiler.world);
     }
     return uint32TypeCache;
   }
@@ -114,7 +119,7 @@
   TypeMask get positiveIntType {
     if (positiveIntTypeCache == null) {
       positiveIntTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.positiveIntImplementation);
+          compiler.backend.positiveIntImplementation, compiler.world);
     }
     return positiveIntTypeCache;
   }
@@ -130,7 +135,7 @@
   TypeMask get numType {
     if (numTypeCache == null) {
       numTypeCache = new TypeMask.nonNullSubclass(
-          compiler.backend.numImplementation);
+          compiler.backend.numImplementation, compiler.world);
     }
     return numTypeCache;
   }
@@ -146,7 +151,7 @@
   TypeMask get functionType {
     if (functionTypeCache == null) {
       functionTypeCache = new TypeMask.nonNullSubtype(
-          compiler.backend.functionImplementation);
+          compiler.backend.functionImplementation, classWorld);
     }
     return functionTypeCache;
   }
@@ -186,7 +191,7 @@
   TypeMask get mapType {
     if (mapTypeCache == null) {
       mapTypeCache = new TypeMask.nonNullSubtype(
-          compiler.backend.mapImplementation);
+          compiler.backend.mapImplementation, classWorld);
     }
     return mapTypeCache;
   }
@@ -194,7 +199,7 @@
   TypeMask get constMapType {
     if (constMapTypeCache == null) {
       constMapTypeCache = new TypeMask.nonNullSubtype(
-          compiler.backend.constMapImplementation);
+          compiler.backend.constMapImplementation, classWorld);
     }
     return constMapTypeCache;
   }
@@ -227,7 +232,7 @@
   TypeMask _intersection(TypeMask type1, TypeMask type2) {
     if (type1 == null) return type2;
     if (type2 == null) return type1;
-    return type1.intersection(type2, compiler);
+    return type1.intersection(type2, classWorld);
   }
 
   /** Computes the intersection of [type1] and [type2] */
@@ -247,11 +252,11 @@
     if (type1 == null) return false;
     if (type2 == null) {
       return (type1 != null) &&
-             (type1 != new TypeMask.subclass(compiler.objectClass));
+             (type1 != dynamicType);
     }
     return (type1 != type2) &&
-           type2.containsMask(type1, compiler) &&
-           !type1.containsMask(type2, compiler);
+           type2.containsMask(type1, classWorld) &&
+           !type1.containsMask(type2, classWorld);
   }
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
index f18e96c..c67c254c 100644
--- a/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart
@@ -9,30 +9,35 @@
 
   static const int MAX_UNION_LENGTH = 4;
 
-  UnionTypeMask._(this.disjointMasks);
-
-  static TypeMask unionOf(Iterable<TypeMask> masks, Compiler compiler) {
-    List<FlatTypeMask> disjoint = <FlatTypeMask>[];
-    unionOfHelper(masks, disjoint, compiler);
-    if (disjoint.isEmpty) return new TypeMask.nonNullEmpty();
-    if (disjoint.length > MAX_UNION_LENGTH) return flatten(disjoint, compiler);
-    if (disjoint.length == 1) return disjoint[0];
-    return new UnionTypeMask._(disjoint);
+  UnionTypeMask._internal(this.disjointMasks) {
+    assert(disjointMasks.length > 1);
+    assert(disjointMasks.every((TypeMask mask) => !mask.isUnion));
   }
 
-  static TypeMask nonForwardingMask(mask) {
-    while (mask.isForwarding) mask = mask.forwardTo;
-    return mask;
+  static TypeMask unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
+    assert(masks.every((mask) => TypeMask.isNormalized(mask, classWorld)));
+    List<FlatTypeMask> disjoint = <FlatTypeMask>[];
+    unionOfHelper(masks, disjoint, classWorld);
+    if (disjoint.isEmpty) return new TypeMask.nonNullEmpty();
+    if (disjoint.length > MAX_UNION_LENGTH) {
+      return flatten(disjoint, classWorld);
+    }
+    if (disjoint.length == 1) return disjoint[0];
+    UnionTypeMask union = new UnionTypeMask._internal(disjoint);
+    assert(TypeMask.isNormalized(union, classWorld));
+    return union;
   }
 
   static void unionOfHelper(Iterable<TypeMask> masks,
                             List<FlatTypeMask> disjoint,
-                            Compiler compiler) {
+                            ClassWorld classWorld) {
+    // TODO(johnniwinther): Impose an order on the mask to ensure subclass masks
+    // are preferred to subtype masks.
     for (TypeMask mask in masks) {
-      mask = nonForwardingMask(mask);
+      mask = TypeMask.nonForwardingMask(mask);
       if (mask.isUnion) {
         UnionTypeMask union = mask;
-        unionOfHelper(union.disjointMasks, disjoint, compiler);
+        unionOfHelper(union.disjointMasks, disjoint, classWorld);
       } else if (mask.isEmpty && !mask.isNullable) {
         continue;
       } else {
@@ -45,7 +50,7 @@
         for (int i = 0; i < disjoint.length; i++) {
           FlatTypeMask current = disjoint[i];
           if (current == null) continue;
-          TypeMask newMask = mask.union(current, compiler);
+          TypeMask newMask = mask.union(current, classWorld);
           // If we have found a disjoint union, continue iterating.
           if (newMask.isUnion) continue;
           covered = true;
@@ -77,58 +82,37 @@
     }
   }
 
-  static TypeMask flatten(List<FlatTypeMask> masks, Compiler compiler) {
+  static TypeMask flatten(List<FlatTypeMask> masks, ClassWorld classWorld) {
     assert(masks.length > 1);
     // If either type mask is a subtype type mask, we cannot use a
     // subclass type mask to represent their union.
     bool useSubclass = masks.every((e) => !e.isSubtype);
     bool isNullable = masks.any((e) => e.isNullable);
 
-    // Compute the common supertypes of the two types.
-    ClassElement firstElement = masks[0].base;
-    ClassElement secondElement = masks[1].base;
     Iterable<ClassElement> candidates =
-        compiler.world.commonSupertypesOf(firstElement, secondElement);
-    bool unseenType = false;
-    for (int i = 2; i < masks.length; i++) {
-      ClassElement element = masks[i].base;
-      Set<ClassElement> supertypes = compiler.world.supertypesOf(element);
-      if (supertypes == null) {
-        unseenType = true;
-        break;
-      }
-      candidates = candidates.where((e) => supertypes.contains(e));
-    }
+        classWorld.commonSupertypesOf(masks.map((mask) => mask.base));
 
-    if (candidates.isEmpty || unseenType) {
-      // TODO(kasperl): Get rid of this check. It can only happen when
-      // at least one of the two base types is 'unseen'.
-      return new TypeMask(compiler.objectClass,
-                          FlatTypeMask.SUBCLASS,
-                          isNullable);
-    }
     // Compute the best candidate and its kind.
     ClassElement bestElement;
     int bestKind;
     int bestSize;
     for (ClassElement candidate in candidates) {
-      Set<ClassElement> subclasses = useSubclass
-          ? compiler.world.subclassesOf(candidate)
-          : null;
+      Iterable<ClassElement> subclasses = useSubclass
+          ? classWorld.subclassesOf(candidate)
+          : const <ClassElement>[];
       int size;
       int kind;
-      if (subclasses != null
-          && masks.every((t) => subclasses.contains(t.base))) {
+      if (masks.every((t) => subclasses.contains(t.base))) {
         // If both [this] and [other] are subclasses of the supertype,
         // then we prefer to construct a subclass type mask because it
         // will always be at least as small as the corresponding
         // subtype type mask.
         kind = FlatTypeMask.SUBCLASS;
         size = subclasses.length;
-        assert(size <= compiler.world.subtypesOf(candidate).length);
+        assert(size <= classWorld.subtypesOf(candidate).length);
       } else {
         kind = FlatTypeMask.SUBTYPE;
-        size = compiler.world.subtypesOf(candidate).length;
+        size = classWorld.subtypesOf(candidate).length;
       }
       // Update the best candidate if the new one is better.
       if (bestElement == null || size < bestSize) {
@@ -137,12 +121,11 @@
         bestKind = kind;
       }
     }
-    if (bestElement == compiler.objectClass) bestKind = FlatTypeMask.SUBCLASS;
-    return new TypeMask(bestElement, bestKind, isNullable);
+    return new TypeMask(bestElement, bestKind, isNullable, classWorld);
   }
 
-  TypeMask union(var other, Compiler compiler) {
-    other = nonForwardingMask(other);
+  TypeMask union(var other, ClassWorld classWorld) {
+    other = TypeMask.nonForwardingMask(other);
     if (!other.isUnion && disjointMasks.contains(other)) return this;
 
     List<FlatTypeMask> newList =
@@ -153,38 +136,38 @@
       assert(other is UnionTypeMask);
       newList.addAll(other.disjointMasks);
     }
-    return new TypeMask.unionOf(newList, compiler);
+    return new TypeMask.unionOf(newList, classWorld);
   }
 
-  TypeMask intersection(var other, Compiler compiler) {
-    other = nonForwardingMask(other);
+  TypeMask intersection(var other, ClassWorld classWorld) {
+    other = TypeMask.nonForwardingMask(other);
     if (!other.isUnion && disjointMasks.contains(other)) return other;
 
     List<TypeMask> intersections = <TypeMask>[];
     for (TypeMask current in disjointMasks) {
       if (other.isUnion) {
         for (FlatTypeMask flatOther in other.disjointMasks) {
-          intersections.add(current.intersection(flatOther, compiler));
+          intersections.add(current.intersection(flatOther, classWorld));
         }
       } else {
-        intersections.add(current.intersection(other, compiler));
+        intersections.add(current.intersection(other, classWorld));
       }
     }
-    return new TypeMask.unionOf(intersections, compiler);
+    return new TypeMask.unionOf(intersections, classWorld);
   }
 
   TypeMask nullable() {
     if (isNullable) return this;
     List<FlatTypeMask> newList = new List<FlatTypeMask>.from(disjointMasks);
     newList[0] = newList[0].nullable();
-    return new UnionTypeMask._(newList);
+    return new UnionTypeMask._internal(newList);
   }
 
   TypeMask nonNullable() {
     if (!isNullable) return this;
     Iterable<FlatTypeMask> newIterable =
         disjointMasks.map((e) => e.nonNullable());
-    return new UnionTypeMask._(newIterable);
+    return new UnionTypeMask._internal(newIterable);
   }
 
   bool get isEmpty => false;
@@ -197,61 +180,122 @@
   bool get isForwarding => false;
   bool get isValue => false;
 
-  bool isInMask(TypeMask other, Compiler compiler) {
-    return disjointMasks.every((mask) => mask.isInMask(other, compiler));
+  /**
+   * Checks whether [other] is contained in this union.
+   *
+   * Invariants:
+   * - [other] may not be a [UnionTypeMask] itself
+   * - the cheap test matching against individual members of [disjointMasks]
+   *   must have failed.
+   */
+  bool slowContainsCheck(TypeMask other, ClassWorld classWorld) {
+    // Unions should never make it here.
+    assert(!other.isUnion);
+    // Ensure the cheap test fails.
+    assert(!disjointMasks.any((mask) => mask.containsMask(other, classWorld)));
+    // If we cover object, we should never get here.
+    assert(!contains(classWorld.objectClass, classWorld));
+    // Likewise, nullness should be covered.
+    assert(isNullable || !other.isNullable);
+    // The fast test is precise for exact types.
+    if (other.isExact) return false;
+    // We cannot contain object.
+    if (other.contains(classWorld.objectClass, classWorld)) return false;
+    FlatTypeMask flat = TypeMask.nonForwardingMask(other);
+    // Check we cover the base class.
+    if (!contains(flat.base, classWorld)) return false;
+    // Check for other members.
+    Iterable<ClassElement> members;
+    if (flat.isSubclass) {
+      members = classWorld.subclassesOf(flat.base);
+    } else {
+      assert(flat.isSubtype);
+      members = classWorld.subtypesOf(flat.base);
+    }
+    return members.every((ClassElement cls) => this.contains(cls, classWorld));
   }
 
-  bool containsMask(TypeMask other, Compiler compiler) {
-    return disjointMasks.any((mask) => mask.containsMask(other, compiler));
+  bool isInMask(TypeMask other, ClassWorld classWorld) {
+    other = TypeMask.nonForwardingMask(other);
+    if (isNullable && !other.isNullable) return false;
+    if (other.isUnion) {
+      UnionTypeMask union = other;
+      bool containedInAnyOf(FlatTypeMask mask, Iterable<FlatTypeMask> masks) {
+        // null is not canonicalized for the union but stored only on some
+        // masks in [disjointMask]. It has been checked in the surrounding
+        // context, so we can safely ignore it here.
+        FlatTypeMask maskDisregardNull = mask.nonNullable();
+        return masks.any((FlatTypeMask other) {
+          return other.containsMask(maskDisregardNull, classWorld);
+        });
+      }
+      return disjointMasks.every((FlatTypeMask disjointMask) {
+        bool contained = containedInAnyOf(disjointMask, union.disjointMasks);
+        assert(contained || !union.slowContainsCheck(disjointMask, classWorld));
+        return contained;
+      });
+    }
+    return disjointMasks.every((mask) => mask.isInMask(other, classWorld));
   }
 
-  bool containsOnlyInt(Compiler compiler) {
-    return disjointMasks.every((mask) => mask.containsOnlyInt(compiler));
+  bool containsMask(TypeMask other, ClassWorld classWorld) {
+    other = TypeMask.nonForwardingMask(other);
+    if (other.isNullable && !isNullable) return false;
+    if (other.isUnion) return other.isInMask(this, classWorld);
+    other = other.nonNullable(); // nullable is not canonicalized, so drop it.
+    bool contained =
+        disjointMasks.any((mask) => mask.containsMask(other, classWorld));
+    assert(contained || !slowContainsCheck(other, classWorld));
+    return contained;
   }
 
-  bool containsOnlyDouble(Compiler compiler) {
-    return disjointMasks.every((mask) => mask.containsOnlyDouble(compiler));
+  bool containsOnlyInt(ClassWorld classWorld) {
+    return disjointMasks.every((mask) => mask.containsOnlyInt(classWorld));
   }
 
-  bool containsOnlyNum(Compiler compiler) {
+  bool containsOnlyDouble(ClassWorld classWorld) {
+    return disjointMasks.every((mask) => mask.containsOnlyDouble(classWorld));
+  }
+
+  bool containsOnlyNum(ClassWorld classWorld) {
     return disjointMasks.every((mask) {
-      return mask.containsOnlyNum(compiler);
+      return mask.containsOnlyNum(classWorld);
     });
   }
 
-  bool containsOnlyBool(Compiler compiler) {
-    return disjointMasks.every((mask) => mask.containsOnlyBool(compiler));
+  bool containsOnlyBool(ClassWorld classWorld) {
+    return disjointMasks.every((mask) => mask.containsOnlyBool(classWorld));
   }
 
-  bool containsOnlyString(Compiler compiler) {
-    return disjointMasks.every((mask) => mask.containsOnlyString(compiler));
+  bool containsOnlyString(ClassWorld classWorld) {
+    return disjointMasks.every((mask) => mask.containsOnlyString(classWorld));
   }
 
   bool containsOnly(ClassElement element) {
     return disjointMasks.every((mask) => mask.containsOnly(element));
   }
 
-  bool satisfies(ClassElement cls, Compiler compiler) {
-    return disjointMasks.every((mask) => mask.satisfies(cls, compiler));
+  bool satisfies(ClassElement cls, ClassWorld classWorld) {
+    return disjointMasks.every((mask) => mask.satisfies(cls, classWorld));
   }
 
-  bool contains(ClassElement type, Compiler compiler) {
-    return disjointMasks.any((e) => e.contains(type, compiler));
+  bool contains(ClassElement type, ClassWorld classWorld) {
+    return disjointMasks.any((e) => e.contains(type, classWorld));
   }
 
-  bool containsAll(Compiler compiler) {
-    return disjointMasks.any((mask) => mask.containsAll(compiler));
+  bool containsAll(ClassWorld classWorld) {
+    return disjointMasks.any((mask) => mask.containsAll(classWorld));
   }
 
-  ClassElement singleClass(Compiler compiler) => null;
+  ClassElement singleClass(ClassWorld classWorld) => null;
 
-  bool needsNoSuchMethodHandling(Selector selector, Compiler compiler) {
+  bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
     return disjointMasks.any(
-        (e) => e.needsNoSuchMethodHandling(selector, compiler));
+        (e) => e.needsNoSuchMethodHandling(selector, classWorld));
   }
 
-  bool canHit(Element element, Selector selector, Compiler compiler) {
-    return disjointMasks.any((e) => e.canHit(element, selector, compiler));
+  bool canHit(Element element, Selector selector, ClassWorld classWorld) {
+    return disjointMasks.any((e) => e.canHit(element, selector, classWorld));
   }
 
   Element locateSingleElement(Selector selector, Compiler compiler) {
@@ -269,7 +313,11 @@
     return candidate;
   }
 
-  String toString() => 'Union of $disjointMasks';
+  String toString() {
+    String masksString = (disjointMasks.map((TypeMask mask) => mask.toString())
+        .toList()..sort()).join(", ");
+    return 'Union of [$masksString]';
+  }
 
   bool operator==(other) {
     if (identical(this, other)) return true;
diff --git a/sdk/lib/_internal/compiler/implementation/types/value_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/value_type_mask.dart
index b12b1b4..737be5e 100644
--- a/sdk/lib/_internal/compiler/implementation/types/value_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/value_type_mask.dart
@@ -26,11 +26,11 @@
 
   bool equalsDisregardNull(other) {
     if (other is! ValueTypeMask) return false;
-    return value == other.value;
+    return super.equalsDisregardNull(other) && value == other.value;
   }
 
-  TypeMask intersection(TypeMask other, Compiler compiler) {
-    TypeMask forwardIntersection = forwardTo.intersection(other, compiler);
+  TypeMask intersection(TypeMask other, ClassWorld classWorld) {
+    TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
     if (forwardIntersection.isEmpty) return forwardIntersection;
     return forwardIntersection.isNullable
         ? nullable()
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index 3b2659cd..11baf76 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -53,7 +53,7 @@
   }
 
   TypeMask receiverType(Selector selector) {
-    return query(selector).computeMask(compiler);
+    return query(selector).computeMask(compiler.world);
   }
 
   FunctionSetQuery query(Selector selector) {
@@ -69,7 +69,7 @@
     selector = (selector.mask == null)
         ? compiler.noSuchMethodSelector
         : new TypedSelector(selector.mask, compiler.noSuchMethodSelector,
-            compiler);
+            compiler.world);
 
     return noSuchMethods.query(selector, compiler, null);
   }
@@ -147,18 +147,19 @@
     // to always be a subclass of Object.
     return selector.mask != null
         ? selector.mask
-        : new TypeMask.subclass(compiler.objectClass);
+        : new TypeMask.subclass(compiler.objectClass, compiler.world);
     }
 
   FunctionSetQuery query(Selector selector,
                          Compiler compiler,
                          FunctionSetNode noSuchMethods) {
+    ClassWorld classWorld = compiler.world;
     assert(selector.name == name);
     FunctionSetQuery result = cache[selector];
     if (result != null) return result;
     Setlet<Element> functions;
     for (Element element in elements) {
-      if (selector.appliesUnnamed(element, compiler)) {
+      if (selector.appliesUnnamed(element, classWorld)) {
         if (functions == null) {
           // Defer the allocation of the functions set until we are
           // sure we need it. This allows us to return immutable empty
@@ -174,9 +175,10 @@
     // add [noSuchMethod] implementations that apply to [mask] as
     // potential targets.
     if (noSuchMethods != null
-        && mask.needsNoSuchMethodHandling(selector, compiler)) {
+        && mask.needsNoSuchMethodHandling(selector, classWorld)) {
       FunctionSetQuery noSuchMethodQuery = noSuchMethods.query(
-          new TypedSelector(mask, compiler.noSuchMethodSelector, compiler),
+          new TypedSelector(
+              mask, compiler.noSuchMethodSelector, classWorld),
           compiler,
           null);
       if (!noSuchMethodQuery.functions.isEmpty) {
@@ -202,7 +204,7 @@
 
 class FunctionSetQuery {
   final Iterable<Element> functions;
-  TypeMask computeMask(Compiler compiler) => const TypeMask.nonNullEmpty();
+  TypeMask computeMask(ClassWorld classWorld) => const TypeMask.nonNullEmpty();
   const FunctionSetQuery(this.functions);
 }
 
@@ -212,24 +214,22 @@
   /**
    * Compute the type of all potential receivers of this function set.
    */
-  TypeMask computeMask(Compiler compiler) {
+  TypeMask computeMask(ClassWorld classWorld) {
+    assert(classWorld.hasAnySubclass(classWorld.objectClass));
     if (_mask != null) return _mask;
     return _mask = new TypeMask.unionOf(functions
         .expand((element) {
           ClassElement cls = element.enclosingClass;
-          return compiler.world.isUsedAsMixin(cls)
-              ? ([cls]..addAll(compiler.world.mixinUses[cls]))
-              : [cls];
+          return [cls]..addAll(classWorld.mixinUsesOf(cls));
         })
         .map((cls) {
-          if (compiler.backend.isNullImplementation(cls)) {
+          if (classWorld.backend.isNullImplementation(cls)) {
             return const TypeMask.empty();
+          } else {
+            return new TypeMask.nonNullSubclass(cls.declaration, classWorld);
           }
-          return compiler.world.hasSubclasses(cls)
-              ? new TypeMask.nonNullSubclass(cls.declaration)
-              : new TypeMask.nonNullExact(cls.declaration);
         }),
-        compiler);
+        classWorld);
   }
 
   FullFunctionSetQuery(functions) : super(functions);
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 910c9d0..8353b65 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -54,15 +54,19 @@
   final Set<DartType> isChecks = new Set<DartType>();
 
   /**
-   * Set of [:call:] methods in instantiated classes that use type variables
-   * in their signature.
+   * Set of (live) [:call:] methods whose signatures reference type variables.
+   *
+   * A live [:call:] method is one whose enclosing class has been instantiated.
    */
-  final Set<Element> genericCallMethods = new Set<Element>();
+  final Set<Element> callMethodsWithFreeTypeVariables = new Set<Element>();
 
   /**
-   * Set of closures that use type variables in their signature.
+   * Set of (live) local functions (closures) whose signatures reference type
+   * variables.
+   *
+   * A live function is one whose enclosing member function has been enqueued.
    */
-  final Set<Element> genericClosures = new Set<Element>();
+  final Set<Element> closuresWithFreeTypeVariables = new Set<Element>();
 
   /**
    * Set of all closures in the program. Used by the mirror tracking system
@@ -80,24 +84,24 @@
 
   bool hasMatchingSelector(Set<Selector> selectors,
                            Element member,
-                           Compiler compiler) {
+                           World world) {
     if (selectors == null) return false;
     for (Selector selector in selectors) {
-      if (selector.appliesUnnamed(member, compiler)) return true;
+      if (selector.appliesUnnamed(member, world)) return true;
     }
     return false;
   }
 
-  bool hasInvocation(Element member, Compiler compiler) {
-    return hasMatchingSelector(invokedNames[member.name], member, compiler);
+  bool hasInvocation(Element member, World world) {
+    return hasMatchingSelector(invokedNames[member.name], member, world);
   }
 
-  bool hasInvokedGetter(Element member, Compiler compiler) {
-    return hasMatchingSelector(invokedGetters[member.name], member, compiler);
+  bool hasInvokedGetter(Element member, World world) {
+    return hasMatchingSelector(invokedGetters[member.name], member, world);
   }
 
-  bool hasInvokedSetter(Element member, Compiler compiler) {
-    return hasMatchingSelector(invokedSetters[member.name], member, compiler);
+  bool hasInvokedSetter(Element member, World world) {
+    return hasMatchingSelector(invokedSetters[member.name], member, world);
   }
 
   DartType registerIsCheck(DartType type, Compiler compiler) {
@@ -191,7 +195,7 @@
     return result;
   }
 
-  factory Selector.fromElement(Element element, Compiler compiler) {
+  factory Selector.fromElement(Element element) {
     String name = element.name;
     if (element.isFunction) {
       if (name == '[]') {
@@ -200,7 +204,7 @@
         return new Selector.indexSet();
       }
       FunctionSignature signature =
-          element.asFunctionElement().computeSignature(compiler);
+          element.asFunctionElement().functionSignature;
       int arity = signature.parameterCount;
       List<String> namedArguments = null;
       if (signature.optionalParametersAreNamed) {
@@ -323,16 +327,16 @@
     return kind;
   }
 
-  bool appliesUnnamed(Element element, Compiler compiler) {
-    assert(sameNameHack(element, compiler));
-    return appliesUntyped(element, compiler);
+  bool appliesUnnamed(Element element, World world) {
+    assert(sameNameHack(element, world));
+    return appliesUntyped(element, world);
   }
 
-  bool appliesUntyped(Element element, Compiler compiler) {
-    assert(sameNameHack(element, compiler));
+  bool appliesUntyped(Element element, World world) {
+    assert(sameNameHack(element, world));
     if (Elements.isUnresolved(element)) return false;
     if (isPrivateName(name) && library != element.library) return false;
-    if (element.isForeign(compiler)) return true;
+    if (world.isForeign(element)) return true;
     if (element.isSetter) return isSetter;
     if (element.isGetter) return isGetter || isCall;
     if (element.isField) {
@@ -342,11 +346,11 @@
     }
     if (isGetter) return true;
     if (isSetter) return false;
-    return signatureApplies(element, compiler);
+    return signatureApplies(element);
   }
 
-  bool signatureApplies(FunctionElement function, Compiler compiler) {
-    FunctionSignature parameters = function.computeSignature(compiler);
+  bool signatureApplies(FunctionElement function) {
+    FunctionSignature parameters = function.functionSignature;
     if (argumentCount > parameters.parameterCount) return false;
     int requiredParameterCount = parameters.requiredParameterCount;
     int optionalParameterCount = parameters.optionalParameterCount;
@@ -378,16 +382,16 @@
     }
   }
 
-  bool sameNameHack(Element element, Compiler compiler) {
+  bool sameNameHack(Element element, World world) {
     // TODO(ngeoffray): Remove workaround checks.
     return element.isConstructor ||
            name == element.name ||
-           name == 'assert' && compiler.backend.isAssertMethod(element);
+           name == 'assert' && world.isAssertMethod(element);
   }
 
-  bool applies(Element element, Compiler compiler) {
-    if (!sameNameHack(element, compiler)) return false;
-    return appliesUnnamed(element, compiler);
+  bool applies(Element element, World world) {
+    if (!sameNameHack(element, world)) return false;
+    return appliesUnnamed(element, world);
   }
 
   /**
@@ -409,9 +413,9 @@
                           FunctionElement element,
                           compileArgument(Node argument),
                           compileConstant(Element element),
-                          Compiler compiler) {
+                          World world) {
     assert(invariant(element, element.isImplementation));
-    if (!this.applies(element, compiler)) return false;
+    if (!this.applies(element, world)) return false;
 
     FunctionSignature parameters = element.functionSignature;
     parameters.forEachRequiredParameter((element) {
@@ -469,7 +473,7 @@
       FunctionElement callee,
       compileArgument(Element element),
       compileConstant(Element element),
-      Compiler compiler) {
+      World world) {
 
     FunctionSignature signature = caller.functionSignature;
     Map mapping = new Map();
@@ -521,7 +525,7 @@
                                        callee,
                                        internalCompileArgument,
                                        compileConstant,
-                                       compiler);
+                                       world);
   }
 
   static bool sameNames(List<String> first, List<String> second) {
@@ -614,7 +618,8 @@
   }
 
   Selector extendIfReachesAll(Compiler compiler) {
-    return new TypedSelector(compiler.typesTask.dynamicType, this, compiler);
+    return new TypedSelector(
+        compiler.typesTask.dynamicType, this, compiler.world);
   }
 
   Selector toCallSelector() => new Selector.callClosureFrom(this);
@@ -640,9 +645,9 @@
   static Map<Selector, Map<TypeMask, TypedSelector>> canonicalizedValues =
       new Map<Selector, Map<TypeMask, TypedSelector>>();
 
-  factory TypedSelector(TypeMask mask, Selector selector, Compiler compiler) {
+  factory TypedSelector(TypeMask mask, Selector selector, World world) {
     // TODO(johnniwinther): Allow more TypeSelector kinds during resoluton.
-    assert(compiler.phase > Compiler.PHASE_RESOLVING || mask.isExact);
+    assert(world.isClosed || mask.isExact);
     if (selector.mask == mask) return selector;
     Selector untyped = selector.asUntyped;
     Map<TypeMask, TypedSelector> map = canonicalizedValues.putIfAbsent(untyped,
@@ -655,20 +660,22 @@
     return result;
   }
 
-  factory TypedSelector.exact(ClassElement base, Selector selector,
-      Compiler compiler)
-      => new TypedSelector(new TypeMask.exact(base), selector, compiler);
+  factory TypedSelector.exact(
+      ClassElement base, Selector selector, World world)
+          => new TypedSelector(new TypeMask.exact(base), selector, world);
 
-  factory TypedSelector.subclass(ClassElement base, Selector selector,
-      Compiler compiler)
-      => new TypedSelector(new TypeMask.subclass(base), selector, compiler);
+  factory TypedSelector.subclass(
+      ClassElement base, Selector selector, World world)
+          => new TypedSelector(new TypeMask.subclass(base, world),
+                               selector, world);
 
-  factory TypedSelector.subtype(ClassElement base, Selector selector,
-      Compiler compiler)
-      => new TypedSelector(new TypeMask.subtype(base), selector, compiler);
+  factory TypedSelector.subtype(
+      ClassElement base, Selector selector, World world)
+          => new TypedSelector(new TypeMask.subtype(base, world),
+                               selector, world);
 
-  bool appliesUnnamed(Element element, Compiler compiler) {
-    assert(sameNameHack(element, compiler));
+  bool appliesUnnamed(Element element, World world) {
+    assert(sameNameHack(element, world));
     // [TypedSelector] are only used after resolution.
     if (!element.isClassMember) return false;
 
@@ -678,18 +685,19 @@
     //   bar() => foo(); // The call to 'foo' is a typed selector.
     // }
     if (element.enclosingClass.isClosure) {
-      return appliesUntyped(element, compiler);
+      return appliesUntyped(element, world);
     }
 
-    if (!mask.canHit(element, this, compiler)) return false;
-    return appliesUntyped(element, compiler);
+    if (!mask.canHit(element, this, world)) return false;
+    return appliesUntyped(element, world);
   }
 
   Selector extendIfReachesAll(Compiler compiler) {
     bool canReachAll = compiler.enabledInvokeOn
-        && mask.needsNoSuchMethodHandling(this, compiler);
+        && mask.needsNoSuchMethodHandling(this, compiler.world);
     return canReachAll
-        ? new TypedSelector(compiler.typesTask.dynamicType, this, compiler)
+        ? new TypedSelector(
+            compiler.typesTask.dynamicType, this, compiler.world)
         : this;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 202bb23..d5c2d43 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -124,6 +124,8 @@
 
 void useUtil(util.Link link) {
   link.reversePrependAll(link);
+  util.longestCommonPrefixLength(null, null);
+  new util.Pair(null, null);
 }
 
 void useSetlet(util.Setlet setlet) {
@@ -197,9 +199,9 @@
   typeGraphInferrer.getCallersOf(null);
   dart_types.Types.sorted(null);
   new dart_types.Types(compiler).copy(compiler);
-  new universe.TypedSelector.subclass(null, null, compiler);
-  new universe.TypedSelector.subtype(null, null, compiler);
-  new universe.TypedSelector.exact(null, null, compiler);
+  new universe.TypedSelector.subclass(null, null, compiler.world);
+  new universe.TypedSelector.subtype(null, null, compiler.world);
+  new universe.TypedSelector.exact(null, null, compiler.world);
   sourceFileProvider.readStringFromUri(null);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/util/link.dart b/sdk/lib/_internal/compiler/implementation/util/link.dart
index e93deeb..c633abe 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link.dart
@@ -5,7 +5,7 @@
 part of dart2js.util;
 
 class Link<T> {
-  T get head => null;
+  T get head => throw new StateError("no elements");
   Link<T> get tail => null;
 
   const Link();
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 04854e6..bf18c10 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -4,6 +4,7 @@
 
 library dart2js.util;
 
+import 'dart:collection';
 import 'util_implementation.dart';
 import 'characters.dart';
 
@@ -165,3 +166,31 @@
   builder.toLink().printOn(buffer, ', ');
   return buffer.toString();
 }
+
+class Pair<A, B> {
+  final A a;
+  final B b;
+
+  Pair(this.a, this.b);
+
+  int get hashCode => 13 * a.hashCode + 17 * b.hashCode;
+
+  bool operator ==(var other) {
+    if (identical(this, other)) return true;
+    if (other is! Pair) return false;
+    return a == other.a && b == other.b;
+  }
+
+  String toString() => '($a,$b)';
+}
+
+
+int longestCommonPrefixLength(List a, List b) {
+  int index = 0;
+  for ( ; index < a.length && index < b.length; index++) {
+    if (a[index] != b[index]) {
+      break;
+    }
+  }
+  return index;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 9ecb9ea..ac8a98aa 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -4,16 +4,278 @@
 
 part of dart2js;
 
-class World {
+abstract class ClassWorld {
+  // TODO(johnniwinther): Refine this into a `BackendClasses` interface.
+  Backend get backend;
+
+  // TODO(johnniwinther): Remove the need for this getter.
+  @deprecated
+  Compiler get compiler;
+
+  /// The [ClassElement] for the [Object] class defined in 'dart:core'.
+  ClassElement get objectClass;
+
+  /// The [ClassElement] for the [Function] class defined in 'dart:core'.
+  ClassElement get functionClass;
+
+  /// The [ClassElement] for the [bool] class defined in 'dart:core'.
+  ClassElement get boolClass;
+
+  /// The [ClassElement] for the [num] class defined in 'dart:core'.
+  ClassElement get numClass;
+
+  /// The [ClassElement] for the [int] class defined in 'dart:core'.
+  ClassElement get intClass;
+
+  /// The [ClassElement] for the [double] class defined in 'dart:core'.
+  ClassElement get doubleClass;
+
+  /// The [ClassElement] for the [String] class defined in 'dart:core'.
+  ClassElement get stringClass;
+
+  /// Returns `true` if [cls] is instantiated.
+  bool isInstantiated(ClassElement cls);
+
+  /// Return `true` if [x] is a subclass of [y].
+  bool isSubclassOf(ClassElement x, ClassElement y);
+
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassElement x, ClassElement y);
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassElement> subclassesOf(ClassElement cls);
+
+  /// Returns an iterable over the live classes that extend [cls] _not_
+  /// including [cls] itself.
+  Iterable<ClassElement> strictSubclassesOf(ClassElement cls);
+
+  /// Returns an iterable over the live classes that implement [cls] including
+  /// [cls] if it is live.
+  Iterable<ClassElement> subtypesOf(ClassElement cls);
+
+  /// Returns an iterable over the live classes that implement [cls] _not_
+  /// including [cls] if it is live.
+  Iterable<ClassElement> strictSubtypesOf(ClassElement cls);
+
+  /// Returns `true` if any live class extends [cls].
+  bool hasAnySubclass(ClassElement cls);
+
+  /// Returns `true` if any live class other than [cls] extends [cls].
+  bool hasAnyStrictSubclass(ClassElement cls);
+
+  /// Returns `true` if any live class implements [cls].
+  bool hasAnySubtype(ClassElement cls);
+
+  /// Returns `true` if any live class other than [cls] implements [cls].
+  bool hasAnyStrictSubtype(ClassElement cls);
+
+  /// Returns `true` if all live classes that implement [cls] extend it.
+  bool hasOnlySubclasses(ClassElement cls);
+
+  /// Returns an iterable over the common supertypes of the [classes].
+  Iterable<ClassElement> commonSupertypesOf(Iterable<ClassElement> classes);
+
+  /// Returns an iterable over the live mixin applications that mixin [cls].
+  Iterable<MixinApplicationElement> mixinUsesOf(ClassElement cls);
+
+  /// Returns `true` if [cls] is mixed into a live class.
+  bool isUsedAsMixin(ClassElement cls);
+
+  /// Returns `true` if any live class that mixes in [cls] implements [type].
+  bool hasAnySubclassOfMixinUseThatImplements(ClassElement cls,
+                                              ClassElement type);
+
+  /// Returns `true` if any live class that mixes in [mixin] is also a subclass
+  /// of [superclass].
+  bool hasAnySubclassThatMixes(ClassElement superclass, ClassElement mixin);
+}
+
+class World implements ClassWorld {
+  ClassElement get objectClass => compiler.objectClass;
+  ClassElement get functionClass => compiler.functionClass;
+  ClassElement get boolClass => compiler.boolClass;
+  ClassElement get numClass => compiler.numClass;
+  ClassElement get intClass => compiler.intClass;
+  ClassElement get doubleClass => compiler.doubleClass;
+  ClassElement get stringClass => compiler.stringClass;
+
+  bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) {
+    return
+      invariant(cls, cls.isDeclaration,
+                message: '$cls must be the declaration.') &&
+      invariant(cls, cls.isResolved,
+                message: '$cls must be resolved.');
+    // TODO(johnniwinther): Enable check for instantiation:
+    // (!mustBeInstantiated ||
+    //   invariant(cls, isInstantiated(cls),
+    //             message: '$cls is not instantiated.'));
+ }
+
+  /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+  /// instance of [y].
+  bool isSubtypeOf(ClassElement x, ClassElement y) {
+    assert(checkInvariants(x, mustBeInstantiated: true));
+    assert(checkInvariants(y));
+
+    if (y == objectClass) return true;
+    if (x == objectClass) return false;
+    if (x.asInstanceOf(y) != null) return true;
+    if (y != functionClass) return false;
+    return x.callType != null;
+  }
+
+  /// Return `true` if [x] is a (non-strict) subclass of [y].
+  bool isSubclassOf(ClassElement x, ClassElement y) {
+    assert(checkInvariants(x));
+    assert(checkInvariants(y));
+
+    if (y == objectClass) return true;
+    if (x == objectClass) return false;
+    while (x != null && x.hierarchyDepth >= y.hierarchyDepth) {
+      if (x == y) return true;
+      x = x.superclass;
+    }
+    return false;
+  }
+
+  /// Returns `true` if [cls] is instantiated.
+  bool isInstantiated(ClassElement cls) {
+    return compiler.enqueuer.resolution.isLive(cls);
+  }
+
+  /// Returns an iterable over the live classes that extend [cls] including
+  /// [cls] itself.
+  Iterable<ClassElement> subclassesOf(ClassElement cls) {
+    Set<ClassElement> subclasses = _subclasses[cls.declaration];
+    if (subclasses == null) return const <ClassElement>[];
+    assert(invariant(cls, isInstantiated(cls.declaration),
+        message: 'Class $cls has not been instantiated.'));
+    return subclasses;
+  }
+
+  /// Returns an iterable over the live classes that extend [cls] _not_
+  /// including [cls] itself.
+  Iterable<ClassElement> strictSubclassesOf(ClassElement cls) {
+    return subclassesOf(cls).where((c) => c != cls);
+  }
+
+  /// Returns an iterable over the live classes that implement [cls] including
+  /// [cls] if it is live.
+  Iterable<ClassElement> subtypesOf(ClassElement cls) {
+    Set<ClassElement> subtypes = _subtypes[cls.declaration];
+    return subtypes != null ? subtypes : const <ClassElement>[];
+  }
+
+  /// Returns an iterable over the live classes that implement [cls] _not_
+  /// including [cls] if it is live.
+  Iterable<ClassElement> strictSubtypesOf(ClassElement cls) {
+    return subtypesOf(cls).where((c) => c != cls);
+  }
+
+  /// Returns `true` if any live class extends [cls].
+  bool hasAnySubclass(ClassElement cls) {
+    return !subclassesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if any live class other than [cls] extends [cls].
+  bool hasAnyStrictSubclass(ClassElement cls) {
+    return !strictSubclassesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if any live class implements [cls].
+  bool hasAnySubtype(ClassElement cls) {
+    return !subtypesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if any live class other than [cls] implements [cls].
+  bool hasAnyStrictSubtype(ClassElement cls) {
+    return !strictSubtypesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if all live classes that implement [cls] extend it.
+  bool hasOnlySubclasses(ClassElement cls) {
+    Iterable<ClassElement> subtypes = subtypesOf(cls);
+    if (subtypes == null) return true;
+    Iterable<ClassElement> subclasses = subclassesOf(cls);
+    return subclasses != null && (subclasses.length == subtypes.length);
+  }
+
+  /// Returns an iterable over the common supertypes of the [classes].
+  Iterable<ClassElement> commonSupertypesOf(Iterable<ClassElement> classes) {
+    Iterator<ClassElement> iterator = classes.iterator;
+    if (!iterator.moveNext()) return const <ClassElement>[];
+
+    ClassElement cls = iterator.current;
+    assert(checkInvariants(cls));
+    OrderedTypeSet typeSet = cls.allSupertypesAndSelf;
+    if (!iterator.moveNext()) return typeSet.types.map((type) => type.element);
+
+    int depth = typeSet.maxDepth;
+    Link<OrderedTypeSet> otherTypeSets = const Link<OrderedTypeSet>();
+    do {
+      ClassElement otherClass = iterator.current;
+      assert(checkInvariants(otherClass));
+      OrderedTypeSet otherTypeSet = otherClass.allSupertypesAndSelf;
+      otherTypeSets = otherTypeSets.prepend(otherTypeSet);
+      if (otherTypeSet.maxDepth < depth) {
+        depth = otherTypeSet.maxDepth;
+      }
+    } while (iterator.moveNext());
+
+    List<ClassElement> commonSupertypes = <ClassElement>[];
+    OUTER: for (Link<DartType> link = typeSet[depth];
+                link.head.element != objectClass;
+                link = link.tail) {
+      ClassElement cls = link.head.element;
+      for (Link<OrderedTypeSet> link = otherTypeSets;
+          !link.isEmpty;
+          link = link.tail) {
+        if (link.head.asInstanceOf(cls) == null) {
+          continue OUTER;
+        }
+      }
+      commonSupertypes.add(cls);
+    }
+    commonSupertypes.add(objectClass);
+    return commonSupertypes;
+  }
+
+  /// Returns an iterable over the live mixin applications that mixin [cls].
+  Iterable<MixinApplicationElement> mixinUsesOf(ClassElement cls) {
+    Iterable<MixinApplicationElement> uses = _mixinUses[cls];
+    return uses != null ? uses : const <MixinApplicationElement>[];
+  }
+
+  /// Returns `true` if [cls] is mixed into a live class.
+  bool isUsedAsMixin(ClassElement cls) {
+    return !mixinUsesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if any live class that mixes in [cls] implements [type].
+  bool hasAnySubclassOfMixinUseThatImplements(ClassElement cls,
+                                              ClassElement type) {
+    return mixinUsesOf(cls).any(
+        (use) => hasAnySubclassThatImplements(use, type));
+  }
+
+  /// Returns `true` if any live class that mixes in [mixin] is also a subclass
+  /// of [superclass].
+  bool hasAnySubclassThatMixes(ClassElement superclass, ClassElement mixin) {
+    return mixinUsesOf(mixin).any((each) => each.isSubclassOf(superclass));
+  }
+
   final Compiler compiler;
+  Backend get backend => compiler.backend;
   final FunctionSet allFunctions;
   final Set<Element> functionsCalledInLoop = new Set<Element>();
   final Map<Element, SideEffects> sideEffects = new Map<Element, SideEffects>();
 
   final Set<TypedefElement> allTypedefs = new Set<TypedefElement>();
 
-  final Map<ClassElement, Set<MixinApplicationElement>> mixinUses =
-      new Map<ClassElement, Set<MixinApplicationElement>>();
+  final Map<ClassElement, List<MixinApplicationElement>> _mixinUses =
+      new Map<ClassElement, List<MixinApplicationElement>>();
 
   final Map<ClassElement, Set<ClassElement>> _typesImplementedBySubclasses =
       new Map<ClassElement, Set<ClassElement>>();
@@ -24,8 +286,6 @@
       new Map<ClassElement, Set<ClassElement>>();
   final Map<ClassElement, Set<ClassElement>> _subtypes =
       new Map<ClassElement, Set<ClassElement>>();
-  final Map<ClassElement, Set<ClassElement>> _supertypes =
-      new Map<ClassElement, Set<ClassElement>>();
 
   final Set<Element> sideEffectsFreeElements = new Set<Element>();
 
@@ -36,27 +296,27 @@
 
   final Set<Element> alreadyPopulated;
 
-  Set<ClassElement> subclassesOf(ClassElement cls) {
-    return _subclasses[cls.declaration];
+  bool get isClosed => compiler.phase > Compiler.PHASE_RESOLVING;
+
+  // Used by selectors.
+  bool isAssertMethod(Element element) {
+    return compiler.backend.isAssertMethod(element);
   }
 
-  Set<ClassElement> subtypesOf(ClassElement cls) {
-    return _subtypes[cls.declaration];
+  // Used by selectors.
+  bool isForeign(Element element) {
+    return element.isForeign(compiler.backend);
   }
 
-  Set<ClassElement> supertypesOf(ClassElement cls) {
-    return _supertypes[cls.declaration];
+  // Used by typed selectors.
+  ClassElement get nullImplementation {
+    return compiler.backend.nullImplementation;
   }
 
   Set<ClassElement> typesImplementedBySubclassesOf(ClassElement cls) {
     return _typesImplementedBySubclasses[cls.declaration];
   }
 
-  bool hasSubclasses(ClassElement cls) {
-    Set<ClassElement> subclasses = compiler.world.subclassesOf(cls);
-    return subclasses != null && !subclasses.isEmpty;
-  }
-
   World(Compiler compiler)
       : allFunctions = new FunctionSet(compiler),
         this.compiler = compiler,
@@ -68,35 +328,31 @@
         return;
       }
       assert(cls.isDeclaration);
-      if (cls.resolutionState != STATE_DONE) {
+      if (!cls.isResolved) {
         compiler.internalError(cls, 'Class "${cls.name}" is not resolved.');
       }
 
       for (DartType type in cls.allSupertypes) {
-        Set<Element> supertypesOfClass =
-            _supertypes.putIfAbsent(cls, () => new Set<ClassElement>());
         Set<Element> subtypesOfSupertype =
             _subtypes.putIfAbsent(type.element, () => new Set<ClassElement>());
-        supertypesOfClass.add(type.element);
         subtypesOfSupertype.add(cls);
       }
 
       // Walk through the superclasses, and record the types
       // implemented by that type on the superclasses.
-      DartType type = cls.supertype;
-      while (type != null) {
+      ClassElement superclass = cls.superclass;
+      while (superclass != null) {
         Set<Element> subclassesOfSuperclass =
-            _subclasses.putIfAbsent(type.element, () => new Set<ClassElement>());
+            _subclasses.putIfAbsent(superclass, () => new Set<ClassElement>());
         subclassesOfSuperclass.add(cls);
 
         Set<Element> typesImplementedBySubclassesOfCls =
             _typesImplementedBySubclasses.putIfAbsent(
-                type.element, () => new Set<ClassElement>());
+                superclass, () => new Set<ClassElement>());
         for (DartType current in cls.allSupertypes) {
           typesImplementedBySubclassesOfCls.add(current.element);
         }
-        ClassElement classElement = type.element;
-        type = classElement.supertype;
+        superclass = superclass.superclass;
       }
     }
 
@@ -107,52 +363,22 @@
     compiler.enqueuer.resolution.seenClasses.forEach(addSubtypes);
   }
 
-  Iterable<ClassElement> commonSupertypesOf(ClassElement x, ClassElement y) {
-    Set<ClassElement> xSet = supertypesOf(x);
-    if (xSet == null) return const <ClassElement>[];
-    Set<ClassElement> ySet = supertypesOf(y);
-    if (ySet == null) return const <ClassElement>[];
-    Set<ClassElement> smallSet, largeSet;
-    if (xSet.length <= ySet.length) {
-      smallSet = xSet;
-      largeSet = ySet;
-    } else {
-      smallSet = ySet;
-      largeSet = xSet;
-    }
-    return smallSet.where((ClassElement each) => largeSet.contains(each));
-  }
-
   void registerMixinUse(MixinApplicationElement mixinApplication,
                         ClassElement mixin) {
+    // TODO(johnniwinther): Add map restricted to live classes.
     // We don't support patch classes as mixin.
     assert(mixin.isDeclaration);
-    Set<MixinApplicationElement> users =
-        mixinUses.putIfAbsent(mixin, () =>
-                              new Set<MixinApplicationElement>());
+    List<MixinApplicationElement> users =
+        _mixinUses.putIfAbsent(mixin, () =>
+                               new List<MixinApplicationElement>());
     users.add(mixinApplication);
   }
 
-  bool isUsedAsMixin(ClassElement cls) {
-    Set<MixinApplicationElement> uses = mixinUses[cls];
-    return uses != null && !uses.isEmpty;
-  }
-
-  bool hasAnySubclass(ClassElement cls) {
-    Set<ClassElement> classes = subclassesOf(cls);
-    return classes != null && !classes.isEmpty;
-  }
-
-  bool hasAnySubtype(ClassElement cls) {
-    Set<ClassElement> classes = subtypesOf(cls);
-    return classes != null && !classes.isEmpty;
-  }
-
   bool hasAnyUserDefinedGetter(Selector selector) {
     return allFunctions.filter(selector).any((each) => each.isGetter);
   }
 
-  // Returns whether a subclass of [superclass] implements [type].
+  /// Returns whether a subclass of [superclass] implements [type].
   bool hasAnySubclassThatImplements(ClassElement superclass,
                                     ClassElement type) {
     Set<ClassElement> subclasses = typesImplementedBySubclassesOf(superclass);
@@ -160,33 +386,6 @@
     return subclasses.contains(type);
   }
 
-  // Returns whether a subclass of any mixin application of [cls] implements
-  // [type].
-  bool hasAnySubclassOfMixinUseThatImplements(ClassElement cls,
-                                              ClassElement type) {
-    Set<MixinApplicationElement> uses = mixinUses[cls];
-    if (uses == null || uses.isEmpty) return false;
-    return uses.any((use) => hasAnySubclassThatImplements(use, type));
-  }
-
-  // Returns whether a subclass of [superclass] mixes in [other].
-  bool hasAnySubclassThatMixes(ClassElement superclass, ClassElement other) {
-    Set<MixinApplicationElement> uses = mixinUses[other];
-    return (uses != null)
-        ? uses.any((each) => each.isSubclassOf(superclass))
-        : false;
-  }
-
-  bool isSubtype(ClassElement supertype, ClassElement test) {
-    Set<ClassElement> subtypes = subtypesOf(supertype);
-    return subtypes != null && subtypes.contains(test.declaration);
-  }
-
-  bool isSubclass(ClassElement superclass, ClassElement test) {
-    Set<ClassElement> subclasses = subclassesOf(superclass);
-    return subclasses != null && subclasses.contains(test.declaration);
-  }
-
   void registerUsedElement(Element element) {
     if (element.isInstanceMember && !element.isAbstract) {
       allFunctions.add(element);
@@ -200,7 +399,7 @@
 
   Element locateSingleElement(Selector selector) {
     ti.TypeMask mask = selector.mask == null
-        ? new ti.TypeMask.subclass(compiler.objectClass)
+        ? compiler.typesTask.dynamicType
         : selector.mask;
     return mask.locateSingleElement(selector, compiler);
   }
@@ -226,7 +425,7 @@
     return element.isFinal
         || element.isConst
         || (element.isInstanceMember
-            && !compiler.resolverWorld.hasInvokedSetter(element, compiler));
+            && !compiler.resolverWorld.hasInvokedSetter(element, this));
   }
 
   SideEffects getSideEffectsOfElement(Element element) {
diff --git a/sdk/lib/_internal/lib/convert_patch.dart b/sdk/lib/_internal/lib/convert_patch.dart
index ec09d24..dd7244d 100644
--- a/sdk/lib/_internal/lib/convert_patch.dart
+++ b/sdk/lib/_internal/lib/convert_patch.dart
@@ -337,10 +337,3 @@
   static _newJavaScriptObject()
       => JS('=Object', 'Object.create(null)');
 }
-
-@patch
-class _Utf8Encoder {
-  // Use Uint8List when supported on all platforms.
-  @patch
-  static List<int> _createBuffer(int size) => new List<int>(size);
-}
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 75b339d..85ab0b9 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -254,6 +254,16 @@
     }
     return result;
   }
+
+  @patch
+  factory List.from(Iterable other, { bool growable: true }) {
+    List<E> list = new List<E>();
+    for (E e in other) {
+      list.add(e);
+    }
+    if (growable) return list;
+    return makeListFixedLength(list);
+  }
 }
 
 
diff --git a/sdk/lib/_internal/lib/js_string.dart b/sdk/lib/_internal/lib/js_string.dart
index a6962cb..ec1ece1 100644
--- a/sdk/lib/_internal/lib/js_string.dart
+++ b/sdk/lib/_internal/lib/js_string.dart
@@ -70,9 +70,13 @@
     return stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
   }
 
-  String replaceFirst(Pattern from, String to) {
+  String replaceFirst(Pattern from, String to, [int startIndex = 0]) {
     checkString(to);
-    return stringReplaceFirstUnchecked(this, from, to);
+    checkInt(startIndex);
+    if (startIndex < 0 || startIndex > this.length) {
+      throw new RangeError.range(startIndex, 0, this.length);
+    }
+    return stringReplaceFirstUnchecked(this, from, to, startIndex);
   }
 
   List<String> split(Pattern pattern) {
diff --git a/sdk/lib/_internal/lib/string_helper.dart b/sdk/lib/_internal/lib/string_helper.dart
index c134844..ff25057 100644
--- a/sdk/lib/_internal/lib/string_helper.dart
+++ b/sdk/lib/_internal/lib/string_helper.dart
@@ -77,6 +77,14 @@
   return JS('String', r'#.replace(#, #)', receiver, replacer, to);
 }
 
+stringReplaceFirstRE(receiver, regexp, to, startIndex) {
+  var match = regexp._execGlobal(receiver, startIndex);
+  if (match == null) return receiver;
+  var start = match.start;
+  var end = match.end;
+  return "${receiver.substring(0,start)}$to${receiver.substring(end)}";
+}
+
 const String ESCAPE_REGEXP = r'[[\]{}()*+?.\\^$|]';
 
 stringReplaceAllUnchecked(receiver, from, to) {
@@ -185,12 +193,16 @@
 }
 
 
-stringReplaceFirstUnchecked(receiver, from, to) {
+stringReplaceFirstUnchecked(receiver, from, to, [int startIndex = 0]) {
   if (from is String) {
-    return stringReplaceJS(receiver, from, to);
+    var index = receiver.indexOf(from, startIndex);
+    if (index < 0) return receiver;
+    return '${receiver.substring(0, index)}$to'
+           '${receiver.substring(index + from.length)}';
   } else if (from is JSSyntaxRegExp) {
-    var re = regExpGetNative(from);
-    return stringReplaceJS(receiver, re, to);
+    return startIndex == 0 ?
+        stringReplaceJS(receiver, regExpGetNative(from), to) :
+        stringReplaceFirstRE(receiver, from, to, startIndex);
   } else {
     checkNull(from);
     // TODO(floitsch): implement generic String.replace (with patterns).
diff --git a/sdk/lib/_internal/pub/bin/async_compile.dart b/sdk/lib/_internal/pub/bin/async_compile.dart
new file mode 100644
index 0000000..c5c47de
--- /dev/null
+++ b/sdk/lib/_internal/pub/bin/async_compile.dart
@@ -0,0 +1,137 @@
+// 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:async_await/async_await.dart' as async_await;
+import 'package:path/path.dart' as p;
+
+/// The path to pub's root directory (sdk/lib/_internal/pub) in the Dart repo.
+///
+/// This assumes this script is itself being run from within the repo.
+final sourceDir = p.dirname(p.dirname(p.fromUri(Platform.script)));
+
+/// The [sourceDir] as a URL, for use in import strings.
+final sourceUrl = p.toUri(sourceDir).toString();
+
+/// The directory that compiler output should be written to.
+String buildDir;
+
+/// `true` if any file failed to compile.
+bool hadFailure = false;
+
+/// This runs the async/await compiler on all of the pub source code.
+///
+/// It reads from the repo and writes the compiled output into the given build
+/// directory (using the same file names and relative layout). Does not
+/// compile files that haven't changed since the last time they were compiled.
+// TODO(rnystrom): Remove this when #104 is fixed.
+void main(List<String> arguments) {
+  _validate(arguments.isNotEmpty, "Missing build directory.");
+  _validate(arguments.length <= 2, "Unexpected arguments.");
+  if (arguments.length == 2) {
+    _validate(arguments[1] == "--silent",
+        "Invalid argument '${arguments[1]}");
+  }
+
+  // Create the build output directory if it's not already there.
+  buildDir = p.join(p.normalize(arguments[0]), "pub_async");
+  new Directory(buildDir).createSync(recursive: true);
+
+  var silent = arguments.length == 2 && arguments[1] == "--silent";
+  var numFiles = 0;
+  var numCompiled = 0;
+
+  // Compile any modified or missing files.
+  for (var entry in new Directory(sourceDir).listSync(recursive: true)) {
+    if (p.extension(entry.path) != ".dart") continue;
+
+    // Skip tests.
+    // TODO(rnystrom): Do we want to use this for tests too?
+    if (p.isWithin(p.join(sourceDir, "test"), entry.path)) continue;
+
+    numFiles++;
+    var relative = p.relative(entry.path, from: sourceDir);
+
+    var sourceFile = entry as File;
+    var destPath = p.join(buildDir, relative);
+    var destFile = new File(destPath);
+    if (!destFile.existsSync() ||
+        entry.lastModifiedSync().isAfter(destFile.lastModifiedSync())) {
+      _compile(sourceFile.path, sourceFile.readAsStringSync(), destPath);
+      numCompiled++;
+      if (!silent) print("Compiled ${sourceFile.path}.");
+    }
+  }
+
+  if (!silent) print("Compiled $numCompiled out of $numFiles files.");
+
+  if (hadFailure) exit(1);
+}
+
+final _compilerPattern = new RegExp(r"import '(\.\./)+compiler");
+
+void _compile(String sourcePath, String source, String destPath) {
+  var destDir = new Directory(p.dirname(destPath));
+  destDir.createSync(recursive: true);
+
+  source = _translateAsyncAwait(sourcePath, source);
+  if (source != null) source = _fixDart2jsImports(sourcePath, source, destPath);
+
+  try {
+    if (source == null) {
+      // If the async compile fails, delete the file so that we don't try to
+      // run the stale previous output and so that we try to recompile it later.
+      _deleteFile(destPath);
+    } else {
+      new File(destPath).writeAsStringSync(source);
+    }
+  } on IOException catch (ex) {
+    // Do nothing. This may happen if two instances of the compiler are running
+    // concurrently and compile the same file. The second one may fail because
+    // the first is still working on it. Since they will end up producing the
+    // same output anyway, just ignore the failure.
+  }
+}
+
+/// Runs the async/await compiler on [source].
+///
+/// Returns the translated Dart code or `null` if the compiler failed.
+String _translateAsyncAwait(String sourcePath, String source) {
+  if (p.isWithin(p.join(sourceDir, "asset"), sourcePath)) {
+    // Don't run the async compiler on the special "asset" source files. These
+    // have preprocessor comments that get discarded by the compiler.
+    return source;
+  }
+
+  try {
+    return async_await.compile(source);
+  } catch (ex) {
+    stderr.writeln("Async compile failed on $sourcePath:\n$ex");
+    hadFailure = true;
+    return null;
+  }
+}
+
+/// Fix relative imports to dart2js libraries.
+///
+/// Pub imports dart2js using relative imports that reach outside of pub's
+/// source tree. Since the build directory is in a different location, we need
+/// to fix those to be valid relative imports from the build directory.
+String _fixDart2jsImports(String sourcePath, String source, String destPath) {
+  var compilerDir = p.url.join(sourceUrl, "../compiler");
+  var relative = p.url.relative(compilerDir, from: p.dirname(destPath));
+  return source.replaceAll(_compilerPattern, "import '$relative");
+}
+
+/// Validates command-line argument usage and exits with [message] if [valid]
+/// is `false`.
+void _validate(bool valid, String message) {
+  if (valid) return;
+
+  stderr.writeln(message);
+  stderr.writeln();
+  stderr.writeln("Usage: dart async_compile.dart <build dir> [--silent]");
+  exit(64);
+}
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 35b8c90..8f7fa4e 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -17,6 +17,7 @@
 import '../lib/src/io.dart';
 import '../lib/src/log.dart' as log;
 import '../lib/src/sdk.dart' as sdk;
+import '../lib/src/solver/version_solver.dart';
 import '../lib/src/utils.dart';
 
 void main(List<String> arguments) {
@@ -115,7 +116,8 @@
   while (exception is WrappedException) exception = exception.innerError;
 
   if (exception is HttpException || exception is http.ClientException ||
-      exception is SocketException || exception is PubHttpException) {
+      exception is SocketException || exception is PubHttpException ||
+      exception is DependencyNotFoundException) {
     return exit_codes.UNAVAILABLE;
   } else if (exception is FormatException || exception is DataException) {
     return exit_codes.DATA;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index 75f90d7..54d30f1 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -48,24 +48,28 @@
   /// This will only add the root package's "lib" directory to the environment.
   /// Other directories can be added to the environment using [serveDirectory].
   ///
-  /// If [watcherType] is not [WatcherType.NONE], watches source assets for
-  /// modification.
+  /// If [watcherType] is not [WatcherType.NONE] (the default), watches source
+  /// assets for modification.
+  ///
+  /// If [packages] is passed, only those packages' assets will be loaded and
+  /// served.
   ///
   /// Returns a [Future] that completes to the environment once the inputs,
   /// transformers, and server are loaded and ready.
   static Future<AssetEnvironment> create(Entrypoint entrypoint,
-      BarbackMode mode, WatcherType watcherType,
-      {String hostname, int basePort, bool useDart2JS: true}) {
+      BarbackMode mode, {WatcherType watcherType, String hostname, int basePort,
+      Iterable<String> packages, bool useDart2JS: true}) {
+    if (watcherType == null) watcherType = WatcherType.NONE;
     if (hostname == null) hostname = "localhost";
     if (basePort == null) basePort = 0;
 
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
-      var barback = new Barback(new PubPackageProvider(graph));
+      var barback = new Barback(new PubPackageProvider(graph, packages));
       barback.log.listen(_log);
 
       var environment = new AssetEnvironment._(graph, barback, mode,
-          watcherType, hostname, basePort);
+          watcherType, hostname, basePort, packages);
 
       return environment._load(useDart2JS: useDart2JS)
           .then((_) => environment);
@@ -108,6 +112,12 @@
   /// numbers will be selected for each server.
   final int _basePort;
 
+  /// The set of all packages that are visible for this environment.
+  ///
+  /// By default, this is all transitive dependencies of the entrypoint, but it
+  /// may be a narrower set if fewer packages are needed.
+  final Set<String> packages;
+
   /// The modified source assets that have not been sent to barback yet.
   ///
   /// The build environment can be paused (by calling [pauseUpdates]) and
@@ -123,8 +133,12 @@
   /// go to barback immediately.
   Set<AssetId> _modifiedSources;
 
-  AssetEnvironment._(this.graph, this.barback, this.mode, this._watcherType,
-      this._hostname, this._basePort);
+  AssetEnvironment._(PackageGraph graph, this.barback, this.mode,
+        this._watcherType, this._hostname, this._basePort,
+        Iterable<String> packages)
+      : graph = graph,
+        packages = packages == null ? graph.packages.keys.toSet() :
+            packages.toSet();
 
   /// Gets the built-in [Transformer]s that should be added to [package].
   ///
@@ -277,7 +291,7 @@
   Future<List<Uri>> _lookUpPathInPackagesDirectory(String assetPath) {
     var components = path.split(path.relative(assetPath));
     if (components.first != "packages") return new Future.value([]);
-    if (!graph.packages.containsKey(components[1])) return new Future.value([]);
+    if (!packages.contains(components[1])) return new Future.value([]);
     return Future.wait(_directories.values.map((dir) {
       return dir.server.then((server) =>
           server.url.resolveUri(path.toUri(assetPath)));
@@ -287,7 +301,8 @@
   /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
   /// package.
   Future<List<Uri>> _lookUpPathInDependency(String assetPath) {
-    for (var package in graph.packages.values) {
+    for (var packageName in packages) {
+      var package = graph.packages[packageName];
       var libDir = path.join(package.dir, 'lib');
       var assetDir = path.join(package.dir, 'asset');
 
@@ -465,8 +480,9 @@
     // Just include the "lib" directory from each package. We'll add the
     // other build directories in the root package by calling
     // [serveDirectory].
-    return Future.wait(graph.packages.values.map(
-        (package) => _provideDirectorySources(package, "lib")));
+    return Future.wait(packages.map((package) {
+      return _provideDirectorySources(graph.packages[package], "lib");
+    }));
   }
 
   /// Provides all of the source assets within [dir] in [package] to barback.
@@ -520,7 +536,7 @@
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  List<AssetId> _listDirectorySources(Package package, String dir) {
+  Iterable<AssetId> _listDirectorySources(Package package, String dir) {
     var subdirectory = path.join(package.dir, dir);
     if (!dirExists(subdirectory)) return [];
 
@@ -529,29 +545,18 @@
     // readability than most code in pub. In particular, it avoids using the
     // path package, since re-parsing a path is very expensive relative to
     // string operations.
-    return package.listFiles(beneath: subdirectory).expand((file) {
-      var relative = file.substring(package.dir.length + 1);
-
-      // Skip files that were (most likely) compiled from nearby ".dart"
-      // files. These are created by the Editor's "Run as JavaScript"
-      // command and are written directly into the package's directory.
-      // When pub's dart2js transformer then tries to create the same file
-      // name, we get a build error. To avoid that, just don't consider
-      // that file to be a source.
-      // TODO(rnystrom): Remove these when the Editor no longer generates
-      // .js files and users have had enough time that they no longer have
-      // these files laying around. See #15859.
-      if (relative.endsWith(".dart.js")) return [];
-      if (relative.endsWith(".dart.js.map")) return [];
-      if (relative.endsWith(".dart.precompiled.js")) return [];
+    return package.listFiles(beneath: subdirectory).map((file) {
+      // From profiling, path.relative here is just as fast as a raw substring
+      // and is correct in the case where package.dir has a trailing slash.
+      var relative = path.relative(file, from: package.dir);
 
       if (Platform.operatingSystem == 'windows') {
         relative = relative.replaceAll("\\", "/");
       }
 
       var uri = new Uri(pathSegments: relative.split("/"));
-      return [new AssetId(package.name, uri.toString())];
-    }).toList();
+      return new AssetId(package.name, uri.toString());
+    });
   }
 
   /// Adds a file watcher for [dir] within [package], if the directory exists
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 5956aea..18bf853 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -55,8 +55,8 @@
   // Add a rewrite transformer for each package, so that we can resolve
   // "package:" imports while loading transformers.
   var rewrite = new RewriteImportTransformer();
-  for (var package in environment.graph.packages.values) {
-    environment.barback.updateTransformers(package.name, [[rewrite]]);
+  for (var package in environment.packages) {
+    environment.barback.updateTransformers(package, [[rewrite]]);
   }
   environment.barback.updateTransformers(r'$pub', [[rewrite]]);
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 5e2c306..36ec865 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -21,9 +21,10 @@
   final PackageGraph _graph;
   final List<String> packages;
 
-  PubPackageProvider(PackageGraph graph)
+  PubPackageProvider(PackageGraph graph, [Iterable<String> packages])
       : _graph = graph,
-        packages = [r"$pub", r"$sdk"]..addAll(graph.packages.keys);
+        packages = [r"$pub", r"$sdk"]
+            ..addAll(packages == null ? graph.packages.keys : packages);
 
   Future<Asset> getAsset(AssetId id) {
     // "$pub" is a psuedo-package that allows pub's transformer-loading
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index f086af1..0f1dc24 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -43,7 +43,7 @@
         defaultsTo: "build");
   }
 
-  Future onRunTransformerCommand() {
+  Future onRunTransformerCommand() async {
     cleanDir(outputDirectory);
 
     var errorsJson = [];
@@ -52,8 +52,8 @@
     // Since this server will only be hit by the transformer loader and isn't
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
-    return AssetEnvironment.create(entrypoint, mode, WatcherType.NONE,
-        useDart2JS: true).then((environment) {
+    return AssetEnvironment.create(entrypoint, mode, useDart2JS: true)
+        .then((environment) {
       // Show in-progress errors, but not results. Those get handled
       // implicitly by getAllAssets().
       environment.barback.errors.listen((error) {
@@ -124,12 +124,10 @@
   ///
   /// If [asset] is in the special "packages" directory, writes it to every
   /// build directory.
-  Future _writeAsset(Asset asset) {
+  Future _writeAsset(Asset asset) async {
     // In release mode, strip out .dart files since all relevant ones have been
     // compiled to JavaScript already.
-    if (mode == BarbackMode.RELEASE && asset.id.extension == ".dart") {
-      return new Future.value();
-    }
+    if (mode == BarbackMode.RELEASE && asset.id.extension == ".dart") return;
 
     var destPath = _idToPath(asset.id);
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/global.dart b/sdk/lib/_internal/pub/lib/src/command/global.dart
index 8c2105c..c1b1730 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global.dart
@@ -7,6 +7,7 @@
 import '../command.dart';
 import 'global_activate.dart';
 import 'global_deactivate.dart';
+import 'global_list.dart';
 import 'global_run.dart';
 
 /// Handles the `global` pub command.
@@ -17,6 +18,7 @@
   final subcommands = {
     "activate": new GlobalActivateCommand(),
     "deactivate": new GlobalDeactivateCommand(),
+    "list": new GlobalListCommand(),
     "run": new GlobalRunCommand()
   };
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
index 98ba40e..8448af5 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
@@ -20,7 +20,7 @@
     commandParser.addOption("source",
         abbr: "s",
         help: "The source used to find the package.",
-        allowed: ["hosted", "path"],
+        allowed: ["git", "hosted", "path"],
         defaultsTo: "hosted");
   }
 
@@ -41,10 +41,16 @@
       usageError("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    var package = readArg("No package to activate given.");
-
     switch (commandOptions["source"]) {
+      case "git":
+        var repo = readArg("No Git repository given.");
+        // TODO(rnystrom): Allow passing in a Git ref too.
+        validateNoExtraArgs();
+        return globals.activateGit(repo);
+
       case "hosted":
+        var package = readArg("No package to activate given.");
+
         // Parse the version constraint, if there is one.
         var constraint = VersionConstraint.any;
         if (args.isNotEmpty) {
@@ -59,8 +65,9 @@
         return globals.activateHosted(package, constraint);
 
       case "path":
+        var path = readArg("No package to activate given.");
         validateNoExtraArgs();
-        return globals.activatePath(package);
+        return globals.activatePath(path);
     }
 
     throw "unreachable";
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_list.dart b/sdk/lib/_internal/pub/lib/src/command/global_list.dart
new file mode 100644
index 0000000..c498b42
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/global_list.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 pub.command.global_list;
+
+import 'dart:async';
+
+import '../command.dart';
+
+/// Handles the `global list` pub command.
+class GlobalListCommand extends PubCommand {
+  bool get allowTrailingOptions => false;
+  String get description => 'List globally activated packages.';
+  String get usage => 'pub global list';
+
+  Future onRun() {
+    globals.listActivePackages();
+    return null;
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_run.dart b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
index d0f35ba..86eb30b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
@@ -20,7 +20,7 @@
       "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub global run <package>:<executable> [args...]";
 
-  Future onRun() {
+  Future onRun() async {
     if (commandOptions.rest.isEmpty) {
       usageError("Must specify an executable to run.");
     }
@@ -38,9 +38,9 @@
 
     var args = commandOptions.rest.skip(1).toList();
 
-    return globals.find(package).then((entrypoint) {
-      return runExecutable(this, entrypoint, package, executable, args,
-          isGlobal: true);
-    }).then(flushThenExit);
+    var entrypoint = await globals.find(package);
+    var exitCode = await runExecutable(this, entrypoint, package, executable,
+          args, isGlobal: true);
+    await flushThenExit(exitCode);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
index 9881b6d..45c0931 100644
--- a/sdk/lib/_internal/pub/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -19,7 +19,7 @@
       "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub run <executable> [args...]";
 
-  Future onRun() {
+  Future onRun() async {
     if (commandOptions.rest.isEmpty) {
       usageError("Must specify an executable to run.");
     }
@@ -36,7 +36,8 @@
       executable = components[1];
     }
 
-    return runExecutable(this, entrypoint, package, executable, args)
-        .then(flushThenExit);
+    var exitCode = await runExecutable(this, entrypoint, package, executable,
+        args);
+    await flushThenExit(exitCode);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 1699797..0d6a84d 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -87,7 +87,7 @@
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
-    return AssetEnvironment.create(entrypoint, mode, watcherType,
+    return AssetEnvironment.create(entrypoint, mode, watcherType: watcherType,
         hostname: hostname, basePort: port, useDart2JS: useDart2JS)
         .then((environment) {
 
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 9d2f815..25bb14f 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -5,14 +5,19 @@
 library pub.entrypoint;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:path/path.dart' as path;
+import 'package:barback/barback.dart';
 
+import 'barback/asset_environment.dart';
+import 'exceptions.dart';
 import 'io.dart';
 import 'lock_file.dart';
 import 'log.dart' as log;
 import 'package.dart';
 import 'package_graph.dart';
+import 'sdk.dart' as sdk;
 import 'solver/version_solver.dart';
 import 'source/cached.dart';
 import 'system_cache.dart';
@@ -52,6 +57,9 @@
   /// If not provided to the entrypoint, it will be laoded lazily from disc.
   LockFile _lockFile;
 
+  /// The graph of all packages reachable from the entrypoint.
+  PackageGraph _packageGraph;
+
   /// Loads the entrypoint from a package at [rootDir].
   ///
   /// If [packageSymlinks] is `true`, this will create a "packages" directory
@@ -133,10 +141,177 @@
         _linkOrDeleteSecondaryPackageDirs();
 
         result.summarizeChanges(type, dryRun: dryRun);
+
+        /// Build a package graph from the version solver results so we don't
+        /// have to reload and reparse all the pubspecs.
+        return Future.wait(ids.map((id) {
+          return cache.sources[id.source].getDirectory(id).then((dir) {
+            return new Package(result.pubspecs[id.name], dir);
+          });
+        }));
+      }).then((packages) {
+        _packageGraph = new PackageGraph(this, _lockFile,
+            new Map.fromIterable(packages, key: (package) => package.name));
+
+        return precompileExecutables(changed: result.changedPackages)
+            .catchError((error, stackTrace) {
+          // Just log exceptions here. Since the method is just about acquiring
+          // dependencies, it shouldn't fail unless that fails.
+          log.exception(error, stackTrace);
+        });
       });
     });
   }
 
+  /// Precompiles all executables from dependencies that don't transitively
+  /// depend on [this] or on a path dependency.
+  Future precompileExecutables({Iterable<String> changed}) {
+    if (changed != null) changed = changed.toSet();
+
+    var binDir = path.join('.pub', 'bin');
+    var sdkVersionPath = path.join(binDir, 'sdk-version');
+
+    // If the existing executable was compiled with a different SDK, we need to
+    // recompile regardless of what changed.
+    var sdkMatches = fileExists(sdkVersionPath) &&
+        readTextFile(sdkVersionPath) == "${sdk.version}\n";
+    if (!sdkMatches) changed = null;
+
+    return loadPackageGraph().then((graph) {
+      var executables = new Map.fromIterable(root.immediateDependencies,
+          key: (dep) => dep.name,
+          value: (dep) => _executablesForPackage(graph, dep.name, changed));
+
+      for (var package in executables.keys.toList()) {
+        if (executables[package].isEmpty) executables.remove(package);
+      }
+
+      if (!sdkMatches) deleteEntry(binDir);
+      if (executables.isEmpty) return null;
+
+      return log.progress("Precompiling executables", () {
+        ensureDir(binDir);
+
+        // Make sure there's a trailing newline so our version file matches the
+        // SDK's.
+        writeTextFile(sdkVersionPath, "${sdk.version}\n");
+
+        var packagesToLoad =
+            unionAll(executables.keys.map(graph.transitiveDependencies))
+            .map((package) => package.name).toSet();
+        return AssetEnvironment.create(this, BarbackMode.RELEASE,
+            packages: packagesToLoad,
+            useDart2JS: false).then((environment) {
+          environment.barback.errors.listen((error) {
+            log.error(log.red("Build error:\n$error"));
+          });
+
+          return waitAndPrintErrors(executables.keys.map((package) {
+            return _precompileExecutablesForPackage(
+                environment, package, executables[package]);
+          }));
+        });
+      });
+    });
+  }
+
+  /// Returns the list of all executable assets for [packageName] that should be
+  /// precompiled.
+  ///
+  /// If [changed] isn't `null`, executables for [packageName] will only be
+  /// compiled if they might depend on a package in [changed].
+  List<AssetId> _executablesForPackage(PackageGraph graph, String packageName,
+      Set<String> changed) {
+    var package = graph.packages[packageName];
+    var binDir = path.join(package.dir, 'bin');
+    if (!dirExists(binDir)) return [];
+
+    // If the lockfile has a dependency on the entrypoint or on a path
+    // dependency, its executables could change at any point, so we
+    // shouldn't precompile them.
+    var deps = graph.transitiveDependencies(packageName);
+    var hasUncachedDependency = deps.any((package) {
+      var source = cache.sources[graph.lockFile.packages[package.name].source];
+      return source is! CachedSource;
+    });
+    if (hasUncachedDependency) return [];
+
+    var executables =
+        ordered(package.listFiles(beneath: binDir, recursive: false))
+        .where((executable) => path.extension(executable) == '.dart')
+        .map((executable) {
+      return new AssetId(
+          package.name,
+          path.toUri(path.relative(executable, from: package.dir))
+              .toString());
+    }).toList();
+
+    // If we don't know which packages were changed, always precompile the
+    // executables.
+    if (changed == null) return executables;
+
+    // If any of the package's dependencies changed, recompile the executables.
+    if (deps.any((package) => changed.contains(package.name))) {
+      return executables;
+    }
+
+    // If any executables doesn't exist, precompile them regardless of what
+    // changed. Since we delete the bin directory before recompiling, we need to
+    // recompile all executables.
+    var executablesExist = executables.every((executable) =>
+        fileExists(path.join('.pub', 'bin', packageName,
+            "${path.url.basename(executable.path)}.snapshot")));
+    if (!executablesExist) return executables;
+
+    // Otherwise, we don't need to recompile.
+    return [];
+  }
+
+  /// Precompiles all [executables] for [package].	
+  ///	
+  /// [executables] is assumed to be a list of Dart executables in [package]'s	
+  /// bin directory.
+  Future _precompileExecutablesForPackage(
+      AssetEnvironment environment, String package, List<AssetId> executables) {
+    var cacheDir = path.join('.pub', 'bin', package);
+    cleanDir(cacheDir);
+
+    // TODO(nweiz): Unserve this directory when we're done with it.
+    return environment.servePackageBinDirectory(package).then((server) {
+      return waitAndPrintErrors(executables.map((id) {
+        var basename = path.url.basename(id.path);
+        var snapshotPath = path.join(cacheDir, "$basename.snapshot");
+        return runProcess(Platform.executable, [
+          '--snapshot=$snapshotPath',
+          server.url.resolve(basename).toString()
+        ]).then((result) {
+          if (result.success) {
+            log.message("Precompiled ${_executableName(id)}.");
+          } else {
+            // TODO(nweiz): Stop manually deleting this when issue 20504 is
+            // fixed.
+            deleteEntry(snapshotPath);
+            throw new ApplicationException(
+                log.yellow("Failed to precompile "
+                    "${_executableName(id)}:\n") +
+                result.stderr.join('\n'));
+          }
+        });
+      })).whenComplete(() {
+        // Don't return this future, since we have no need to wait for the
+        // server to fully shut down.
+        server.close();
+      });
+    });
+  }
+
+  /// Returns the executable name for [id].
+  ///
+  /// [id] is assumed to be an executable in a bin directory. The return value
+  /// is intended for log output and may contain formatting.
+  String _executableName(AssetId id) =>
+      log.bold("${id.package}:${path.basenameWithoutExtension(id.path)}");
+
   /// Makes sure the package at [id] is locally available.
   ///
   /// This automatically downloads the package to the system-wide cache as well
@@ -249,6 +424,8 @@
   /// Before loading, makes sure the lockfile and dependencies are installed
   /// and up to date.
   Future<PackageGraph> loadPackageGraph() {
+    if (_packageGraph != null) return new Future.value(_packageGraph);
+
     return ensureLockFileIsUpToDate().then((_) {
       return Future.wait(lockFile.packages.values.map((id) {
         var source = cache.sources[id.source];
@@ -257,7 +434,8 @@
       })).then((packages) {
         var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
         packageMap[root.name] = root;
-        return new PackageGraph(this, lockFile, packageMap);
+        _packageGraph = new PackageGraph(this, lockFile, packageMap);
+        return _packageGraph;
       });
     });
   }
diff --git a/sdk/lib/_internal/pub/lib/src/executable.dart b/sdk/lib/_internal/pub/lib/src/executable.dart
index 9d62188..5cecc13 100644
--- a/sdk/lib/_internal/pub/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub/lib/src/executable.dart
@@ -15,7 +15,9 @@
 import 'command.dart';
 import 'entrypoint.dart';
 import 'exit_codes.dart' as exit_codes;
+import 'io.dart';
 import 'log.dart' as log;
+import 'sdk.dart' as sdk;
 import 'utils.dart';
 
 /// Runs [executable] from [package] reachable from [entrypoint].
@@ -31,6 +33,18 @@
 Future<int> runExecutable(PubCommand command, Entrypoint entrypoint,
     String package, String executable, Iterable<String> args,
     {bool isGlobal: false}) {
+  // Unless the user overrides the verbosity, we want to filter out the
+  // normal pub output shown while loading the environment.
+  if (log.verbosity == log.Verbosity.NORMAL) {
+    log.verbosity = log.Verbosity.WARNING;
+  }
+
+  var snapshotPath = p.join(".pub", "bin", package,
+      "$executable.dart.snapshot");
+  if (!isGlobal && fileExists(snapshotPath)) {
+    return _runCachedExecutable(entrypoint, snapshotPath, args);
+  }
+
   // If the command has a path separator, then it's a path relative to the
   // root of the package. Otherwise, it's implicitly understood to be in
   // "bin".
@@ -50,15 +64,11 @@
     executable = p.join("bin", executable);
   }
 
-  // Unless the user overrides the verbosity, we want to filter out the
-  // normal pub output shown while loading the environment.
-  if (log.verbosity == log.Verbosity.NORMAL) {
-    log.verbosity = log.Verbosity.WARNING;
-  }
-
   var environment;
+  // TODO(nweiz): Use [packages] to only load assets from packages that the
+  // executable might load.
   return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
-      WatcherType.NONE, useDart2JS: false).then((_environment) {
+      useDart2JS: false).then((_environment) {
     environment = _environment;
 
     environment.barback.errors.listen((error) {
@@ -128,3 +138,32 @@
     });
   });
 }
+
+/// Runs the executable snapshot at [snapshotPath].
+Future _runCachedExecutable(Entrypoint entrypoint, String snapshotPath,
+    List<String> args) {
+  return syncFuture(() {
+    // If the snapshot was compiled with a different SDK version, we need to
+    // recompile it.
+    var sdkVersionPath = p.join(".pub", "bin", "sdk-version");
+    if (fileExists(sdkVersionPath) &&
+        readTextFile(sdkVersionPath) == "${sdk.version}\n") {
+      return null;
+    }
+
+    log.fine("Precompiled executables are out of date.");
+    return entrypoint.precompileExecutables();
+  }).then((_) {
+    var vmArgs = ["--checked", snapshotPath]..addAll(args);
+
+    return Process.start(Platform.executable, vmArgs).then((process) {
+      // Note: we're not using process.std___.pipe(std___) here because
+      // that prevents pub from also writing to the output streams.
+      process.stderr.listen(stderr.add);
+      process.stdout.listen(stdout.add);
+      stdin.listen(process.stdin.add);
+
+      return process.exitCode;
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index 0baa650..bbb289a 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -14,10 +14,11 @@
 import 'lock_file.dart';
 import 'log.dart' as log;
 import 'package.dart';
+import 'pubspec.dart';
 import 'system_cache.dart';
 import 'solver/version_solver.dart';
-import 'source.dart';
 import 'source/cached.dart';
+import 'source/git.dart';
 import 'source/path.dart';
 import 'utils.dart';
 import 'version.dart';
@@ -60,28 +61,24 @@
   /// when needed.
   GlobalPackages(this.cache);
 
+  /// Caches the package located in the Git repository [repo] and makes it the
+  /// active global version.
+  Future activateGit(String repo) {
+    var source = cache.sources["git"] as GitSource;
+    return source.getPackageNameFromRepo(repo).then((name) {
+      // Call this just to log what the current active package is, if any.
+      _describeActive(name);
+
+      return _installInCache(
+          new PackageDep(name, "git", VersionConstraint.any, repo));
+    });
+  }
+
   /// Finds the latest version of the hosted package with [name] that matches
   /// [constraint] and makes it the active global version.
   Future activateHosted(String name, VersionConstraint constraint) {
     _describeActive(name);
-
-    var source = cache.sources["hosted"];
-    return source.getVersions(name, name).then((versions) {
-      versions = versions.where(constraint.allows).toList();
-
-      if (versions.isEmpty) {
-        // TODO(rnystrom): Show most recent unmatching version?
-        dataError("Package ${log.bold(name)} has no versions that match "
-            "$constraint.");
-      }
-
-      // Pick the best matching version.
-      versions.sort(Version.prioritize);
-
-      // Make sure it's in the cache.
-      var id = new PackageId(name, "hosted", versions.last, name);
-      return _installInCache(id);
-    });
+    return _installInCache(new PackageDep(name, "hosted", constraint, name));
   }
 
   /// Makes the local package at [path] globally active.
@@ -99,36 +96,33 @@
       var fullPath = canonicalize(entrypoint.root.dir);
       var id = new PackageId(name, "path", entrypoint.root.version,
           PathSource.describePath(fullPath));
-      _writeLockFile(id, new LockFile.empty());
+      _writeLockFile(name, new LockFile([id]));
     });
   }
 
-  /// Installs the package [id] and its dependencies into the system cache.
-  Future _installInCache(PackageId id) {
-    var source = cache.sources[id.source];
+  /// Installs the package [dep] and its dependencies into the system cache.
+  Future _installInCache(PackageDep dep) {
+    var source = cache.sources[dep.source];
 
-    // Put the main package in the cache.
-    return source.downloadToSystemCache(id).then((package) {
-      // If we didn't know the version for the ID (which is true for Git
-      // packages), look it up now that we have it.
-      if (id.version == Version.none) {
-        id = id.atVersion(package.version);
+    // Create a dummy package with just [dep] so we can do resolution on it.
+    var root = new Package.inMemory(new Pubspec("pub global activate",
+        dependencies: [dep], sources: cache.sources));
+
+    // Resolve it and download its dependencies.
+    return resolveVersions(SolveType.GET, cache.sources, root).then((result) {
+      if (!result.succeeded) {
+        // If the package specified by the user doesn't exist, we want to
+        // surface that as a [DataError] with the associated exit code.
+        if (result.error.package != dep.name) throw result.error;
+        if (result.error is NoVersionException) dataError(result.error.message);
+        throw result.error;
       }
-
-      return source.resolveId(id).then((id_) {
-        id = id_;
-
-        // Resolve it and download its dependencies.
-        return resolveVersions(SolveType.GET, cache.sources, package);
-      });
-    }).then((result) {
-      if (!result.succeeded) throw result.error;
       result.showReport(SolveType.GET);
 
       // Make sure all of the dependencies are locally installed.
       return Future.wait(result.packages.map(_cacheDependency));
     }).then((ids) {
-      _writeLockFile(id, new LockFile(ids));
+      _writeLockFile(dep.name, new LockFile(ids));
     });
   }
 
@@ -146,41 +140,36 @@
     }).then((_) => source.resolveId(id));
   }
 
-  /// Finishes activating package [id] by saving [lockFile] in the cache.
-  void _writeLockFile(PackageId id, LockFile lockFile) {
-    // Add the root package to the lockfile.
-    lockFile.packages[id.name] = id;
-
+  /// Finishes activating package [package] by saving [lockFile] in the cache.
+  void _writeLockFile(String package, LockFile lockFile) {
     ensureDir(_directory);
-    writeTextFile(_getLockFilePath(id.name),
+    writeTextFile(_getLockFilePath(package),
         lockFile.serialize(cache.rootDir, cache.sources));
 
-    if (id.source == "path") {
-      var path = PathSource.pathFromDescription(id.description);
-      log.message('Activated ${log.bold(id.name)} ${id.version} at path '
-          '"$path".');
-    } else {
-      log.message("Activated ${log.bold(id.name)} ${id.version}.");
-    }
+    var id = lockFile.packages[package];
+    log.message('Activated ${_formatPackage(id)}.');
 
     // TODO(rnystrom): Look in "bin" and display list of binaries that
     // user can run.
   }
 
   /// Shows the user the currently active package with [name], if any.
-  void _describeActive(String package) {
+  void _describeActive(String name) {
     try {
-      var lockFile = new LockFile.load(_getLockFilePath(package),
-          cache.sources);
-      var id = lockFile.packages[package];
+      var lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
+      var id = lockFile.packages[name];
 
-      if (id.source == "path") {
+      if (id.source == 'git') {
+        var url = GitSource.urlFromDescription(id.description);
+        log.message('Package ${log.bold(name)} is currently active from Git '
+            'repository "${url}".');
+      } else if (id.source == 'path') {
         var path = PathSource.pathFromDescription(id.description);
-        log.message('Package ${log.bold(package)} is currently active at '
-            'path "$path".');
+        log.message('Package ${log.bold(name)} is currently active at path '
+            '"$path".');
       } else {
-        log.message("Package ${log.bold(package)} is currently active at "
-            "version ${log.bold(id.version)}.");
+        log.message('Package ${log.bold(name)} is currently active at version '
+            '${log.bold(id.version)}.');
       }
     } on IOException catch (error) {
       // If we couldn't read the lock file, it's not activated.
@@ -190,7 +179,7 @@
 
   /// Deactivates a previously-activated package named [name].
   ///
-  /// If [logDeletion] is true, displays to the user when a package is
+  /// If [logDeactivate] is true, displays to the user when a package is
   /// deactivated. Otherwise, deactivates silently.
   ///
   /// Returns `false` if no package with [name] was currently active.
@@ -204,12 +193,7 @@
     deleteEntry(lockFilePath);
 
     if (logDeactivate) {
-      if (id.source == "path") {
-        var path = PathSource.pathFromDescription(id.description);
-        log.message('Deactivated package ${log.bold(name)} at path "$path".');
-      } else {
-        log.message("Deactivated package ${log.bold(name)} ${id.version}.");
-      }
+      log.message('Deactivated package ${_formatPackage(id)}.');
     }
 
     return true;
@@ -254,4 +238,38 @@
   /// Gets the path to the lock file for an activated cached package with
   /// [name].
   String _getLockFilePath(name) => p.join(_directory, name + ".lock");
+
+  /// Shows to the user formatted list of globally activated packages.
+  void listActivePackages() {
+    if (!dirExists(_directory)) return;
+
+    // Loads lock [file] and returns [PackageId] of the activated package.
+    loadPackageId(file) {
+      var name = p.basenameWithoutExtension(file);
+      var lockFile = new LockFile.load(p.join(_directory, file), cache.sources);
+      return lockFile.packages[name];
+    }
+
+    var packages = listDir(_directory, includeDirs: false)
+        .where((file) => p.extension(file) == '.lock')
+        .map(loadPackageId)
+        .toList();
+
+    packages
+        ..sort((id1, id2) => id1.name.compareTo(id2.name))
+        ..forEach((id) => log.message(_formatPackage(id)));
+  }
+
+  /// Returns formatted string representing the package [id].
+  String _formatPackage(PackageId id) {
+    if (id.source == 'git') {
+      var url = GitSource.urlFromDescription(id.description);
+      return '${log.bold(id.name)} ${id.version} from Git repository "$url"';
+    } else if (id.source == 'path') {
+      var path = PathSource.pathFromDescription(id.description);
+      return '${log.bold(id.name)} ${id.version} at path "$path"';
+    } else {
+      return '${log.bold(id.name)} ${id.version}';
+    }
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index ffbf30e..f3b0f1c 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -289,6 +289,16 @@
     if (entity is Link) return false;
     if (includeHidden) return true;
 
+    // Using substring here is generally problematic in cases where dir has one
+    // or more trailing slashes. If you do listDir("foo"), you'll get back
+    // paths like "foo/bar". If you do listDir("foo/"), you'll get "foo/bar"
+    // (note the trailing slash was dropped. If you do listDir("foo//"), you'll
+    // get "foo//bar".
+    //
+    // This means if you strip off the prefix, the resulting string may have a
+    // leading separator (if the prefix did not have a trailing one) or it may
+    // not. However, since we are only using the results of that to call
+    // contains() on, the leading separator is harmless.
     assert(entity.path.startsWith(dir));
     var pathInDir = entity.path.substring(dir.length);
 
@@ -476,8 +486,24 @@
   if (runningFromSdk) {
     throw new StateError("Can't get the repo root from the SDK.");
   }
-  return path.normalize(path.join(
-      path.dirname(libraryPath('pub.io')), '..', '..', '..', '..', '..', '..'));
+
+  // Get the path to the directory containing this very file.
+  var libDir = path.dirname(libraryPath('pub.io'));
+
+  // TODO(rnystrom): Remove this when #104 is fixed.
+  // If we are running from the async/await compiled build directory, walk out
+  // out of that. It will be something like:
+  //
+  //     <repo>/<build>/<config>/pub_async/lib/src
+  if (libDir.contains('pub_async')) {
+    return path.normalize(path.join(libDir, '..', '..', '..', '..', '..'));
+  }
+
+  // Otherwise, assume we're running directly from the source location in the
+  // repo:
+  //
+  //      <repo>/sdk/lib/_internal/pub/lib/src
+  return path.normalize(path.join(libDir, '..', '..', '..', '..', '..', '..'));
 }
 
 /// A line-by-line stream of standard input.
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart
index 4333648..211eb37 100644
--- a/sdk/lib/_internal/pub/lib/src/package.dart
+++ b/sdk/lib/_internal/pub/lib/src/package.dart
@@ -110,6 +110,9 @@
   Package.inMemory(this.pubspec)
     : dir = null;
 
+  /// Creates a package with [pubspec] located at [dir].
+  Package(this.pubspec, this.dir);
+
   /// The basenames of files that are included in [list] despite being hidden.
   static final _WHITELISTED_FILES = const ['.htaccess'];
 
@@ -124,8 +127,10 @@
   /// If this is a Git repository, this will respect .gitignore; otherwise, it
   /// will return all non-hidden, non-blacklisted files.
   ///
-  /// If [beneath] is passed, this will only return files beneath that path.
-  List<String> listFiles({String beneath}) {
+  /// If [beneath] is passed, this will only return files beneath that path. If
+  /// [recursive] is true, this will return all files beneath that path;
+  /// otherwise, it will only return files one level beneath it.
+  List<String> listFiles({String beneath, recursive: true}) {
     if (beneath == null) beneath = dir;
 
     // This is used in some performance-sensitive paths and can list many, many
@@ -145,6 +150,12 @@
           ["ls-files", "--cached", "--others", "--exclude-standard",
            relativeBeneath],
           workingDir: dir);
+
+      // If we're not listing recursively, strip out paths that contain
+      // separators. Since git always prints forward slashes, we always detect
+      // them.
+      if (!recursive) files = files.where((file) => !file.contains('/'));
+
       // Git always prints files relative to the repository root, but we want
       // them relative to the working directory. It also prints forward slashes
       // on Windows which we normalize away for easier testing.
@@ -156,11 +167,22 @@
         return fileExists(file);
       });
     } else {
-      files = listDir(beneath, recursive: true, includeDirs: false,
+      files = listDir(beneath, recursive: recursive, includeDirs: false,
           whitelist: _WHITELISTED_FILES);
     }
 
     return files.where((file) {
+      // Using substring here is generally problematic in cases where dir has
+      // one or more trailing slashes. If you do listDir("foo"), you'll get back
+      // paths like "foo/bar". If you do listDir("foo/"), you'll get "foo/bar"
+      // (note the trailing slash was dropped. If you do listDir("foo//"),
+      // you'll get "foo//bar".
+      //
+      // This means if you strip off the prefix, the resulting string may have a
+      // leading separator (if the prefix did not have a trailing one) or it may
+      // not. However, since we are only using the results of that to call
+      // contains() on, the leading separator is harmless.
+      assert(file.startsWith(beneath));
       file = file.substring(beneath.length);
       return !_blacklistedFiles.any(file.endsWith) &&
           !_blacklistedDirs.any(file.contains);
diff --git a/sdk/lib/_internal/pub/lib/src/package_graph.dart b/sdk/lib/_internal/pub/lib/src/package_graph.dart
index 1491378..4470e51 100644
--- a/sdk/lib/_internal/pub/lib/src/package_graph.dart
+++ b/sdk/lib/_internal/pub/lib/src/package_graph.dart
@@ -7,6 +7,7 @@
 import 'entrypoint.dart';
 import 'lock_file.dart';
 import 'package.dart';
+import 'utils.dart';
 
 /// A holistic view of the entire transitive dependency graph for an entrypoint.
 ///
@@ -24,5 +25,26 @@
   /// All transitive dependencies of the entrypoint (including itself).
   final Map<String, Package> packages;
 
+  /// A map of transitive dependencies for each package.
+  Map<String, Set<Package>> _transitiveDependencies;
+
   PackageGraph(this.entrypoint, this.lockFile, this.packages);
+
+  /// Returns all transitive dependencies of [package].
+  ///
+  /// For the entrypoint this returns all packages in [packages], which includes
+  /// dev and override. For any other package, it ignores dev and override
+  /// dependencies.
+  Set<Package> transitiveDependencies(String package) {
+    if (package == entrypoint.root.name) return packages.values.toSet();
+
+    if (_transitiveDependencies == null) {
+      var closure = transitiveClosure(mapMap(packages,
+          value: (_, package) => package.dependencies.map((dep) => dep.name)));
+      _transitiveDependencies = mapMap(closure,
+          value: (_, names) => names.map((name) => packages[name]).toSet());
+    }
+
+    return _transitiveDependencies[package];
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index 2ab26b2..7aa5735 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -266,11 +266,23 @@
         expectedName: expectedName, location: pubspecUri);
   }
 
-  Pubspec(this._name, this._version, this._dependencies, this._devDependencies,
-          this._dependencyOverrides, this._environment, this._transformers,
-          [Map fields])
-    : this.fields = fields == null ? new YamlMap() : fields,
-      _sources = null;
+  Pubspec(this._name, {Version version, Iterable<PackageDep> dependencies,
+          Iterable<PackageDep> devDependencies,
+          Iterable<PackageDep> dependencyOverrides,
+          VersionConstraint sdkConstraint,
+          Iterable<Iterable<TransformerConfig>> transformers,
+           Map fields, SourceRegistry sources})
+      : _version = version,
+        _dependencies = dependencies == null ? null : dependencies.toList(),
+        _devDependencies = devDependencies == null ? null :
+            devDependencies.toList(),
+        _dependencyOverrides = dependencyOverrides == null ? null :
+            dependencyOverrides.toList(),
+        _environment = new PubspecEnvironment(sdkConstraint),
+        _transformers = transformers == null ? [] :
+            transformers.map((phase) => phase.toSet()).toList(),
+        fields = fields == null ? new YamlMap() : new YamlMap.wrap(fields),
+        _sources = sources;
 
   Pubspec.empty()
     : _sources = null,
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 d8b5761..cf12722 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -143,8 +143,13 @@
       _validateSdkConstraint(root.pubspec);
       return _traverseSolution();
     }).then((packages) {
+      var pubspecs = new Map.fromIterable(packages,
+          key: (id) => id.name,
+          value: (id) => cache.getCachedPubspec(id));
+
       return new SolveResult.success(sources, root, lockFile, packages,
-          overrides, _getAvailableVersions(packages), attemptedSolutions);
+          overrides, pubspecs, _getAvailableVersions(packages),
+          attemptedSolutions);
     }).catchError((error) {
       if (error is! SolveFailure) throw error;
 
@@ -695,7 +700,8 @@
       var pubDep = override == null ?
           new PackageDep(depName, "hosted", constraint, depName) :
           override.withConstraint(constraint);
-      return _registerDependency(new Dependency("pub itself", null, pubDep));
+      return _registerDependency(
+          new Dependency("pub itself", Version.none, pubDep));
     }));
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
index 7fed60a..76278a2 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
@@ -63,8 +63,7 @@
       if (newId == null) return true;
 
       // The dependency existed before, so see if it was modified.
-      return !_descriptionsEqual(oldId, newId) ||
-          oldId.version != newId.version;
+      return !_sources.idsEqual(oldId, newId);
     }).length;
 
     if (dryRun) {
@@ -169,7 +168,7 @@
     } else if (oldId == null) {
       icon = log.green("+ ");
       addedOrRemoved = true;
-    } else if (!_descriptionsEqual(oldId, newId)) {
+    } else if (!_sources.idDescriptionsEqual(oldId, newId)) {
       icon = log.cyan("* ");
       changed = true;
     } else if (oldId.version < newId.version) {
@@ -236,13 +235,6 @@
     _output.writeln();
   }
 
-  /// Returns `true` if [a] and [b] are from the same source and have the same
-  /// description.
-  bool _descriptionsEqual(PackageId a, PackageId b) {
-    if (a.source != b.source) return false;
-    return _sources[a.source].descriptionsEqual(a.description, b.description);
-  }
-
   /// Writes a terse description of [id] (not including its name) to the output.
   void _writeId(PackageId id) {
     _output.write(id.version);
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index ec276ea..5991c9b 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -53,6 +53,10 @@
   /// The dependency overrides that were used in the solution.
   final List<PackageDep> overrides;
 
+  /// A map from package names to the pubspecs for the versions of those
+  /// packages that were installed, or `null` if the solver failed.
+  final Map<String, Pubspec> pubspecs;
+
   /// The available versions of all selected packages from their source.
   ///
   /// Will be empty if the solve failed. An entry here may not include the full
@@ -75,14 +79,31 @@
   final Package _root;
   final LockFile _previousLockFile;
 
+  /// Returns the names of all packages that were changed.
+  ///
+  /// This includes packages that were added or removed.
+  Set<String> get changedPackages {
+    if (packages == null) return null;
+
+    var changed = packages
+        .where((id) =>
+            !_sources.idsEqual(_previousLockFile.packages[id.name], id))
+        .map((id) => id.name).toSet();
+
+    return changed.union(_previousLockFile.packages.keys
+        .where((package) => !availableVersions.containsKey(package))
+        .toSet());
+  }
+
   SolveResult.success(this._sources, this._root, this._previousLockFile,
-      this.packages, this.overrides, this.availableVersions,
+      this.packages, this.overrides, this.pubspecs, this.availableVersions,
       this.attemptedSolutions)
       : error = null;
 
   SolveResult.failure(this._sources, this._root, this._previousLockFile,
       this.overrides, this.error, this.attemptedSolutions)
       : this.packages = null,
+        this.pubspecs = null,
         this.availableVersions = {};
 
   /// Displays a report of what changes were made to the lockfile.
@@ -275,13 +296,16 @@
   final String depender;
 
   /// The version of the depender that has this dependency.
-  ///
-  /// This will be `null` when [depender] is the magic "pub itself" dependency.
   final Version dependerVersion;
 
   /// The package being depended on.
   final PackageDep dep;
 
+  /// Whether [depender] is a magic dependency (e.g. "pub itself" or "pub global
+  /// activate").
+  bool get isMagic => depender.contains(" ");
+
+
   Dependency(this.depender, this.dependerVersion, this.dep);
 
   String toString() => '$depender $dependerVersion -> $dep';
@@ -342,9 +366,7 @@
     for (var dep in sorted) {
       buffer.writeln();
       buffer.write("- ${log.bold(dep.depender)}");
-      if (dep.dependerVersion != null) {
-        buffer.write(" ${dep.dependerVersion}");
-      }
+      if (!dep.isMagic) buffer.write(" ${dep.dependerVersion}");
       buffer.write(" ${_describeDependency(dep.dep)}");
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index 9f4c38c..9696f45 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -18,12 +18,28 @@
 
 /// A package source that gets packages from Git repos.
 class GitSource extends CachedSource {
+  /// Given a valid git package description, returns the URL of the repository
+  /// it pulls from.
+  static String urlFromDescription(description) => description["url"];
+
   final name = "git";
 
   /// The paths to the canonical clones of repositories for which "git fetch"
   /// has already been run during this run of pub.
   final _updatedRepos = new Set<String>();
 
+  /// Given a Git repo that contains a pub package, gets the name of the pub
+  /// package.
+  Future<String> getPackageNameFromRepo(String repo) {
+    // Clone the repo to a temp directory.
+    return withTempDir((tempDir) {
+      return _clone(repo, tempDir, shallow: true).then((_) {
+        var pubspec = new Pubspec.load(tempDir, systemCache.sources);
+        return pubspec.name;
+      });
+    });
+  }
+
   /// Since we don't have an easy way to read from a remote Git repo, this
   /// just installs [id] into the system cache, then describes it from there.
   Future<Pubspec> describeUncached(PackageId id) {
@@ -134,10 +150,10 @@
     var failures = 0;
 
     var packages = listDir(systemCacheRoot)
-      .where((entry) => dirExists(path.join(entry, ".git")))
-      .map((packageDir) => new Package.load(null, packageDir,
-          systemCache.sources))
-      .toList();
+        .where((entry) => dirExists(path.join(entry, ".git")))
+        .map((packageDir) => new Package.load(null, packageDir,
+            systemCache.sources))
+        .toList();
 
     // Note that there may be multiple packages with the same name and version
     // (pinned to different commits). The sort order of those is unspecified.
@@ -219,16 +235,24 @@
   /// Clones the repo at the URI [from] to the path [to] on the local
   /// filesystem.
   ///
-  /// If [mirror] is true, create a bare, mirrored clone. This doesn't check out
-  /// the working tree, but instead makes the repository a local mirror of the
-  /// remote repository. See the manpage for `git clone` for more information.
-  Future _clone(String from, String to, {bool mirror: false}) {
+  /// If [mirror] is true, creates a bare, mirrored clone. This doesn't check
+  /// out the working tree, but instead makes the repository a local mirror of
+  /// the remote repository. See the manpage for `git clone` for more
+  /// information.
+  ///
+  /// If [shallow] is true, creates a shallow clone that contains no history
+  /// for the repository.
+  Future _clone(String from, String to, {bool mirror: false,
+      bool shallow: false}) {
     return syncFuture(() {
       // Git on Windows does not seem to automatically create the destination
       // directory.
       ensureDir(to);
       var args = ["clone", from, to];
+
       if (mirror) args.insert(1, "--mirror");
+      if (shallow) args.insertAll(1, ["--depth", "1"]);
+
       return git.run(args);
     }).then((result) => null);
   }
diff --git a/sdk/lib/_internal/pub/lib/src/source_registry.dart b/sdk/lib/_internal/pub/lib/src/source_registry.dart
index ffac4f8..d46ae93 100644
--- a/sdk/lib/_internal/pub/lib/src/source_registry.dart
+++ b/sdk/lib/_internal/pub/lib/src/source_registry.dart
@@ -6,6 +6,7 @@
 
 import 'dart:collection';
 
+import 'package.dart';
 import 'source.dart';
 import 'source/unknown.dart';
 
@@ -24,6 +25,22 @@
     return sources.iterator;
   }
 
+  /// Returns whether [id1] and [id2] refer to the same package, including
+  /// validating that their descriptions are equivalent.
+  bool idsEqual(PackageId id1, PackageId id2) {
+    if (id1 != id2) return false;
+    if (id1 == null && id2 == null) return true;
+    return idDescriptionsEqual(id1, id2);
+  }
+
+  /// Returns whether [id1] and [id2] have the same source and description.
+  ///
+  /// This doesn't check whether the name or versions are equal.
+  bool idDescriptionsEqual(PackageId id1, PackageId id2) {
+    if (id1.source != id2.source) return false;
+    return this[id1.source].descriptionsEqual(id1.description, id2.description);
+  }
+
   /// Sets the default source.
   ///
   /// This takes a string, which must be the name of a registered source.
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 4e1a369..3abeefd 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -331,6 +331,32 @@
   })).then((_) => map);
 }
 
+/// Returns the transitive closure of [graph].
+///
+/// This assumes [graph] represents a graph with a vertex for each key and an
+/// edge betweek each key and the values for that key.
+Map<dynamic, Set> transitiveClosure(Map<dynamic, Iterable> graph) {
+  // This uses the Floyd-Warshall algorithm
+  // (https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm).
+  var result = {};
+  graph.forEach((vertex, edges) {
+    result[vertex] = new Set.from(edges)..add(vertex);
+  });
+
+  for (var vertex1 in graph.keys) {
+    for (var vertex2 in graph.keys) {
+      for (var vertex3 in graph.keys) {
+        if (result[vertex2].contains(vertex1) &&
+            result[vertex1].contains(vertex3)) {
+          result[vertex2].add(vertex3);
+        }
+      }
+    }
+  }
+
+  return result;
+}
+
 /// Given a list of filenames, returns a set of patterns that can be used to
 /// filter for those filenames.
 ///
diff --git a/sdk/lib/_internal/pub/lib/src/validator/name.dart b/sdk/lib/_internal/pub/lib/src/validator/name.dart
index b939ac8..14da912 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/name.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/name.dart
@@ -70,8 +70,8 @@
       messages.add("$description may only contain letters, numbers, and "
           "underscores.\n"
           "Using a valid Dart identifier makes the name usable in Dart code.");
-    } else if (!new RegExp(r"^[a-zA-Z]").hasMatch(name)) {
-      messages.add("$description must begin with letter.\n"
+    } else if (!new RegExp(r"^[a-zA-Z_]").hasMatch(name)) {
+      messages.add("$description must begin with a letter or underscore.\n"
           "Using a valid Dart identifier makes the name usable in Dart code.");
     } else if (_RESERVED_WORDS.contains(name.toLowerCase())) {
       messages.add("$description may not be a reserved word in Dart.\n"
diff --git a/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart b/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
index fecee29..443143f 100644
--- a/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_non_dart_files_to_build_test.dart
@@ -9,7 +9,7 @@
   initConfig();
 
   integration("copies non-Dart files to build/", () {
-    servePackages([packageMap("browser", "1.0.0")]);
+    servePackages((builder) => builder.serve("browser", "1.0.0"));
 
     d.dir(appPath, [
       // A browser dependency with no entrypoints shouldn't cause dart.js to be
diff --git a/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart b/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart
deleted file mode 100644
index 56d544a..0000000
--- a/sdk/lib/_internal/pub/test/build/ignores_existing_compiled_js_files_test.dart
+++ /dev/null
@@ -1,54 +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.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("ignores existing JS files that were compiled to Dart", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('file.dart', 'void main() => print("hello");'),
-        d.file('file.dart.js', 'some js code'),
-        d.file('file.dart.js.map', 'source map'),
-        d.file('file.dart.precompiled.js', 'some js code'),
-        d.dir('subdir', [
-          d.file('subfile.dart', 'void main() => print("ping");'),
-          d.file('subfile.dart.js', 'some js code'),
-          d.file('subfile.dart.js.map', 'source map'),
-          d.file('subfile.dart.precompiled.js', 'some js code')
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--mode", "debug"],
-        output: new RegExp(r'Built \d+ files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.matcherFile('file.dart.js', isNot(equals('some js code'))),
-          d.matcherFile('file.dart.js.map', isNot(equals('source map'))),
-          d.matcherFile('file.dart.precompiled.js',
-                        isNot(equals('some js code'))),
-          d.dir('subdir', [
-            d.matcherFile('subfile.dart.js', isNot(equals('some js code'))),
-            d.matcherFile('subfile.dart.js.map', isNot(equals('source map'))),
-            d.matcherFile('subfile.dart.precompiled.js',
-                          isNot(equals('some js code')))
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/cache/add/adds_latest_matching_version_test.dart b/sdk/lib/_internal/pub/test/cache/add/adds_latest_matching_version_test.dart
index 5d6701b..f602a31 100644
--- a/sdk/lib/_internal/pub/test/cache/add/adds_latest_matching_version_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/adds_latest_matching_version_test.dart
@@ -11,12 +11,12 @@
   initConfig();
   integration('adds the latest version of the package matching the '
               'version constraint', () {
-    servePackages([
-      packageMap("foo", "1.2.2"),
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "2.0.0-dev"),
-      packageMap("foo", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.2");
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "2.0.0-dev");
+      builder.serve("foo", "2.0.0");
+    });
 
     schedulePub(args: ["cache", "add", "foo", "-v", ">=1.0.0 <2.0.0"],
         output: 'Downloading foo 1.2.3...');
diff --git a/sdk/lib/_internal/pub/test/cache/add/adds_latest_version_test.dart b/sdk/lib/_internal/pub/test/cache/add/adds_latest_version_test.dart
index 5aae1dd..a938576 100644
--- a/sdk/lib/_internal/pub/test/cache/add/adds_latest_version_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/adds_latest_version_test.dart
@@ -10,11 +10,11 @@
 main() {
   initConfig();
   integration('adds the latest stable version of the package', () {
-    servePackages([
-      packageMap("foo", "1.2.2"),
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "1.2.4-dev")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.2");
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "1.2.4-dev");
+    });
 
     schedulePub(args: ["cache", "add", "foo"],
         output: 'Downloading foo 1.2.3...');
diff --git a/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart b/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
index 3939f5b..79b8555 100644
--- a/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/all_adds_all_matching_versions_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration('"--all" adds all matching versions of the package', () {
-    servePackages([
-      packageMap("foo", "1.2.2"),
-      packageMap("foo", "1.2.3-dev"),
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.2");
+      builder.serve("foo", "1.2.3-dev");
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "2.0.0");
+    });
 
     schedulePub(args: ["cache", "add", "foo", "-v", ">=1.0.0 <2.0.0", "--all"],
         output: '''
diff --git a/sdk/lib/_internal/pub/test/cache/add/all_with_some_versions_present_test.dart b/sdk/lib/_internal/pub/test/cache/add/all_with_some_versions_present_test.dart
index 3a90077..3faa1c5 100644
--- a/sdk/lib/_internal/pub/test/cache/add/all_with_some_versions_present_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/all_with_some_versions_present_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration('"--all" adds all non-installed versions of the package', () {
-    servePackages([
-      packageMap("foo", "1.2.1"),
-      packageMap("foo", "1.2.2"),
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.1");
+      builder.serve("foo", "1.2.2");
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "2.0.0");
+    });
 
     // Install a couple of versions first.
     schedulePub(args: ["cache", "add", "foo", "-v", "1.2.1"],
diff --git a/sdk/lib/_internal/pub/test/cache/add/already_cached_test.dart b/sdk/lib/_internal/pub/test/cache/add/already_cached_test.dart
index ad68f6c..f6aaa92 100644
--- a/sdk/lib/_internal/pub/test/cache/add/already_cached_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/already_cached_test.dart
@@ -10,9 +10,9 @@
 main() {
   initConfig();
   integration('does nothing if the package is already cached', () {
-    servePackages([
-      packageMap("foo", "1.2.3")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3");
+    });
 
     // Run once to put it in the cache.
     schedulePub(args: ["cache", "add", "foo"],
diff --git a/sdk/lib/_internal/pub/test/cache/add/no_matching_version_test.dart b/sdk/lib/_internal/pub/test/cache/add/no_matching_version_test.dart
index 2f8cc35..53fd3c5 100644
--- a/sdk/lib/_internal/pub/test/cache/add/no_matching_version_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/no_matching_version_test.dart
@@ -9,10 +9,10 @@
 main() {
   initConfig();
   integration('fails if no version matches the version constraint', () {
-    servePackages([
-      packageMap("foo", "1.2.2"),
-      packageMap("foo", "1.2.3")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.2");
+      builder.serve("foo", "1.2.3");
+    });
 
     schedulePub(args: ["cache", "add", "foo", "-v", ">2.0.0"],
         error: 'Package foo has no versions that match >2.0.0.',
diff --git a/sdk/lib/_internal/pub/test/cache/add/package_not_found_test.dart b/sdk/lib/_internal/pub/test/cache/add/package_not_found_test.dart
index d1bacfc..1ee9daf 100644
--- a/sdk/lib/_internal/pub/test/cache/add/package_not_found_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/add/package_not_found_test.dart
@@ -10,7 +10,7 @@
 main() {
   initConfig();
   integration('fails if the package cound not be found on the source', () {
-    servePackages([]);
+    serveNoPackages();
 
     schedulePub(args: ["cache", "add", "foo"],
         error: new RegExp(r"Could not find package foo at http://.*"),
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
index 54d2e94..6f9e009 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
@@ -14,10 +14,10 @@
   initConfig();
   integration('handles failure to reinstall some packages', () {
     // Only serve two packages so repairing will have a failure.
-    servePackages([
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "1.2.5")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "1.2.5");
+    });
 
     // Set up a cache with some packages.
     d.dir(cachePath, [
diff --git a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
index eee64d5..cb81320 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
@@ -10,13 +10,13 @@
 main() {
   initConfig();
   integration('reinstalls previously cached hosted packages', () {
-    servePackages([
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "1.2.4"),
-      packageMap("foo", "1.2.5"),
-      packageMap("bar", "1.2.3"),
-      packageMap("bar", "1.2.4")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "1.2.4");
+      builder.serve("foo", "1.2.5");
+      builder.serve("bar", "1.2.3");
+      builder.serve("bar", "1.2.4");
+    });
 
     // Set up a cache with some broken packages.
     d.dir(cachePath, [
diff --git a/sdk/lib/_internal/pub/test/dependency_override_test.dart b/sdk/lib/_internal/pub/test/dependency_override_test.dart
index fcbb3bc..4e47e24 100644
--- a/sdk/lib/_internal/pub/test/dependency_override_test.dart
+++ b/sdk/lib/_internal/pub/test/dependency_override_test.dart
@@ -11,11 +11,11 @@
   initConfig();
   forBothPubGetAndUpgrade((command) {
     integration("chooses best version matching override constraint", () {
-      servePackages([
-        packageMap("foo", "1.0.0"),
-        packageMap("foo", "2.0.0"),
-        packageMap("foo", "3.0.0")
-      ]);
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0");
+        builder.serve("foo", "2.0.0");
+        builder.serve("foo", "3.0.0");
+      });
 
       d.dir(appPath, [
         d.pubspec({
@@ -37,9 +37,9 @@
     });
 
     integration("treats override as implicit dependency", () {
-      servePackages([
-        packageMap("foo", "1.0.0")
-      ]);
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0");
+      });
 
       d.dir(appPath, [
         d.pubspec({
@@ -58,12 +58,14 @@
     });
 
     integration("ignores other constraints on overridden package", () {
-      servePackages([
-        packageMap("foo", "1.0.0"),
-        packageMap("foo", "2.0.0"),
-        packageMap("foo", "3.0.0"),
-        packageMap("bar", "1.0.0", {"foo": "5.0.0-nonexistent"})
-      ]);
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0");
+        builder.serve("foo", "2.0.0");
+        builder.serve("foo", "3.0.0");
+        builder.serve("bar", "1.0.0", pubspec: {
+          "dependencies": {"foo": "5.0.0-nonexistent"}
+        });
+      });
 
       d.dir(appPath, [
         d.pubspec({
@@ -86,10 +88,10 @@
     });
 
     integration("warns about overridden dependencies", () {
-      servePackages([
-        packageMap("foo", "1.0.0"),
-        packageMap("bar", "1.0.0")
-      ]);
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0");
+        builder.serve("bar", "1.0.0");
+      });
 
       d.dir("baz", [
         d.libDir("baz"),
diff --git a/sdk/lib/_internal/pub/test/deps_test.dart b/sdk/lib/_internal/pub/test/deps_test.dart
index 0241d66..7c52006 100644
--- a/sdk/lib/_internal/pub/test/deps_test.dart
+++ b/sdk/lib/_internal/pub/test/deps_test.dart
@@ -11,31 +11,21 @@
   initConfig();
 
   setUp(() {
-    servePackages([
-      packageMap("normal", "1.2.3", {
+    servePackages((builder) {
+      builder.serve("normal", "1.2.3", deps: {
         "transitive": "any",
         "circular_a": "any"
-      }),
-      packageMap("transitive", "1.2.3", {
-        "shared": "any"
-      }),
-      packageMap("shared", "1.2.3", {
-        "other": "any"
-      }),
-      packageMap("unittest", "1.2.3", {
-        "shared": "any"
-      }),
-      packageMap("other", "1.0.0"),
-      packageMap("overridden", "1.0.0"),
-      packageMap("overridden", "2.0.0"),
-      packageMap("override_only", "1.2.3"),
-      packageMap("circular_a", "1.2.3", {
-        "circular_b": "any"
-      }),
-      packageMap("circular_b", "1.2.3", {
-        "circular_a": "any"
-      })
-    ]);
+      });
+      builder.serve("transitive", "1.2.3", deps: {"shared": "any"});
+      builder.serve("shared", "1.2.3", deps: {"other": "any"});
+      builder.serve("unittest", "1.2.3", deps: {"shared": "any"});
+      builder.serve("other", "1.0.0");
+      builder.serve("overridden", "1.0.0");
+      builder.serve("overridden", "2.0.0");
+      builder.serve("override_only", "1.2.3");
+      builder.serve("circular_a", "1.2.3", deps: {"circular_b": "any"});
+      builder.serve("circular_b", "1.2.3", deps: {"circular_a": "any"});
+    });
 
     d.dir("from_path", [
       d.libDir("from_path"),
diff --git a/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart b/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart
index e62bff0..2c49d31 100644
--- a/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart
@@ -12,11 +12,11 @@
 main() {
   initConfig();
   integration("does not show how many other versions are available", () {
-    servePackages([
-      packageMap("downgraded", "1.0.0"),
-      packageMap("downgraded", "2.0.0"),
-      packageMap("downgraded", "3.0.0-dev")
-    ]);
+    servePackages((builder) {
+      builder.serve("downgraded", "1.0.0");
+      builder.serve("downgraded", "2.0.0");
+      builder.serve("downgraded", "3.0.0-dev");
+    });
 
     d.appDir({
       "downgraded": "3.0.0-dev"
diff --git a/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart
index 4bae763..c1f8335 100644
--- a/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart
+++ b/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart
@@ -12,10 +12,10 @@
 main() {
   initConfig();
   integration("--dry-run shows report but does not apply changes", () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "2.0.0"),
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "2.0.0");
+    });
 
     // Create the first lockfile.
     d.appDir({
diff --git a/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart b/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart
index 93a376c..c329bdb 100644
--- a/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart
+++ b/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart
@@ -11,10 +11,10 @@
   initConfig();
   integration("downgrades a locked package's dependers in order to get it to "
       "min version", () {
-    servePackages([
-      packageMap("foo", "2.0.0", {"bar": ">1.0.0"}),
-      packageMap("bar", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"bar": ">1.0.0"});
+      builder.serve("bar", "2.0.0");
+    });
 
     d.appDir({"foo": "any", "bar": "any"}).create();
 
@@ -25,10 +25,10 @@
       "bar": "2.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "1.0.0", {"bar": "any"}),
-      packageMap("bar", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"bar": "any"});
+      builder.serve("bar", "1.0.0");
+    });
 
     pubDowngrade(args: ['bar']);
 
diff --git a/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart b/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart
index 48c7bd8..8561bb4 100644
--- a/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart
+++ b/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart
@@ -11,10 +11,10 @@
   initConfig();
   integration("downgrades one locked hosted package's dependencies if it's "
       "necessary", () {
-    servePackages([
-      packageMap("foo", "2.0.0", {"foo_dep": "any"}),
-      packageMap("foo_dep", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"foo_dep": "any"});
+      builder.serve("foo_dep", "2.0.0");
+    });
 
     d.appDir({"foo": "any"}).create();
 
@@ -25,10 +25,10 @@
       "foo_dep": "2.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "1.0.0", {"foo_dep": "<2.0.0"}),
-      packageMap("foo_dep", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"foo_dep": "<2.0.0"});
+      builder.serve("foo_dep", "1.0.0");
+    });
 
     pubDowngrade(args: ['foo']);
 
diff --git a/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
index add71d2..7a07d25 100644
--- a/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
+++ b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
@@ -10,9 +10,9 @@
 main() {
   initConfig();
   integration("--dry-run shows but does not apply changes", () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+    });
 
     d.appDir({
       "foo": "1.0.0"
diff --git a/sdk/lib/_internal/pub/test/get/hosted/avoid_network_requests_test.dart b/sdk/lib/_internal/pub/test/get/hosted/avoid_network_requests_test.dart
index cd66d84..27ccca3 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/avoid_network_requests_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/avoid_network_requests_test.dart
@@ -13,14 +13,14 @@
   initConfig();
 
   integration('only requests versions that are needed during solving', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "1.1.0"),
-      packageMap("foo", "1.2.0"),
-      packageMap("bar", "1.0.0"),
-      packageMap("bar", "1.1.0"),
-      packageMap("bar", "1.2.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "1.1.0");
+      builder.serve("foo", "1.2.0");
+      builder.serve("bar", "1.0.0");
+      builder.serve("bar", "1.1.0");
+      builder.serve("bar", "1.2.0");
+    });
 
     d.appDir({
       "foo": "any"
diff --git a/sdk/lib/_internal/pub/test/get/hosted/cached_pubspec_test.dart b/sdk/lib/_internal/pub/test/get/hosted/cached_pubspec_test.dart
index 3024336..77a3a3f 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/cached_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/cached_pubspec_test.dart
@@ -13,7 +13,7 @@
   initConfig();
 
   integration('does not request a pubspec for a cached package', () {
-    servePackages([packageMap("foo", "1.2.3")]);
+    servePackages((builder) => builder.serve("foo", "1.2.3"));
 
     d.appDir({"foo": "1.2.3"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart b/sdk/lib/_internal/pub/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
index 45808d5..9c65587 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/do_not_upgrade_on_removed_constraints_test.dart
@@ -11,12 +11,12 @@
   initConfig();
   integration("doesn't upgrade dependencies whose constraints have been "
       "removed", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"shared-dep": "any"}),
-      packageMap("bar", "1.0.0", {"shared-dep": "<2.0.0"}),
-      packageMap("shared-dep", "1.0.0"),
-      packageMap("shared-dep", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"shared-dep": "any"});
+      builder.serve("bar", "1.0.0", deps: {"shared-dep": "<2.0.0"});
+      builder.serve("shared-dep", "1.0.0");
+      builder.serve("shared-dep", "2.0.0");
+    });
 
     d.appDir({"foo": "any", "bar": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/does_no_network_requests_when_possible_test.dart b/sdk/lib/_internal/pub/test/get/hosted/does_no_network_requests_when_possible_test.dart
index 44532fd..bb7f1be 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/does_no_network_requests_when_possible_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/does_no_network_requests_when_possible_test.dart
@@ -13,11 +13,11 @@
   initConfig();
 
   integration('does not request versions if the lockfile is up to date', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "1.1.0"),
-      packageMap("foo", "1.2.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "1.1.0");
+      builder.serve("foo", "1.2.0");
+    });
 
     d.appDir({
       "foo": "any"
diff --git a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
index 2779da1..58890c8 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
@@ -4,13 +4,14 @@
 
 library pub_tests;
 
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
   initConfig();
   integration('gets a package from a pub server', () {
-    servePackages([packageMap("foo", "1.2.3")]);
+    servePackages((builder) => builder.serve("foo", "1.2.3"));
 
     d.appDir({"foo": "1.2.3"}).create();
 
@@ -21,11 +22,13 @@
   });
 
   integration('URL encodes the package name', () {
-    servePackages([]);
+    serveNoPackages();
 
     d.appDir({"bad name!": "1.2.3"}).create();
 
-    pubGet(error: new RegExp(
-        r"Could not find package bad name! at http://localhost:\d+\."));
+    pubGet(
+        error: new RegExp(
+          r"Could not find package bad name! at http://localhost:\d+\."),
+        exitCode: exit_codes.UNAVAILABLE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/hosted/get_transitive_test.dart b/sdk/lib/_internal/pub/test/get/hosted/get_transitive_test.dart
index 60a9b1e..7dedb6d 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/get_transitive_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/get_transitive_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration('gets packages transitively from a pub server', () {
-    servePackages([
-      packageMap("foo", "1.2.3", {"bar": "2.0.4"}),
-      packageMap("bar", "2.0.3"),
-      packageMap("bar", "2.0.4"),
-      packageMap("bar", "2.0.5")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", deps: {"bar": "2.0.4"});
+      builder.serve("bar", "2.0.3");
+      builder.serve("bar", "2.0.4");
+      builder.serve("bar", "2.0.5");
+    });
 
     d.appDir({"foo": "1.2.3"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/resolve_constraints_test.dart b/sdk/lib/_internal/pub/test/get/hosted/resolve_constraints_test.dart
index 47cdba6..ca7c741 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/resolve_constraints_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/resolve_constraints_test.dart
@@ -10,13 +10,13 @@
 main() {
   initConfig();
   integration('resolves version constraints from a pub server', () {
-    servePackages([
-      packageMap("foo", "1.2.3", {"baz": ">=2.0.0"}),
-      packageMap("bar", "2.3.4", {"baz": "<3.0.0"}),
-      packageMap("baz", "2.0.3"),
-      packageMap("baz", "2.0.4"),
-      packageMap("baz", "3.0.1")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", deps: {"baz": ">=2.0.0"});
+      builder.serve("bar", "2.3.4", deps: {"baz": "<3.0.0"});
+      builder.serve("baz", "2.0.3");
+      builder.serve("baz", "2.0.4");
+      builder.serve("baz", "3.0.1");
+    });
 
     d.appDir({"foo": "any", "bar": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_compatible_test.dart b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_compatible_test.dart
index 23660e0..d8c29a4 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_compatible_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_compatible_test.dart
@@ -11,7 +11,7 @@
   initConfig();
   integration("doesn't upgrade a locked pub server package with a new "
       "compatible constraint", () {
-    servePackages([packageMap("foo", "1.0.0")]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     d.appDir({"foo": "any"}).create();
 
@@ -19,7 +19,7 @@
 
     d.packagesDir({"foo": "1.0.0"}).validate();
 
-    servePackages([packageMap("foo", "1.0.1")]);
+    servePackages((builder) => builder.serve("foo", "1.0.1"));
 
     d.appDir({"foo": ">=1.0.0"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
index c3aa7f4..868f858 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_if_new_is_satisfied_test.dart
@@ -11,11 +11,11 @@
   initConfig();
   integration("doesn't unlock dependencies if a new dependency is already "
       "satisfied", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"bar": "<2.0.0"}),
-      packageMap("bar", "1.0.0", {"baz": "<2.0.0"}),
-      packageMap("baz", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"bar": "<2.0.0"});
+      builder.serve("bar", "1.0.0", deps: {"baz": "<2.0.0"});
+      builder.serve("baz", "1.0.0");
+    });
 
     d.appDir({"foo": "any"}).create();
 
@@ -27,12 +27,12 @@
       "baz": "1.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "2.0.0", {"bar": "<3.0.0"}),
-      packageMap("bar", "2.0.0", {"baz": "<3.0.0"}),
-      packageMap("baz", "2.0.0"),
-      packageMap("newdep", "2.0.0", {"baz": ">=1.0.0"})
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"});
+      builder.serve("bar", "2.0.0", deps: {"baz": "<3.0.0"});
+      builder.serve("baz", "2.0.0");
+      builder.serve("newdep", "2.0.0", deps: {"baz": ">=1.0.0"});
+    });
 
     d.appDir({"foo": "any", "newdep": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_test.dart b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_test.dart
index 66a2a6b..a43ad2e 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/stay_locked_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/stay_locked_test.dart
@@ -15,7 +15,7 @@
   initConfig();
   integration('keeps a pub server package locked to the version in the '
       'lockfile', () {
-    servePackages([packageMap("foo", "1.0.0")]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     d.appDir({"foo": "any"}).create();
 
@@ -28,7 +28,7 @@
     schedule(() => deleteEntry(path.join(sandboxDir, packagesPath)));
 
     // Start serving a newer package as well.
-    servePackages([packageMap("foo", "1.0.1")]);
+    servePackages((builder) => builder.serve("foo", "1.0.1"));
 
     // This shouldn't upgrade the foo dependency due to the lockfile.
     pubGet();
diff --git a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_incompatible_test.dart b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_incompatible_test.dart
index 4621703..77eeca6 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_incompatible_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_incompatible_test.dart
@@ -11,14 +11,14 @@
   initConfig();
   integration('upgrades a locked pub server package with a new incompatible '
       'constraint', () {
-    servePackages([packageMap("foo", "1.0.0")]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     d.appDir({"foo": "any"}).create();
 
     pubGet();
 
     d.packagesDir({"foo": "1.0.0"}).validate();
-    servePackages([packageMap("foo", "1.0.1")]);
+    servePackages((builder) => builder.serve("foo", "1.0.1"));
     d.appDir({"foo": ">1.0.0"}).create();
 
     pubGet();
diff --git a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
index d8ceb42..c3f1793 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_new_is_unsatisfied_test.dart
@@ -11,12 +11,12 @@
   initConfig();
   integration("unlocks dependencies if necessary to ensure that a new "
       "dependency is satisfied", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"bar": "<2.0.0"}),
-      packageMap("bar", "1.0.0", {"baz": "<2.0.0"}),
-      packageMap("baz", "1.0.0", {"qux": "<2.0.0"}),
-      packageMap("qux", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"bar": "<2.0.0"});
+      builder.serve("bar", "1.0.0", deps: {"baz": "<2.0.0"});
+      builder.serve("baz", "1.0.0", deps: {"qux": "<2.0.0"});
+      builder.serve("qux", "1.0.0");
+    });
 
     d.appDir({"foo": "any"}).create();
 
@@ -29,13 +29,13 @@
       "qux": "1.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "2.0.0", {"bar": "<3.0.0"}),
-      packageMap("bar", "2.0.0", {"baz": "<3.0.0"}),
-      packageMap("baz", "2.0.0", {"qux": "<3.0.0"}),
-      packageMap("qux", "2.0.0"),
-      packageMap("newdep", "2.0.0", {"baz": ">=1.5.0"})
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"});
+      builder.serve("bar", "2.0.0", deps: {"baz": "<3.0.0"});
+      builder.serve("baz", "2.0.0", deps: {"qux": "<3.0.0"});
+      builder.serve("qux", "2.0.0");
+      builder.serve("newdep", "2.0.0", deps: {"baz": ">=1.5.0"});
+    });
 
     d.appDir({"foo": "any", "newdep": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
index 2b662e6..a3f57ff 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
@@ -15,7 +15,7 @@
   initConfig();
   integration('upgrades a locked pub server package with a nonexistent version',
       () {
-    servePackages([packageMap("foo", "1.0.0")]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     d.appDir({"foo": "any"}).create();
     pubGet();
@@ -23,7 +23,7 @@
 
     schedule(() => deleteEntry(p.join(sandboxDir, cachePath)));
 
-    servePackages([packageMap("foo", "1.0.1")], replace: true);
+    servePackages((builder) => builder.serve("foo", "1.0.1"), replace: true);
     pubGet();
     d.packagesDir({"foo": "1.0.1"}).validate();
   });
diff --git a/sdk/lib/_internal/pub/test/get/path/nonexistent_dir_test.dart b/sdk/lib/_internal/pub/test/get/path/nonexistent_dir_test.dart
index 95698fc..6a983c4 100644
--- a/sdk/lib/_internal/pub/test/get/path/nonexistent_dir_test.dart
+++ b/sdk/lib/_internal/pub/test/get/path/nonexistent_dir_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:path/path.dart' as path;
 
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -18,8 +19,10 @@
       })
     ]).create();
 
-    pubGet(error: """Could not find package foo at "$badPath".
-Depended on by:
-- myapp 0.0.0""");
+    pubGet(error: """
+        Could not find package foo at "$badPath".
+        Depended on by:
+        - myapp 0.0.0""",
+        exitCode: exit_codes.UNAVAILABLE);
   });
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/get/switch_source_test.dart b/sdk/lib/_internal/pub/test/get/switch_source_test.dart
index 978dee8..4b8ad77 100644
--- a/sdk/lib/_internal/pub/test/get/switch_source_test.dart
+++ b/sdk/lib/_internal/pub/test/get/switch_source_test.dart
@@ -10,7 +10,7 @@
 main() {
   initConfig();
   integration('re-gets a package if its source has changed', () {
-    servePackages([packageMap("foo", "1.2.3")]);
+    servePackages((builder) => builder.serve("foo", "1.2.3"));
 
     d.dir('foo', [
       d.libDir('foo', 'foo 0.0.1'),
diff --git a/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart b/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart
new file mode 100644
index 0000000..3008292
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/activate_git_after_hosted_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('activating a Git package deactivates the hosted one', () {
+    ensureGit();
+
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("foo.dart", "main(args) => print('hosted');")
+        ])
+      ]);
+    });
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('git');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
+        output: """
+            Package foo is currently active at version 1.0.0.
+            Resolving dependencies...
+            + foo 1.0.0 from git ../foo.git
+            Activated foo 1.0.0 from Git repository "../foo.git".""");
+
+    // Should now run the git one.
+    var pub = pubRun(global: true, args: ["foo"]);
+    pub.stdout.expect("git");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_git_test.dart b/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_git_test.dart
new file mode 100644
index 0000000..09ac415
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_git_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('activating a hosted package deactivates the Git one', () {
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", contents: [
+        d.dir("bin", [
+          d.file("foo.dart", "main(args) => print('hosted');")
+        ])
+      ]);
+    });
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('git');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"]);
+
+    var path = canonicalize(p.join(sandboxDir, "foo"));
+    schedulePub(args: ["global", "activate", "foo"], output: """
+        Package foo is currently active from Git repository "../foo.git".
+        Resolving dependencies...
+        + foo 2.0.0
+        Downloading foo 2.0.0...
+        Activated foo 2.0.0.""");
+
+    // Should now run the hosted one.
+    var pub = pubRun(global: true, args: ["foo"]);
+    pub.stdout.expect("hosted");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_path_test.dart b/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_path_test.dart
index 6dec06b..3115695 100644
--- a/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_path_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/activate_hosted_after_path_test.dart
@@ -11,13 +11,13 @@
 main() {
   initConfig();
   integration('activating a hosted package deactivates the path one', () {
-    servePackages([
-      packageMap("foo", "2.0.0")
-    ], contents: [
-      d.dir("bin", [
-        d.file("foo.dart", "main(args) => print('hosted');")
-      ])
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", contents: [
+        d.dir("bin", [
+          d.file("foo.dart", "main(args) => print('hosted');")
+        ])
+      ]);
+    });
 
     d.dir("foo", [
       d.libPubspec("foo", "1.0.0"),
@@ -31,8 +31,9 @@
     var path = canonicalize(p.join(sandboxDir, "foo"));
     schedulePub(args: ["global", "activate", "foo"], output: """
         Package foo is currently active at path "$path".
-        Downloading foo 2.0.0...
         Resolving dependencies...
+        + foo 2.0.0
+        Downloading foo 2.0.0...
         Activated foo 2.0.0.""");
 
     // Should now run the hosted one.
diff --git a/sdk/lib/_internal/pub/test/global/activate/activate_path_after_hosted_test.dart b/sdk/lib/_internal/pub/test/global/activate/activate_path_after_hosted_test.dart
index fa74487..30bfbd7 100644
--- a/sdk/lib/_internal/pub/test/global/activate/activate_path_after_hosted_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/activate_path_after_hosted_test.dart
@@ -11,13 +11,13 @@
 main() {
   initConfig();
   integration('activating a hosted package deactivates the path one', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ], contents: [
-      d.dir("bin", [
-        d.file("foo.dart", "main(args) => print('hosted');")
-      ])
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("foo.dart", "main(args) => print('hosted');")
+        ])
+      ]);
+    });
 
     d.dir("foo", [
       d.libPubspec("foo", "2.0.0"),
diff --git a/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart
index 245fe8b..73cb2ae 100644
--- a/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart
@@ -15,7 +15,7 @@
             Usage: pub global activate <package...>
             -h, --help      Print usage information for this command.
             -s, --source    The source used to find the package.
-                            [hosted (default), path]
+                            [git, hosted (default), path]
 
             Run "pub help" to see global options.
             """,
diff --git a/sdk/lib/_internal/pub/test/global/activate/cached_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/cached_package_test.dart
index 8865883..348e767 100644
--- a/sdk/lib/_internal/pub/test/global/activate/cached_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/cached_package_test.dart
@@ -10,15 +10,16 @@
 main() {
   initConfig();
   integration('can activate an already cached package', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+    });
 
     schedulePub(args: ["cache", "add", "foo"]);
 
     schedulePub(args: ["global", "activate", "foo"], output: """
-Resolving dependencies...
-Activated foo 1.0.0.""");
+        Resolving dependencies...
+        + foo 1.0.0
+        Activated foo 1.0.0.""");
 
     // Should be in global package cache.
     d.dir(cachePath, [
diff --git a/sdk/lib/_internal/pub/test/global/activate/constraint_test.dart b/sdk/lib/_internal/pub/test/global/activate/constraint_test.dart
index b5073b1..714e06c 100644
--- a/sdk/lib/_internal/pub/test/global/activate/constraint_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/constraint_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration('chooses the highest version that matches the constraint', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "1.0.1"),
-      packageMap("foo", "1.1.0"),
-      packageMap("foo", "1.2.3")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "1.0.1");
+      builder.serve("foo", "1.1.0");
+      builder.serve("foo", "1.2.3");
+    });
 
     schedulePub(args: ["global", "activate", "foo", "<1.1.0"]);
 
diff --git a/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart b/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart
index 68f2ac3..2795ca4 100644
--- a/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart
@@ -15,7 +15,7 @@
             Usage: pub global activate <package...>
             -h, --help      Print usage information for this command.
             -s, --source    The source used to find the package.
-                            [hosted (default), path]
+                            [git, hosted (default), path]
 
             Run "pub help" to see global options.
             """,
diff --git a/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
index 57fa511..a21387cb 100644
--- a/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
@@ -8,19 +8,20 @@
   initConfig();
   integration("discards the previous active version if it doesn't match the "
       "constraint", () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "2.0.0");
+    });
 
     // Activate 1.0.0.
     schedulePub(args: ["global", "activate", "foo", "1.0.0"]);
 
     // Activating it again with a different constraint changes the version.
     schedulePub(args: ["global", "activate", "foo", ">1.0.0"], output: """
-Package foo is currently active at version 1.0.0.
-Downloading foo 2.0.0...
-Resolving dependencies...
-Activated foo 2.0.0.""");
+        Package foo is currently active at version 1.0.0.
+        Resolving dependencies...
+        + foo 2.0.0
+        Downloading foo 2.0.0...
+        Activated foo 2.0.0.""");
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart b/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
index 6b8b7fb..c1f6f02 100644
--- a/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
@@ -8,13 +8,15 @@
 main() {
   initConfig();
   integration('errors if the constraint matches no versions', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "1.0.1")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "1.0.1");
+    });
 
     schedulePub(args: ["global", "activate", "foo", ">1.1.0"],
-        error: "Package foo has no versions that match >1.1.0.",
+        error: """
+            Package foo has no versions that match >1.1.0 derived from:
+            - pub global activate depends on version >1.1.0""",
         exitCode: exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart
new file mode 100644
index 0000000..eea65e8
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/git_package_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('activates a package from a Git repo', () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
+        output: '''
+            Resolving dependencies...
+            + foo 1.0.0 from git ../foo.git
+            Activated foo 1.0.0 from Git repository "../foo.git".''');
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/ignores_active_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/ignores_active_version_test.dart
index 3650855..a34e0c6 100644
--- a/sdk/lib/_internal/pub/test/global/activate/ignores_active_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/ignores_active_version_test.dart
@@ -8,19 +8,20 @@
   initConfig();
   integration('ignores previously activated version',
         () {
-    servePackages([
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "1.3.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "1.3.0");
+    });
 
     // Activate 1.2.3.
     schedulePub(args: ["global", "activate", "foo", "1.2.3"]);
 
     // Activating it again resolves to the new best version.
     schedulePub(args: ["global", "activate", "foo", ">1.0.0"], output: """
-Package foo is currently active at version 1.2.3.
-Downloading foo 1.3.0...
-Resolving dependencies...
-Activated foo 1.3.0.""");
+        Package foo is currently active at version 1.2.3.
+        Resolving dependencies...
+        + foo 1.3.0
+        Downloading foo 1.3.0...
+        Activated foo 1.3.0.""");
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_git_test.dart b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_git_test.dart
new file mode 100644
index 0000000..f716c91
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_git_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('activating a Git package installs its dependencies', () {
+    servePackages((builder) {
+      builder.serve("bar", "1.0.0", deps: {"baz": "any"});
+      builder.serve("baz", "1.0.0");
+    });
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0", deps: {
+        "bar": "any"
+      }),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
+        output: allOf([
+      contains("Downloading bar 1.0.0..."),
+      contains("Downloading baz 1.0.0...")
+    ]));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_path_test.dart b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_path_test.dart
index 3480de1..ad98735 100644
--- a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_path_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_for_path_test.dart
@@ -11,10 +11,10 @@
 main() {
   initConfig();
   integration('activating a path package installs dependencies', () {
-    servePackages([
-      packageMap("bar", "1.0.0", {"baz": "any"}),
-      packageMap("baz", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("bar", "1.0.0", deps: {"baz": "any"});
+      builder.serve("baz", "2.0.0");
+    });
 
     d.dir("foo", [
       d.libPubspec("foo", "0.0.0", deps: {
diff --git a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
index d7726f6..add1b82 100644
--- a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
@@ -8,12 +8,12 @@
 
 main() {
   initConfig();
-  integration('activating a package installs its dependencies too', () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"bar": "any"}),
-      packageMap("bar", "1.0.0", {"baz": "any"}),
-      packageMap("baz", "1.0.0")
-    ]);
+  integration('activating a package installs its dependencies', () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"bar": "any"});
+      builder.serve("bar", "1.0.0", deps: {"baz": "any"});
+      builder.serve("baz", "1.0.0");
+    });
 
     schedulePub(args: ["global", "activate", "foo"], output: allOf([
       contains("Downloading bar 1.0.0..."),
diff --git a/sdk/lib/_internal/pub/test/global/activate/missing_git_repo_test.dart b/sdk/lib/_internal/pub/test/global/activate/missing_git_repo_test.dart
new file mode 100644
index 0000000..6b840b8
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/missing_git_repo_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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('fails if the Git repo does not exist', () {
+    ensureGit();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../nope.git"],
+        error: contains("repository '../nope.git' does not exist"),
+        exitCode: 1);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart
index 54384b4..9469de2 100644
--- a/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart
@@ -15,7 +15,7 @@
             Usage: pub global activate <package...>
             -h, --help      Print usage information for this command.
             -s, --source    The source used to find the package.
-                            [hosted (default), path]
+                            [git, hosted (default), path]
 
             Run "pub help" to see global options.""",
         exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart b/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_test.dart
new file mode 100644
index 0000000..a07d667
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/reactivating_git_upgrades_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.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('ignores previously activated git commit',
+        () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
+        output: '''
+            Resolving dependencies...
+            + foo 1.0.0 from git ../foo.git
+            Activated foo 1.0.0 from Git repository "../foo.git".''');
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.1")
+    ]).commit();
+
+    // Activating it again pulls down the latest commit.
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"],
+        output: '''
+            Package foo is currently active from Git repository "../foo.git".
+            Resolving dependencies...
+            + foo 1.0.1 from git ../foo.git
+            Activated foo 1.0.1 from Git repository "../foo.git".''');
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/supports_version_solver_backtracking_test.dart b/sdk/lib/_internal/pub/test/global/activate/supports_version_solver_backtracking_test.dart
new file mode 100644
index 0000000..c4647c2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/supports_version_solver_backtracking_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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('performs verison solver backtracking if necessary', () {
+    servePackages((builder) {
+      builder.serve("foo", "1.1.0", pubspec: {
+        "environment": {"sdk": ">=0.1.2 <0.2.0"}
+      });
+      builder.serve("foo", "1.2.0", pubspec: {
+        "environment": {"sdk": ">=0.1.3 <0.2.0"}
+      });
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    // foo 1.2.0 won't be picked because its SDK constraint conflicts with the
+    // dummy SDK version 0.1.2+3.
+    d.dir(cachePath, [
+      d.dir('global_packages', [
+        d.matcherFile('foo.lock', contains('1.1.0'))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/uncached_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/uncached_package_test.dart
index a134ab6..7194b99 100644
--- a/sdk/lib/_internal/pub/test/global/activate/uncached_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/uncached_package_test.dart
@@ -10,17 +10,17 @@
 main() {
   initConfig();
   integration('installs and activates the best version of a package', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "1.2.3"),
-      packageMap("foo", "2.0.0-wildly.unstable")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "1.2.3");
+      builder.serve("foo", "2.0.0-wildly.unstable");
+    });
 
     schedulePub(args: ["global", "activate", "foo"], output: """
-Downloading foo 1.2.3...
-Resolving dependencies...
-Activated foo 1.2.3.
-    """);
+        Resolving dependencies...
+        + foo 1.2.3 (2.0.0-wildly.unstable available)
+        Downloading foo 1.2.3...
+        Activated foo 1.2.3.""");
 
     // Should be in global package cache.
     d.dir(cachePath, [
diff --git a/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart
index 82a94de..5d51917 100644
--- a/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart
@@ -15,7 +15,7 @@
             Usage: pub global activate <package...>
             -h, --help      Print usage information for this command.
             -s, --source    The source used to find the package.
-                            [hosted (default), path]
+                            [git, hosted (default), path]
 
             Run "pub help" to see global options.""",
         exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
index 9bf1066..70e0b97 100644
--- a/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
@@ -10,7 +10,7 @@
 main() {
   initConfig();
   integration('errors if the package could not be found', () {
-    servePackages([]);
+    serveNoPackages();
 
     schedulePub(args: ["global", "activate", "foo"],
         error: startsWith("Could not find package foo at"),
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
index b1c6005..20b1b7e 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
@@ -7,10 +7,10 @@
 main() {
   initConfig();
   integration('activates a different version after deactivating', () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "2.0.0");
+    });
 
     // Activate an old version.
     schedulePub(args: ["global", "activate", "foo", "1.0.0"]);
@@ -20,9 +20,9 @@
 
     // Activating again should forget the old version.
     schedulePub(args: ["global", "activate", "foo"], output: """
-Downloading foo 2.0.0...
-Resolving dependencies...
-Activated foo 2.0.0.
-    """);
+        Resolving dependencies...
+        + foo 2.0.0
+        Downloading foo 2.0.0...
+        Activated foo 2.0.0.""");
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/git_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/git_package_test.dart
new file mode 100644
index 0000000..3d14d91
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/deactivate/git_package_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('deactivates an active Git package', () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"]);
+
+    schedulePub(args: ["global", "deactivate", "foo"],
+        output: 'Deactivated package foo 1.0.0 from Git repository "../foo.git".');
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/hosted_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/hosted_package_test.dart
index 5625ab8..240a11b 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/hosted_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/hosted_package_test.dart
@@ -7,9 +7,7 @@
 main() {
   initConfig();
   integration('deactivates an active hosted package', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     schedulePub(args: ["global", "activate", "foo"]);
 
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/path_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/path_package_test.dart
index 90047f6..3241efc 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/path_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/path_package_test.dart
@@ -22,6 +22,6 @@
 
     var path = canonicalize(p.join(sandboxDir, "foo"));
     schedulePub(args: ["global", "deactivate", "foo"],
-        output: 'Deactivated package foo at path "$path".');
+        output: 'Deactivated package foo 1.0.0 at path "$path".');
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
index 014cecf..2886430 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
@@ -8,7 +8,7 @@
 main() {
   initConfig();
   integration('errors if the package is not activated', () {
-    servePackages([]);
+    serveNoPackages();
 
     schedulePub(args: ["global", "deactivate", "foo"],
         error: "No active package foo.",
diff --git a/sdk/lib/_internal/pub/test/global/list_test.dart b/sdk/lib/_internal/pub/test/global/list_test.dart
new file mode 100644
index 0000000..782c9b0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/list_test.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  integration('lists an activated hosted package', () {
+    servePackages((builder) {
+      builder.serve('foo', '1.0.0');
+    });
+
+    schedulePub(args: ['global', 'activate', 'foo']);
+
+    schedulePub(args: ['global', 'list'], output: 'foo 1.0.0');
+  });
+
+  integration('lists an activated Git package', () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libPubspec('foo', '1.0.0'),
+      d.dir('bin', [
+        d.file('foo.dart', 'main() => print("ok");')
+      ])
+    ]).create();
+
+    schedulePub(args: ['global', 'activate', '-sgit', '../foo.git']);
+
+    schedulePub(args: ['global', 'list'],
+        output: 'foo 1.0.0 from Git repository "../foo.git"');
+  });
+
+  integration('lists an activated Path package', () {
+    d.dir('foo', [
+      d.libPubspec('foo', '1.0.0'),
+      d.dir('bin', [
+        d.file('foo.dart', 'main() => print("ok");')
+      ])
+    ]).create();
+
+    schedulePub(args: ['global', 'activate', '-spath', '../foo']);
+
+    var path = canonicalize(p.join(sandboxDir, 'foo'));
+    schedulePub(args: ['global', 'list'],
+        output: 'foo 1.0.0 at path "$path"');
+  });
+
+  integration('lists activated packages in alphabetical order', () {
+    servePackages((builder) {
+      builder.serve('aaa', '1.0.0');
+      builder.serve('bbb', '1.0.0');
+      builder.serve('ccc', '1.0.0');
+    });
+
+    schedulePub(args: ['global', 'activate', 'ccc']);
+    schedulePub(args: ['global', 'activate', 'aaa']);
+    schedulePub(args: ['global', 'activate', 'bbb']);
+
+    schedulePub(args: ['global', 'list'], output: '''
+aaa 1.0.0
+bbb 1.0.0
+ccc 1.0.0
+''');
+  });
+
+  integration('lists nothing when no packages activated', () {
+    schedulePub(args: ['global', 'list'], output: '\n');
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
index 8193876..0d16cdc 100644
--- a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
@@ -11,13 +11,13 @@
 main() {
   initConfig();
   integration('errors if the script is in a subdirectory.', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ], contents: [
-      d.dir("example", [
-        d.file("script.dart", "main(args) => print('ok');")
-      ])
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("example", [
+          d.file("script.dart", "main(args) => print('ok');")
+        ])
+      ]);
+    });
 
     schedulePub(args: ["global", "activate", "foo"]);
     schedulePub(args: ["global", "run", "foo:example/script"],
diff --git a/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart b/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart
index ad93bac..da68c8e 100644
--- a/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart
@@ -9,13 +9,13 @@
 main() {
   initConfig();
   integration('defaults to the package name if the script is omitted', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ], contents: [
-      d.dir("bin", [
-        d.file("foo.dart", "main(args) => print('foo');")
-      ])
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("foo.dart", "main(args) => print('foo');")
+        ])
+      ]);
+    });
 
     schedulePub(args: ["global", "activate", "foo"]);
 
diff --git a/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
index 76c3b31..d69c65a 100644
--- a/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
@@ -10,7 +10,7 @@
 main() {
   initConfig();
   integration('errors if the script does not exist.', () {
-    servePackages([packageMap("foo", "1.0.0")]);
+    servePackages((builder) => builder.serve("foo", "1.0.0"));
 
     schedulePub(args: ["global", "activate", "foo"]);
 
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_git_script_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_git_script_test.dart
new file mode 100644
index 0000000..f9c1c5c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/runs_git_script_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('runs a script in a git package', () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-sgit", "../foo.git"]);
+
+    var pub = pubRun(global: true, args: ["foo"]);
+    pub.stdout.expect("ok");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
index caf8f42..bfd8bcb 100644
--- a/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
@@ -8,13 +8,13 @@
 main() {
   initConfig();
   integration('runs a script in an activated package', () {
-    servePackages([
-      packageMap("foo", "1.0.0")
-    ], contents: [
-      d.dir("bin", [
-        d.file("script.dart", "main(args) => print('ok');")
-      ])
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok');")
+        ])
+      ]);
+    });
 
     schedulePub(args: ["global", "activate", "foo"]);
 
diff --git a/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
index e5a4bab..291577a 100644
--- a/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
@@ -10,7 +10,7 @@
 main() {
   initConfig();
   integration('errors if the package is not activated', () {
-    servePackages([]);
+    serveNoPackages();
 
     schedulePub(args: ["global", "run", "foo:bar"],
         error: startsWith("No active package foo."),
diff --git a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
index 527f597..df53819 100644
--- a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -4,22 +4,25 @@
 
 library pub_tests;
 
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../test_pub.dart';
 
 main() {
   initConfig();
 
   forBothPubGetAndUpgrade((command) {
     integration('fails gracefully if the package does not exist', () {
-      servePackages([]);
+      serveNoPackages();
 
       d.appDir({"foo": "1.2.3"}).create();
 
       pubCommand(command, error: new RegExp(r"""
 Could not find package foo at http://localhost:\d+\.
 Depended on by:
-- myapp""", multiLine: true));
+- myapp""", multiLine: true),
+          exitCode: exit_codes.UNAVAILABLE);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/hosted/offline_test.dart b/sdk/lib/_internal/pub/test/hosted/offline_test.dart
index 981d24d..0d7b2d8 100644
--- a/sdk/lib/_internal/pub/test/hosted/offline_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/offline_test.dart
@@ -13,7 +13,7 @@
   forBothPubGetAndUpgrade((command) {
     integration('upgrades a package using the cache', () {
       // Run the server so that we know what URL to use in the system cache.
-      servePackages([]);
+      serveNoPackages();
 
       d.cacheDir({
         "foo": ["1.2.2", "1.2.3"],
@@ -41,7 +41,7 @@
 
     integration('fails gracefully if a dependency is not cached', () {
       // Run the server so that we know what URL to use in the system cache.
-      servePackages([]);
+      serveNoPackages();
 
       d.appDir({"foo": "any"}).create();
 
@@ -51,7 +51,7 @@
 
     integration('fails gracefully no cached versions match', () {
       // Run the server so that we know what URL to use in the system cache.
-      servePackages([]);
+      serveNoPackages();
 
       d.cacheDir({
         "foo": ["1.2.2", "1.2.3"]
diff --git a/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart b/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart
index 442d968..36280c9 100644
--- a/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart
@@ -12,10 +12,10 @@
 
   forBothPubGetAndUpgrade((command) {
     integration("removes a dependency that's removed from the pubspec", () {
-      servePackages([
-        packageMap("foo", "1.0.0"),
-        packageMap("bar", "1.0.0")
-      ]);
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0");
+        builder.serve("bar", "1.0.0");
+      });
 
       d.appDir({"foo": "any", "bar": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart
index e975b05..f679225 100644
--- a/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart
@@ -13,17 +13,17 @@
   forBothPubGetAndUpgrade((command) {
     integration("removes a transitive dependency that's no longer depended "
         "on", () {
-      servePackages([
-        packageMap("foo", "1.0.0", {
+      servePackages((builder) {
+        builder.serve("foo", "1.0.0", deps: {
           "shared-dep": "any"
-        }),
-        packageMap("bar", "1.0.0", {
+        });
+        builder.serve("bar", "1.0.0", deps: {
           "shared-dep": "any",
           "bar-dep": "any"
-        }),
-        packageMap("shared-dep", "1.0.0"),
-        packageMap("bar-dep", "1.0.0")
-      ]);
+        });
+        builder.serve("shared-dep", "1.0.0");
+        builder.serve("bar-dep", "1.0.0");
+      });
 
       d.appDir({
         "foo": "any",
diff --git a/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart b/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
index 03f18d8..6965fcd 100644
--- a/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/implicit_barback_dependency_test.dart
@@ -22,14 +22,14 @@
 
   forBothPubGetAndUpgrade((command) {
     integration("implicitly constrains barback to versions pub supports", () {
-      servePackages([
-        packageMap("barback", previous),
-        packageMap("barback", current),
-        packageMap("barback", nextPatch),
-        packageMap("barback", max),
-        packageMap("source_span", sourceSpanVersion),
-        packageMap("stack_trace", stackTraceVersion)
-      ]);
+      servePackages((builder) {
+        builder.serve("barback", previous);
+        builder.serve("barback", current);
+        builder.serve("barback", nextPatch);
+        builder.serve("barback", max);
+        builder.serve("source_span", sourceSpanVersion);
+        builder.serve("stack_trace", stackTraceVersion);
+      });
 
       d.appDir({
         "barback": "any"
@@ -43,14 +43,14 @@
     });
 
     integration("discovers transitive dependency on barback", () {
-      servePackages([
-        packageMap("barback", previous),
-        packageMap("barback", current),
-        packageMap("barback", nextPatch),
-        packageMap("barback", max),
-        packageMap("source_span", sourceSpanVersion),
-        packageMap("stack_trace", stackTraceVersion)
-      ]);
+      servePackages((builder) {
+        builder.serve("barback", previous);
+        builder.serve("barback", current);
+        builder.serve("barback", nextPatch);
+        builder.serve("barback", max);
+        builder.serve("source_span", sourceSpanVersion);
+        builder.serve("stack_trace", stackTraceVersion);
+      });
 
       d.dir("foo", [
         d.libDir("foo", "foo 0.0.1"),
@@ -73,10 +73,10 @@
 
     integration("pub's implicit constraint uses the same source and "
         "description as a dependency override", () {
-      servePackages([
-        packageMap("source_span", sourceSpanVersion),
-        packageMap("stack_trace", stackTraceVersion)
-      ]);
+      servePackages((builder) {
+        builder.serve("source_span", sourceSpanVersion);
+        builder.serve("stack_trace", stackTraceVersion);
+      });
 
       d.dir('barback', [
         d.libDir('barback', 'barback $current'),
@@ -101,12 +101,12 @@
   });
 
   integration("unlock if the locked version doesn't meet pub's constraint", () {
-    servePackages([
-      packageMap("barback", previous),
-      packageMap("barback", current),
-      packageMap("source_span", sourceSpanVersion),
-      packageMap("stack_trace", stackTraceVersion)
-    ]);
+    servePackages((builder) {
+      builder.serve("barback", previous);
+      builder.serve("barback", current);
+      builder.serve("source_span", sourceSpanVersion);
+      builder.serve("stack_trace", stackTraceVersion);
+    });
 
     d.appDir({"barback": "any"}).create();
 
@@ -125,11 +125,11 @@
 
   integration("includes pub in the error if a solve failed because there "
       "is no version available", () {
-    servePackages([
-      packageMap("barback", previous),
-      packageMap("source_span", sourceSpanVersion),
-      packageMap("stack_trace", stackTraceVersion)
-    ]);
+    servePackages((builder) {
+      builder.serve("barback", previous);
+      builder.serve("source_span", sourceSpanVersion);
+      builder.serve("stack_trace", stackTraceVersion);
+    });
 
     d.appDir({"barback": "any"}).create();
 
@@ -141,12 +141,12 @@
 
   integration("includes pub in the error if a solve failed because there "
       "is a disjoint constraint", () {
-    servePackages([
-      packageMap("barback", previous),
-      packageMap("barback", current),
-      packageMap("source_span", sourceSpanVersion),
-      packageMap("stack_trace", stackTraceVersion)
-    ]);
+    servePackages((builder) {
+      builder.serve("barback", previous);
+      builder.serve("barback", current);
+      builder.serve("source_span", sourceSpanVersion);
+      builder.serve("stack_trace", stackTraceVersion);
+    });
 
     d.appDir({"barback": previous}).create();
 
diff --git a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
index 3f46637..34e133f 100644
--- a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
@@ -12,14 +12,14 @@
 
   forBothPubGetAndUpgrade((command) {
     integration("implicitly constrains it to versions pub supports", () {
-      servePackages([
-        packageMap("barback", current("barback")),
-        packageMap("stack_trace", previous("stack_trace")),
-        packageMap("stack_trace", current("stack_trace")),
-        packageMap("stack_trace", nextPatch("stack_trace")),
-        packageMap("stack_trace", max("stack_trace")),
-        packageMap("source_span", current("source_span"))
-      ]);
+      servePackages((builder) {
+        builder.serve("barback", current("barback"));
+        builder.serve("stack_trace", previous("stack_trace"));
+        builder.serve("stack_trace", current("stack_trace"));
+        builder.serve("stack_trace", nextPatch("stack_trace"));
+        builder.serve("stack_trace", max("stack_trace"));
+        builder.serve("source_span", current("source_span"));
+      });
 
       d.appDir({
         "barback": "any"
@@ -32,11 +32,11 @@
 
     integration("pub's implicit constraint uses the same source and "
         "description as a dependency override", () {
-      servePackages([
-        packageMap("barback", current("barback")),
-        packageMap("stack_trace", nextPatch("stack_trace")),
-        packageMap("source_span", current("source_span"))
-      ]);
+      servePackages((builder) {
+        builder.serve("barback", current("barback"));
+        builder.serve("stack_trace", nextPatch("stack_trace"));
+        builder.serve("source_span", current("source_span"));
+      });
 
       d.dir("stack_trace", [
         d.libDir("stack_trace", 'stack_trace ${current("stack_trace")}'),
@@ -64,13 +64,13 @@
 
     integration("doesn't add a constraint if barback isn't in the package "
         "graph", () {
-      servePackages([
-        packageMap("stack_trace", previous("stack_trace")),
-        packageMap("stack_trace", current("stack_trace")),
-        packageMap("stack_trace", nextPatch("stack_trace")),
-        packageMap("stack_trace", max("stack_trace")),
-        packageMap("source_span", current("source_span"))
-      ]);
+      servePackages((builder) {
+        builder.serve("stack_trace", previous("stack_trace"));
+        builder.serve("stack_trace", current("stack_trace"));
+        builder.serve("stack_trace", nextPatch("stack_trace"));
+        builder.serve("stack_trace", max("stack_trace"));
+        builder.serve("source_span", current("source_span"));
+      });
 
       d.appDir({
         "stack_trace": "any"
@@ -84,12 +84,12 @@
 
   integration("unlocks if the locked version doesn't meet pub's "
       "constraint", () {
-    servePackages([
-      packageMap("barback", current("barback")),
-      packageMap("stack_trace", previous("stack_trace")),
-      packageMap("stack_trace", current("stack_trace")),
-      packageMap("source_span", current("source_span"))
-    ]);
+    servePackages((builder) {
+      builder.serve("barback", current("barback"));
+      builder.serve("stack_trace", previous("stack_trace"));
+      builder.serve("stack_trace", current("stack_trace"));
+      builder.serve("source_span", current("source_span"));
+    });
 
     d.appDir({"barback": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
index 95a8c5d..fe29d81 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -11,7 +11,7 @@
 main() {
   initConfig();
   integration('prints the local paths to all packages in the lockfile', () {
-    servePackages([packageMap("bar", "1.0.0")]);
+    servePackages((builder) => builder.serve("bar", "1.0.0"));
 
     d.dir("foo", [
       d.libDir("foo"),
diff --git a/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart b/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart
index 12d5151..2911deb 100644
--- a/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart
+++ b/sdk/lib/_internal/pub/test/no_package_symlinks_test.dart
@@ -13,10 +13,10 @@
   forBothPubGetAndUpgrade((command) {
     group("with --no-package-symlinks", () {
       integration("installs hosted dependencies to the cache", () {
-        servePackages([
-          packageMap("foo", "1.0.0"),
-          packageMap("bar", "1.0.0")
-        ]);
+        servePackages((builder) {
+          builder.serve("foo", "1.0.0");
+          builder.serve("bar", "1.0.0");
+        });
 
         d.appDir({"foo": "any", "bar": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_is_not_installed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_is_not_installed_test.dart
index eac41fe..d76d836 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_is_not_installed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_dependency_is_not_installed_test.dart
@@ -15,7 +15,7 @@
 main() {
   initConfig();
   integration("gets first if a dependency is not installed", () {
-    servePackages([packageMap("foo", "1.2.3")]);
+    servePackages((builder) => builder.serve("foo", "1.2.3"));
 
     d.appDir({"foo": "1.2.3"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/serve/gets_first_if_transitive_dependency_is_not_installed_test.dart b/sdk/lib/_internal/pub/test/serve/gets_first_if_transitive_dependency_is_not_installed_test.dart
index 76f9039..3d36745 100644
--- a/sdk/lib/_internal/pub/test/serve/gets_first_if_transitive_dependency_is_not_installed_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/gets_first_if_transitive_dependency_is_not_installed_test.dart
@@ -15,7 +15,7 @@
 main() {
   initConfig();
   integration("gets first if a transitive dependency is not installed", () {
-    servePackages([packageMap("bar", "1.2.3")]);
+    servePackages((builder) => builder.serve("bar", "1.2.3"));
 
     d.dir("foo", [
       d.libPubspec("foo", "1.0.0", deps: {
diff --git a/sdk/lib/_internal/pub/test/serve_packages.dart b/sdk/lib/_internal/pub/test/serve_packages.dart
new file mode 100644
index 0000000..92a319e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve_packages.dart
@@ -0,0 +1,195 @@
+// 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 serve_packages;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:yaml/yaml.dart';
+
+import '../lib/src/io.dart';
+import '../lib/src/utils.dart';
+import '../lib/src/version.dart';
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+/// The [d.DirectoryDescriptor] describing the server layout of `/api/packages`
+/// on the test server.
+///
+/// This contains metadata for packages that are being served via
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for
+/// this test.
+d.DirectoryDescriptor _servedApiPackageDir;
+
+/// The [d.DirectoryDescriptor] describing the server layout of `/packages` on
+/// the test server.
+///
+/// This contains the tarballs for packages that are being served via
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for
+/// this test.
+d.DirectoryDescriptor _servedPackageDir;
+
+/// The current [PackageServerBuilder] that a user uses to specify which package
+/// to serve.
+///
+/// This is preserved over multiple calls to [servePackages] within the same
+/// test so that additional packages can be added.
+PackageServerBuilder _builder;
+
+/// Creates an HTTP server that replicates the structure of pub.dartlang.org.
+///
+/// Calls [callback] with a [PackageServerBuilder] that's used to specify
+/// which packages to serve.
+///
+/// If [replace] is false, subsequent calls to [servePackages] will add to the
+/// set of packages that are being served. Previous packages will continue to be
+/// served. Otherwise, the previous packages will no longer be served.
+void servePackages(void callback(PackageServerBuilder builder),
+    {bool replace: false}) {
+  if (_servedPackageDir == null) {
+    _builder = new PackageServerBuilder();
+    _servedApiPackageDir = d.dir('packages', []);
+    _servedPackageDir = d.dir('packages', []);
+    serve([
+      d.dir('api', [_servedApiPackageDir]),
+      _servedPackageDir
+    ]);
+
+    currentSchedule.onComplete.schedule(() {
+      _builder = null;
+      _servedApiPackageDir = null;
+      _servedPackageDir = null;
+    }, 'cleaning up served packages');
+  }
+
+  schedule(() {
+    if (replace) _builder = new PackageServerBuilder();
+    callback(_builder);
+    return _builder._await().then((resolvedPubspecs) {
+      _servedApiPackageDir.contents.clear();
+      _servedPackageDir.contents.clear();
+      _builder._packages.forEach((name, versions) {
+        _servedApiPackageDir.contents.addAll([
+          d.file('$name', JSON.encode({
+            'name': name,
+            'uploaders': ['nweiz@google.com'],
+            'versions': versions.map((version) =>
+                packageVersionApiMap(version.pubspec)).toList()
+          })),
+          d.dir(name, [
+            d.dir('versions', versions.map((version) {
+              return d.file(version.version.toString(), JSON.encode(
+                  packageVersionApiMap(version.pubspec, full: true)));
+            }))
+          ])
+        ]);
+
+        _servedPackageDir.contents.add(d.dir(name, [
+          d.dir('versions', versions.map((version) =>
+              d.tar('${version.version}.tar.gz', version.contents)))
+        ]));
+      });
+    });
+  }, 'initializing the package server');
+}
+
+/// Like [servePackages], but instead creates an empty server with no packages
+/// registered.
+///
+/// This will always replace a previous server.
+void serveNoPackages() => servePackages((_) {}, replace: true);
+
+/// A builder for specifying which packages should be served by [servePackages].
+class PackageServerBuilder {
+  /// A map from package names to a list of concrete packages to serve.
+  final _packages = new Map<String, List<_ServedPackage>>();
+
+  /// A group of futures from [serve] calls.
+  ///
+  /// This should be accessed by calling [_awair].
+  var _futures = new FutureGroup();
+
+  /// Specifies that a package named [name] with [version] should be served.
+  ///
+  /// If [deps] is passed, it's used as the "dependencies" field of the pubspec.
+  /// If [pubspec] is passed, it's used as the rest of the pubspec. Either of
+  /// these may recursively contain Futures.
+  ///
+  /// If [contents] is passed, it's used as the contents of the package. By
+  /// default, a package just contains a dummy lib directory.
+  void serve(String name, String version, {Map deps, Map pubspec,
+      Iterable<d.Descriptor> contents}) {
+    _futures.add(Future.wait([
+      awaitObject(deps),
+      awaitObject(pubspec)
+    ]).then((pair) {
+      var resolvedDeps = pair.first;
+      var resolvedPubspec = pair.last;
+
+      var pubspecFields = {
+        "name": name,
+        "version": version
+      };
+      if (resolvedPubspec != null) pubspecFields.addAll(resolvedPubspec);
+      if (resolvedDeps != null) pubspecFields["dependencies"] = resolvedDeps;
+
+      if (contents == null) contents = [d.libDir(name, "$name $version")];
+      contents = [d.file("pubspec.yaml", yaml(pubspecFields))]
+          ..addAll(contents);
+
+      var packages = _packages.putIfAbsent(name, () => []);
+      packages.add(new _ServedPackage(pubspecFields, contents));
+    }));
+  }
+
+  /// Serves the versions of [package] and all its dependencies that are
+  /// currently checked into the Dart repository.
+  void serveRepoPackage(String package) {
+    _addPackage(name) {
+      if (_packages.containsKey(name)) return;
+      _packages[name] = [];
+
+      var pubspec = new Map.from(loadYaml(
+          readTextFile(p.join(repoRoot, 'pkg', name, 'pubspec.yaml'))));
+
+      // Remove any SDK constraints since we don't have a valid SDK version
+      // while testing.
+      pubspec.remove('environment');
+
+      _packages[name].add(new _ServedPackage(pubspec, [
+        d.file('pubspec.yaml', yaml(pubspec)),
+        new d.DirectoryDescriptor.fromFilesystem('lib',
+            p.join(repoRoot, 'pkg', name, 'lib'))
+      ]));
+
+      if (pubspec.containsKey('dependencies')) {
+        pubspec['dependencies'].keys.forEach(_addPackage);
+      }
+    }
+
+    _addPackage(package);
+  }
+
+  /// Returns a Future that completes once all the [serve] calls have been fully
+  /// processed.
+  Future _await() {
+    if (_futures.futures.isEmpty) return new Future.value();
+    return _futures.future.then((_) {
+      _futures = new FutureGroup();
+    });
+  }
+}
+
+/// A package that's intended to be served.
+class _ServedPackage {
+  final Map pubspec;
+  final List<d.Descriptor> contents;
+
+  Version get version => new Version.parse(pubspec['version']);
+
+  _ServedPackage(this.pubspec, this.contents);
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_for_immediate_and_transitive_dep_test.dart b/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_for_immediate_and_transitive_dep_test.dart
new file mode 100644
index 0000000..f411043
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_for_immediate_and_transitive_dep_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("creates a snapshot for an immediate dependency that's also a "
+      "transitive dependency", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() => print('hello!');"),
+          d.file("goodbye.dart", "void main() => print('goodbye!');"),
+          d.file("shell.sh", "echo shell"),
+          d.dir("subdir", [
+            d.file("sub.dart", "void main() => print('sub!');")
+          ])
+        ])
+      ]);
+      builder.serve("bar", "1.2.3", deps: {"foo": "1.2.3"});
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: allOf([
+      contains("Precompiled foo:hello."),
+      contains("Precompiled foo:goodbye.")
+    ]));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.1.2+3\n'),
+      d.dir('foo', [
+        d.matcherFile('hello.dart.snapshot', contains('hello!')),
+        d.matcherFile('goodbye.dart.snapshot', contains('goodbye!')),
+        d.nothing('shell.sh.snapshot'),
+        d.nothing('subdir')
+      ])
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello!");
+    process.shouldExit();
+
+    process = pubRun(args: ['foo:goodbye']);
+    process.stdout.expect("goodbye!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_test.dart b/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_test.dart
new file mode 100644
index 0000000..6683d06
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/creates_a_snapshot_test.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 pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("creates a snapshot for an immediate dependency's executables",
+      () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() => print('hello!');"),
+          d.file("goodbye.dart", "void main() => print('goodbye!');"),
+          d.file("shell.sh", "echo shell"),
+          d.dir("subdir", [
+            d.file("sub.dart", "void main() => print('sub!');")
+          ])
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: allOf([
+      contains("Precompiled foo:hello."),
+      contains("Precompiled foo:goodbye.")
+    ]));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.1.2+3\n'),
+      d.dir('foo', [
+        d.matcherFile('hello.dart.snapshot', contains('hello!')),
+        d.matcherFile('goodbye.dart.snapshot', contains('goodbye!')),
+        d.nothing('shell.sh.snapshot'),
+        d.nothing('subdir')
+      ])
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello!");
+    process.shouldExit();
+
+    process = pubRun(args: ['foo:goodbye']);
+    process.stdout.expect("goodbye!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/doesnt_resnapshot_when_a_dependency_is_unchanged_test.dart b/sdk/lib/_internal/pub/test/snapshot/doesnt_resnapshot_when_a_dependency_is_unchanged_test.dart
new file mode 100644
index 0000000..8750e79
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/doesnt_resnapshot_when_a_dependency_is_unchanged_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't recreate a snapshot when no dependencies of a package "
+      "have changed", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", deps: {"bar": "any"}, contents: [
+        d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])
+      ]);
+      builder.serve("bar", "1.2.3");
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    pubUpgrade(output: isNot(contains("Precompiled foo:hello.")));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.1.2+3\n'),
+      d.dir('foo', [d.matcherFile('hello.dart.snapshot', contains('hello!'))])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_an_entrypoint_dependency_test.dart b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_an_entrypoint_dependency_test.dart
new file mode 100644
index 0000000..5fd71a6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_an_entrypoint_dependency_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.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't create a snapshot for a package that depends on the "
+      "entrypoint", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", deps: {'bar': '1.2.3'}, contents: [
+        d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])
+      ]);
+      builder.serve("bar", "1.2.3", deps: {'myapp': 'any'});
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet();
+
+    // No local cache should be created, since all dependencies transitively
+    // depend on the entrypoint.
+    d.nothing(p.join(appPath, '.pub', 'bin')).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_path_dependency_test.dart b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_path_dependency_test.dart
new file mode 100644
index 0000000..5c1b1c4
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_path_dependency_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't create a snapshot for a path dependency", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.2.3"),
+      d.dir("bin", [
+        d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])
+      ])
+    ]).create();
+
+    d.appDir({"foo": {"path": "../foo"}}).create();
+
+    pubGet();
+
+    d.nothing(p.join(appPath, '.pub', 'bin')).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_transitive_dependencies_test.dart b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_transitive_dependencies_test.dart
new file mode 100644
index 0000000..039c7fb
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/doesnt_snapshot_transitive_dependencies_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't create a snapshot for transitive dependencies' "
+      "executables", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", deps: {'bar': '1.2.3'});
+      builder.serve("bar", "1.2.3", contents: [
+        d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet();
+
+    d.nothing(p.join(appPath, '.pub', 'bin', 'bar')).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/prints_errors_for_broken_snapshots_test.dart b/sdk/lib/_internal/pub/test/snapshot/prints_errors_for_broken_snapshots_test.dart
new file mode 100644
index 0000000..b398df7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/prints_errors_for_broken_snapshots_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("prints errors for broken snapshot compilation", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() { no closing brace"),
+          d.file("goodbye.dart", "void main() { no closing brace"),
+        ])
+      ]);
+      builder.serve("bar", "1.2.3", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() { no closing brace"),
+          d.file("goodbye.dart", "void main() { no closing brace"),
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3", "bar": "1.2.3"}).create();
+
+    // This should still have a 0 exit code, since installation succeeded even
+    // if precompilation didn't.
+    pubGet(error: allOf([
+      contains("Failed to precompile foo:hello"),
+      contains("Failed to precompile foo:goodbye"),
+      contains("Failed to precompile bar:hello"),
+      contains("Failed to precompile bar:goodbye")
+    ]), exitCode: 0);
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.1.2+3\n'),
+      d.dir('foo', [
+        d.nothing('hello.dart.snapshot'),
+        d.nothing('goodbye.dart.snapshot')
+      ]),
+      d.dir('bar', [
+        d.nothing('hello.dart.snapshot'),
+        d.nothing('goodbye.dart.snapshot')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/recompiles_if_the_sdk_is_out_of_date_test.dart b/sdk/lib/_internal/pub/test/snapshot/recompiles_if_the_sdk_is_out_of_date_test.dart
new file mode 100644
index 0000000..41870c7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/recompiles_if_the_sdk_is_out_of_date_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("creates a snapshot for an immediate dependency's executables",
+      () {
+    servePackages((builder) {
+      builder.serve("foo", "5.6.7", contents: [
+        d.dir("bin", [d.file("hello.dart", "void main() => print('hello!');")])
+      ]);
+    });
+
+    d.appDir({"foo": "5.6.7"}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.0.1'),
+      d.dir('foo', [d.file('hello.dart.snapshot', 'junk')])
+    ]).create();
+
+    var process = pubRun(args: ['foo:hello']);
+
+    // In the real world this would just print "hello!", but since we collect
+    // all output we see the precompilation messages as well.
+    process.stdout.expect("Precompiling executables...");
+    process.stdout.expect(consumeThrough("hello!"));
+    process.shouldExit();
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.file('sdk-version', '0.1.2+3'),
+      d.dir('foo', [d.matcherFile('hello.dart.snapshot', contains('hello!'))])
+    ]).create();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/snapshots_transformed_code_test.dart b/sdk/lib/_internal/pub/test/snapshot/snapshots_transformed_code_test.dart
new file mode 100644
index 0000000..7c35cdc
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/snapshots_transformed_code_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const REPLACE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(transform.primaryInput.id,
+          contents.replaceAll("REPLACE ME", "hello!")));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("snapshots the transformed version of an executable", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {"barback": "any"},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [d.file("foo.dart", REPLACE_TRANSFORMER)]),
+        d.dir("bin", [
+          d.file("hello.dart", """
+final message = 'REPLACE ME';
+
+void main() => print(message);
+"""),
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin'), [
+      d.dir('foo', [d.matcherFile('hello.dart.snapshot', contains('hello!'))])
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_for_dependency_test.dart b/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_for_dependency_test.dart
new file mode 100644
index 0000000..36e4471
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_for_dependency_test.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 pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("upgrades a snapshot when a dependency is upgraded", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", pubspec: {
+        "dependencies": {"bar": "any"}
+      }, contents: [
+        d.dir("bin", [
+          d.file("hello.dart", """
+import 'package:bar/bar.dart';
+
+void main() => print(message);
+""")
+        ])
+      ]);
+      builder.serve("bar", "1.2.3", contents: [
+        d.dir("lib", [d.file("bar.dart", "final message = 'hello!';")])
+      ]);
+    });
+
+    d.appDir({"foo": "any"}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('hello!'))
+    ]).validate();
+
+    servePackages((builder) {
+      builder.serve("bar", "1.2.4", contents: [
+        d.dir("lib", [d.file("bar.dart", "final message = 'hello 2!';")]),
+      ]);
+    });
+
+    pubUpgrade(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('hello 2!'))
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello 2!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_test.dart b/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_test.dart
new file mode 100644
index 0000000..10aefb6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/snapshot/upgrades_snapshot_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("upgrades a snapshot when its package is upgraded", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.2.3", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() => print('hello!');")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "any"}).create();
+
+    pubGet(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('hello!'))
+    ]).validate();
+
+    servePackages((builder) {
+      builder.serve("foo", "1.2.4", contents: [
+        d.dir("bin", [
+          d.file("hello.dart", "void main() => print('hello 2!');")
+        ])
+      ]);
+    });
+
+    pubUpgrade(output: contains("Precompiled foo:hello."));
+
+    d.dir(p.join(appPath, '.pub', 'bin', 'foo'), [
+      d.matcherFile('hello.dart.snapshot', contains('hello 2!'))
+    ]).validate();
+
+    var process = pubRun(args: ['foo:hello']);
+    process.stdout.expect("hello 2!");
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 54e30de..d2e9589 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -15,11 +15,11 @@
 import 'dart:math';
 
 import 'package:http/testing.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_stream.dart';
-import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_test.dart' hide fail;
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf/shelf_io.dart' as shelf_io;
 import 'package:unittest/compact_vm_config.dart';
@@ -45,6 +45,9 @@
 import '../lib/src/validator.dart';
 import '../lib/src/version.dart';
 import 'descriptor.dart' as d;
+import 'serve_packages.dart';
+
+export 'serve_packages.dart';
 
 /// This should be called at the top of a test file to set up an appropriate
 /// test configuration for the machine running the tests.
@@ -103,12 +106,12 @@
 /// Populates [_barbackVersions].
 Map<Version, String> _findBarbackVersions() {
   var versions = {};
-  var currentBarback = path.join(repoRoot, 'pkg', 'barback');
+  var currentBarback = p.join(repoRoot, 'pkg', 'barback');
   versions[new Pubspec.load(currentBarback, new SourceRegistry()).version] =
       currentBarback;
 
-  for (var dir in listDir(path.join(repoRoot, 'third_party', 'pkg'))) {
-    var basename = path.basename(dir);
+  for (var dir in listDir(p.join(repoRoot, 'third_party', 'pkg'))) {
+    var basename = p.basename(dir);
     if (!basename.startsWith('barback')) continue;
     versions[new Version.parse(split1(basename, '-').last)] = dir;
   }
@@ -139,7 +142,7 @@
         _barbackDeps.forEach((constraint, deps) {
           if (!constraint.allows(version)) return;
           deps.forEach((packageName, version) {
-            _packageOverrides[packageName] = path.join(
+            _packageOverrides[packageName] = p.join(
                 repoRoot, 'third_party', 'pkg', '$packageName-$version');
           });
         });
@@ -190,7 +193,7 @@
     return _closeServer().then((_) {
       return shelf_io.serve((request) {
         currentSchedule.heartbeat();
-        var path = request.url.path.replaceFirst("/", "");
+        var path = p.posix.fromUri(request.url.path.replaceFirst("/", ""));
         _requestedPaths.add(path);
 
         return validateStream(baseDir.load(path))
@@ -222,106 +225,6 @@
 /// `true` if the current test spins up an HTTP server.
 bool _hasServer = false;
 
-/// The [d.DirectoryDescriptor] describing the server layout of `/api/packages`
-/// on the test server.
-///
-/// This contains metadata for packages that are being served via
-/// [servePackages]. It's `null` if [servePackages] has not yet been called for
-/// this test.
-d.DirectoryDescriptor _servedApiPackageDir;
-
-/// The [d.DirectoryDescriptor] describing the server layout of `/packages` on
-/// the test server.
-///
-/// This contains the tarballs for packages that are being served via
-/// [servePackages]. It's `null` if [servePackages] has not yet been called for
-/// this test.
-d.DirectoryDescriptor _servedPackageDir;
-
-/// A map from package names to parsed pubspec maps for those packages.
-///
-/// This represents the packages currently being served by [servePackages], and
-/// is `null` if [servePackages] has not yet been called for this test.
-Map<String, List<Map>> _servedPackages;
-
-/// Creates an HTTP server that replicates the structure of pub.dartlang.org.
-///
-/// [pubspecs] is a list of unserialized pubspecs representing the packages to
-/// serve.
-///
-/// If [replace] is false, subsequent calls to [servePackages] will add to the
-/// set of packages that are being served. Previous packages will continue to be
-/// served. Otherwise, the previous packages will no longer be served.
-///
-/// If [contents] is given, its contents are added to every served
-/// package.
-void servePackages(List<Map> pubspecs, {bool replace: false,
-    Iterable<d.Descriptor> contents}) {
-  if (_servedPackages == null || _servedPackageDir == null) {
-    _servedPackages = <String, List<Map>>{};
-    _servedApiPackageDir = d.dir('packages', []);
-    _servedPackageDir = d.dir('packages', []);
-    serve([
-      d.dir('api', [_servedApiPackageDir]),
-      _servedPackageDir
-    ]);
-
-    currentSchedule.onComplete.schedule(() {
-      _servedPackages = null;
-      _servedApiPackageDir = null;
-      _servedPackageDir = null;
-    }, 'cleaning up served packages');
-  }
-
-  schedule(() {
-    return awaitObject(pubspecs).then((resolvedPubspecs) {
-      if (replace) _servedPackages.clear();
-
-      for (var pubspec in resolvedPubspecs) {
-        var name = pubspec['name'];
-        var version = pubspec['version'];
-        var versions = _servedPackages.putIfAbsent(name, () => []);
-        versions.add(pubspec);
-      }
-
-      _servedApiPackageDir.contents.clear();
-      _servedPackageDir.contents.clear();
-      for (var name in _servedPackages.keys) {
-        _servedApiPackageDir.contents.addAll([
-          d.file('$name', JSON.encode({
-            'name': name,
-            'uploaders': ['nweiz@google.com'],
-            'versions': _servedPackages[name].map(packageVersionApiMap).toList()
-          })),
-          d.dir(name, [
-            d.dir('versions', _servedPackages[name].map((pubspec) {
-              return d.file(pubspec['version'], JSON.encode(
-                  packageVersionApiMap(pubspec, full: true)));
-            }))
-          ])
-        ]);
-
-        _servedPackageDir.contents.add(d.dir(name, [
-          d.dir('versions', _servedPackages[name].map((pubspec) {
-            var version = pubspec['version'];
-
-            var archiveContents = [
-                d.file('pubspec.yaml', JSON.encode(pubspec)),
-                d.libDir(name, '$name $version')
-            ];
-
-            if (contents != null) {
-              archiveContents.addAll(contents);
-            }
-
-            return d.tar('$version.tar.gz', archiveContents);
-          }))
-        ]));
-      }
-    });
-  }, 'initializing the package server');
-}
-
 /// Converts [value] into a YAML string.
 String yaml(value) => JSON.encode(value);
 
@@ -330,9 +233,9 @@
 String _sandboxDir;
 
 /// The path to the Dart repo's packages.
-final String pkgPath = path.absolute(path.join(
-    path.dirname(Platform.executable),
-    '..', '..', '..', '..', 'pkg'));
+final String pkgPath = p.absolute(p.join(
+    p.dirname(Platform.executable),
+    '../../../../pkg'));
 
 /// The path of the package cache directory used for tests, relative to the
 /// sandbox directory.
@@ -476,15 +379,15 @@
 /// Get the path to the root "pub/test" directory containing the pub
 /// tests.
 String get testDirectory =>
-  path.absolute(path.dirname(libraryPath('test_pub')));
+  p.absolute(p.dirname(libraryPath('test_pub')));
 
 /// Schedules renaming (moving) the directory at [from] to [to], both of which
 /// are assumed to be relative to [sandboxDir].
 void scheduleRename(String from, String to) {
   schedule(
       () => renameDir(
-          path.join(sandboxDir, from),
-          path.join(sandboxDir, to)),
+          p.join(sandboxDir, from),
+          p.join(sandboxDir, to)),
       'renaming $from to $to');
 }
 
@@ -493,8 +396,8 @@
 void scheduleSymlink(String target, String symlink) {
   schedule(
       () => createSymlink(
-          path.join(sandboxDir, target),
-          path.join(sandboxDir, symlink)),
+          p.join(sandboxDir, target),
+          p.join(sandboxDir, symlink)),
       'symlinking $target to $symlink');
 }
 
@@ -573,13 +476,46 @@
   pub.writeLine("y");
 }
 
+/// Whether the async/await compiler has already been run.
+///
+/// If a test suite runs pub more than once, we only need to run the compiler
+/// the first time.
+// TODO(rnystrom): Remove this when #104 is fixed.
+bool _compiledAsync = false;
+
+/// Gets the path to the pub entrypoint Dart script to run.
+// TODO(rnystrom): This exists to run the async/await compiler on pub and then
+// get the path to the output of that. Once #104 is fixed, remove this.
+String _getPubPath(String dartBin) {
+  var buildDir = p.join(p.dirname(dartBin), '../../');
+
+  // Ensure the async/await compiler has been run once for this test suite. The
+  // compiler itself will only re-compile source files that have actually
+  // changed, so this is a no-op if everything is already compiled.
+  if (!_compiledAsync) {
+    var result = Process.runSync(dartBin, [
+      '--package-root=$_packageRoot/',
+      p.join(testDirectory, '..', 'bin', 'async_compile.dart'),
+      buildDir,
+      '--silent'
+    ]);
+    stdout.write(result.stdout);
+    stderr.write(result.stderr);
+    if (result.exitCode != 0) fail("Async/await compiler failed.");
+
+    _compiledAsync = true;
+  }
+
+  return p.join(buildDir, 'pub_async/bin/pub.dart');
+}
+
 /// Starts a Pub process and returns a [ScheduledProcess] that supports
 /// interaction with that process.
 ///
 /// Any futures in [args] will be resolved before the process is started.
 ScheduledProcess startPub({List args, Future<Uri> tokenEndpoint}) {
   String pathInSandbox(String relPath) {
-    return path.join(path.absolute(sandboxDir), relPath);
+    return p.join(p.absolute(sandboxDir), relPath);
   }
 
   ensureDir(pathInSandbox(appPath));
@@ -591,11 +527,14 @@
   // If the executable looks like a path, get its full path. That way we
   // can still find it when we spawn it with a different working directory.
   if (dartBin.contains(Platform.pathSeparator)) {
-    dartBin = path.absolute(dartBin);
+    dartBin = p.absolute(dartBin);
   }
 
   // Find the main pub entrypoint.
-  var pubPath = path.join(testDirectory, '..', 'bin', 'pub.dart');
+  var pubPath = _getPubPath(dartBin);
+  // TODO(rnystrom): Replace the above line with the following when #104 is
+  // fixed.
+  //var pubPath = p.join(testDirectory, '..', 'bin', 'pub.dart');
 
   var dartArgs = ['--package-root=$_packageRoot/', '--checked', pubPath,
       '--verbose'];
@@ -715,7 +654,7 @@
 }
 
 /// The path to the `packages` directory from which pub loads its dependencies.
-String get _packageRoot => path.absolute(Platform.packageRoot);
+String get _packageRoot => p.absolute(Platform.packageRoot);
 
 /// Fails the current test if Git is not installed.
 ///
@@ -745,7 +684,7 @@
     Iterable<d.Descriptor> contents, {Iterable<String> pkg,
     Map<String, String> hosted}) {
   // Start the server so we know what port to use in the cache directory name.
-  servePackages([]);
+  serveNoPackages();
 
   // Create the package in the hosted cache.
   d.hostedCache([
@@ -788,7 +727,7 @@
   sources.register(new HostedSource());
   sources.register(new PathSource());
 
-  d.file(path.join(package, 'pubspec.lock'),
+  d.file(p.join(package, 'pubspec.lock'),
       lockFile.serialize(null, sources)).create();
 }
 
@@ -825,12 +764,12 @@
       if (_packageOverrides.containsKey(package)) {
         packagePath = _packageOverrides[package];
       } else {
-        packagePath = path.join(pkgPath, package);
+        packagePath = p.join(pkgPath, package);
       }
 
       dependencies[package] = packagePath;
       var pubspec = loadYaml(
-          readTextFile(path.join(packagePath, 'pubspec.yaml')));
+          readTextFile(p.join(packagePath, 'pubspec.yaml')));
       var packageDeps = pubspec['dependencies'];
       if (packageDeps == null) return;
       packageDeps.keys.forEach(_addPackage);
@@ -843,7 +782,7 @@
   dependencies.forEach((name, dependencyPath) {
     var id = new PackageId(name, 'path', new Version(0, 0, 0), {
       'path': dependencyPath,
-      'relative': path.isRelative(dependencyPath)
+      'relative': p.isRelative(dependencyPath)
     });
     lockFile.packages[name] = id;
   });
@@ -1013,10 +952,10 @@
 Future<Pair<List<String>, List<String>>> schedulePackageValidation(
     ValidatorCreator fn) {
   return schedule(() {
-    var cache = new SystemCache.withSources(path.join(sandboxDir, cachePath));
+    var cache = new SystemCache.withSources(p.join(sandboxDir, cachePath));
 
     return syncFuture(() {
-      var validator = fn(new Entrypoint(path.join(sandboxDir, appPath), cache));
+      var validator = fn(new Entrypoint(p.join(sandboxDir, appPath), cache));
       return validator.validate().then((_) {
         return new Pair(validator.errors, validator.warnings);
       });
diff --git a/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
index da950b5..6747a44 100644
--- a/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
@@ -12,10 +12,10 @@
 main() {
   initConfig();
   integration("--dry-run shows report but does not apply changes", () {
-    servePackages([
-      packageMap("foo", "1.0.0"),
-      packageMap("foo", "2.0.0"),
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0");
+      builder.serve("foo", "2.0.0");
+    });
 
     // Create the first lockfile.
     d.appDir({
diff --git a/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_dependers_test.dart b/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_dependers_test.dart
index b217321..e82146a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_dependers_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_dependers_test.dart
@@ -11,10 +11,10 @@
   initConfig();
   integration("upgrades a locked package's dependers in order to get it to max "
       "version", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"bar": "<2.0.0"}),
-      packageMap("bar", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"bar": "<2.0.0"});
+      builder.serve("bar", "1.0.0");
+    });
 
     d.appDir({"foo": "any", "bar": "any"}).create();
 
@@ -25,10 +25,10 @@
       "bar": "1.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "2.0.0", {"bar": "<3.0.0"}),
-      packageMap("bar", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"bar": "<3.0.0"});
+      builder.serve("bar", "2.0.0");
+    });
 
     pubUpgrade(args: ['bar']);
 
diff --git a/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_if_necessary_test.dart b/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_if_necessary_test.dart
index 7de2061..76edd98 100644
--- a/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_if_necessary_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/hosted/unlock_if_necessary_test.dart
@@ -11,10 +11,10 @@
   initConfig();
   integration("upgrades one locked pub server package's dependencies if it's "
       "necessary", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"foo_dep": "any"}),
-      packageMap("foo_dep", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"foo_dep": "any"});
+      builder.serve("foo_dep", "1.0.0");
+    });
 
     d.appDir({"foo": "any"}).create();
 
@@ -25,10 +25,10 @@
       "foo_dep": "1.0.0"
     }).validate();
 
-    servePackages([
-      packageMap("foo", "2.0.0", {"foo_dep": ">1.0.0"}),
-      packageMap("foo_dep", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {"foo_dep": ">1.0.0"});
+      builder.serve("foo_dep", "2.0.0");
+    });
 
     pubUpgrade(args: ['foo']);
 
diff --git a/sdk/lib/_internal/pub/test/upgrade/hosted/upgrade_removed_constraints_test.dart b/sdk/lib/_internal/pub/test/upgrade/hosted/upgrade_removed_constraints_test.dart
index 3dea976..d641cd2 100644
--- a/sdk/lib/_internal/pub/test/upgrade/hosted/upgrade_removed_constraints_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/hosted/upgrade_removed_constraints_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration("upgrades dependencies whose constraints have been removed", () {
-    servePackages([
-      packageMap("foo", "1.0.0", {"shared-dep": "any"}),
-      packageMap("bar", "1.0.0", {"shared-dep": "<2.0.0"}),
-      packageMap("shared-dep", "1.0.0"),
-      packageMap("shared-dep", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", deps: {"shared-dep": "any"});
+      builder.serve("bar", "1.0.0", deps: {"shared-dep": "<2.0.0"});
+      builder.serve("shared-dep", "1.0.0");
+      builder.serve("shared-dep", "2.0.0");
+    });
 
     d.appDir({"foo": "any", "bar": "any"}).create();
 
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
index cc84127..18110fc 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
@@ -10,12 +10,12 @@
 main() {
   initConfig();
   integration("shows how package changed from previous lockfile", () {
-    servePackages([
-      packageMap("unchanged", "1.0.0"),
-      packageMap("version_changed", "1.0.0"),
-      packageMap("version_changed", "2.0.0"),
-      packageMap("source_changed", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("unchanged", "1.0.0");
+      builder.serve("version_changed", "1.0.0");
+      builder.serve("version_changed", "2.0.0");
+      builder.serve("source_changed", "1.0.0");
+    });
 
     d.dir("source_changed", [
       d.libDir("source_changed"),
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index 1473fe18..2520678 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -11,14 +11,14 @@
   initConfig();
   integration("does not show how many newer versions are available for "
       "packages that are locked and not being upgraded", () {
-    servePackages([
-      packageMap("not_upgraded", "1.0.0"),
-      packageMap("not_upgraded", "2.0.0"),
-      packageMap("not_upgraded", "3.0.0-dev"),
-      packageMap("upgraded", "1.0.0"),
-      packageMap("upgraded", "2.0.0"),
-      packageMap("upgraded", "3.0.0-dev")
-    ]);
+    servePackages((builder) {
+      builder.serve("not_upgraded", "1.0.0");
+      builder.serve("not_upgraded", "2.0.0");
+      builder.serve("not_upgraded", "3.0.0-dev");
+      builder.serve("upgraded", "1.0.0");
+      builder.serve("upgraded", "2.0.0");
+      builder.serve("upgraded", "3.0.0-dev");
+    });
 
     // Constraint everything to the first version.
     d.appDir({
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
index b91cd08..b33e1ed 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
@@ -10,9 +10,7 @@
 main() {
   initConfig();
   integration("highlights overridden packages", () {
-    servePackages([
-      packageMap("overridden", "1.0.0")
-    ]);
+    servePackages((builder) => builder.serve("overridden", "1.0.0"));
 
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
index 3d94d7a..eef1946 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
@@ -10,17 +10,17 @@
 main() {
   initConfig();
   integration("the character before each package describes the change", () {
-    servePackages([
-      packageMap("added", "1.0.0"),
-      packageMap("downgraded", "1.0.0"),
-      packageMap("downgraded", "2.0.0"),
-      packageMap("overridden", "1.0.0"),
-      packageMap("removed", "1.0.0"),
-      packageMap("source_changed", "1.0.0"),
-      packageMap("upgraded", "1.0.0"),
-      packageMap("upgraded", "2.0.0"),
-      packageMap("unchanged", "1.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("added", "1.0.0");
+      builder.serve("downgraded", "1.0.0");
+      builder.serve("downgraded", "2.0.0");
+      builder.serve("overridden", "1.0.0");
+      builder.serve("removed", "1.0.0");
+      builder.serve("source_changed", "1.0.0");
+      builder.serve("upgraded", "1.0.0");
+      builder.serve("upgraded", "2.0.0");
+      builder.serve("unchanged", "1.0.0");
+    });
 
     d.dir("description_changed_1", [
       d.libDir("description_changed"),
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
index 18d4f76..9936447 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -10,23 +10,23 @@
 main() {
   initConfig();
   integration("shows how many newer versions are available", () {
-    servePackages([
-      packageMap("multiple_newer", "1.0.0"),
-      packageMap("multiple_newer", "1.0.1-unstable.1"),
-      packageMap("multiple_newer", "1.0.1"),
-      packageMap("multiple_newer", "1.0.2-unstable.1"),
-      packageMap("multiple_newer_stable", "1.0.0"),
-      packageMap("multiple_newer_stable", "1.0.1"),
-      packageMap("multiple_newer_stable", "1.0.2"),
-      packageMap("multiple_newer_unstable", "1.0.0"),
-      packageMap("multiple_newer_unstable", "1.0.1-unstable.1"),
-      packageMap("multiple_newer_unstable", "1.0.1-unstable.2"),
-      packageMap("no_newer", "1.0.0"),
-      packageMap("one_newer_unstable", "1.0.0"),
-      packageMap("one_newer_unstable", "1.0.1-unstable.1"),
-      packageMap("one_newer_stable", "1.0.0"),
-      packageMap("one_newer_stable", "1.0.1")
-    ]);
+    servePackages((builder) {
+      builder.serve("multiple_newer", "1.0.0");
+      builder.serve("multiple_newer", "1.0.1-unstable.1");
+      builder.serve("multiple_newer", "1.0.1");
+      builder.serve("multiple_newer", "1.0.2-unstable.1");
+      builder.serve("multiple_newer_stable", "1.0.0");
+      builder.serve("multiple_newer_stable", "1.0.1");
+      builder.serve("multiple_newer_stable", "1.0.2");
+      builder.serve("multiple_newer_unstable", "1.0.0");
+      builder.serve("multiple_newer_unstable", "1.0.1-unstable.1");
+      builder.serve("multiple_newer_unstable", "1.0.1-unstable.2");
+      builder.serve("no_newer", "1.0.0");
+      builder.serve("one_newer_unstable", "1.0.0");
+      builder.serve("one_newer_unstable", "1.0.1-unstable.1");
+      builder.serve("one_newer_stable", "1.0.0");
+      builder.serve("one_newer_stable", "1.0.1");
+    });
 
     // Constraint everything to the first version.
     d.appDir({
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/shows_number_of_changed_dependencies_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
index 77010e2c..ebbe2ee 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/shows_number_of_changed_dependencies_test.dart
@@ -11,11 +11,11 @@
   initConfig();
   integration("does not show how many newer versions are available for "
       "packages that are locked and not being upgraded", () {
-    servePackages([
-      packageMap("a", "1.0.0"),
-      packageMap("b", "1.0.0"),
-      packageMap("c", "2.0.0")
-    ]);
+    servePackages((builder) {
+      builder.serve("a", "1.0.0");
+      builder.serve("b", "1.0.0");
+      builder.serve("c", "2.0.0");
+    });
 
     d.appDir({
       "a": "any"
diff --git a/sdk/lib/_internal/pub/test/validator/name_test.dart b/sdk/lib/_internal/pub/test/validator/name_test.dart
index 6a70d11..17a460f 100644
--- a/sdk/lib/_internal/pub/test/validator/name_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/name_test.dart
@@ -33,6 +33,16 @@
       ]).create();
       expectNoValidationError(name);
     });
+
+    integration('has a name that starts with an underscore', () {
+      d.dir(appPath, [
+        d.libPubspec("_test_pkg", "1.0.0"),
+        d.dir("lib", [
+          d.file("_test_pkg.dart", "int i = 1;")
+        ])
+      ]).create();
+      expectNoValidationError(name);
+    });
   });
 
   group('should consider a package invalid if it', () {
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index de0d113..d98a5bf 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -1462,10 +1462,12 @@
     });
   }
 
-  var pubspec = new Pubspec(id.name, id.version, dependencies,
-      devDependencies, dependencyOverrides,
-      new PubspecEnvironment(sdkConstraint), []);
-  return new Package.inMemory(pubspec);
+  return new Package.inMemory(new Pubspec(id.name,
+      version: id.version,
+      dependencies: dependencies,
+      devDependencies: devDependencies,
+      dependencyOverrides: dependencyOverrides,
+      sdkConstraint: sdkConstraint));
 }
 
 /// Creates a new [PackageId] parsed from [text], which looks something like
diff --git a/sdk/lib/convert/ascii.dart b/sdk/lib/convert/ascii.dart
index dd3c39c..281233a 100644
--- a/sdk/lib/convert/ascii.dart
+++ b/sdk/lib/convert/ascii.dart
@@ -75,8 +75,7 @@
   const _UnicodeSubsetEncoder(this._subsetMask);
 
   List<int> convert(String string) {
-    // TODO(11971): Use Uint8List when possible.
-    List result = new List<int>(string.length);
+    List result = new Uint8List(string.length);
     for (int i = 0; i < string.length; i++) {
       var codeUnit = string.codeUnitAt(i);
       if ((codeUnit & ~_subsetMask) != 0) {
diff --git a/sdk/lib/convert/byte_conversion.dart b/sdk/lib/convert/byte_conversion.dart
index bb94991..d27b40f 100644
--- a/sdk/lib/convert/byte_conversion.dart
+++ b/sdk/lib/convert/byte_conversion.dart
@@ -78,8 +78,7 @@
   static const _INITIAL_BUFFER_SIZE = 1024;
 
   final _ChunkedConversionCallback<List<int>> _callback;
-  // TODO(11971, floitsch): use Uint8List instead of normal lists.
-  List<int> _buffer = new List<int>(_INITIAL_BUFFER_SIZE);
+  List<int> _buffer = new Uint8List(_INITIAL_BUFFER_SIZE);
   int _bufferIndex = 0;
 
   _ByteCallbackSink(void callback(List<int> accumulated))
@@ -91,8 +90,7 @@
       // Grow the buffer.
       int oldLength = _buffer.length;
       int newLength = _roundToPowerOf2(chunk.length + oldLength) * 2;
-      // TODO(11971, floitsch): use Uint8List instead of normal lists.
-      List<int> grown = new List<int>(newLength);
+      List<int> grown = new Uint8List(newLength);
       grown.setRange(0, _buffer.length, _buffer);
       _buffer = grown;
     }
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 93f1063..a047cc0 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -55,6 +55,7 @@
 library dart.convert;
 
 import 'dart:async';
+import 'dart:typed_data';
 
 part 'ascii.dart';
 part 'byte_conversion.dart';
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 9c41626..3325987 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -134,11 +134,10 @@
   _Utf8Encoder.withBufferSize(int bufferSize)
       : _buffer = _createBuffer(bufferSize);
 
-  // TODO(11971): Always use Uint8List.
   /**
    * Allow an implementation to pick the most efficient way of storing bytes.
    */
-  external static List<int> _createBuffer(int size);
+  static List<int> _createBuffer(int size) => new Uint8List(size);
 
   /**
    * Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 089bbd1..87a8b51 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -162,7 +162,8 @@
    * Returns "-0.0" for negative zero.
    *
    * For all doubles, `d`, converting to a string and parsing the string back
-   * gives the same value again: `d == double.parse(d.toString())`.
+   * gives the same value again: `d == double.parse(d.toString())` (except when
+   * `d` is NaN).
    */
   String toString();
 
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 23eda31..1733568 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -262,7 +262,7 @@
    * optionally prefixed with a minus or plus sign ('-' or '+').
    *
    * It must always be the case for an int [:n:] and radix [:r:] that
-   * [:n == parseRadix(n.toRadixString(r), r):].
+   * [:n == int.parse(n.toRadixString(r), radix: r):].
    *
    * If the [source] is not a valid integer literal, optionally prefixed by a
    * sign, the [onError] is called with the [source] as argument, and its return
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 0b55b8e..997b2c3 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -90,14 +90,7 @@
    * This constructor returns a growable list if [growable] is true;
    * otherwise, it returns a fixed-length list.
    */
-  factory List.from(Iterable other, { bool growable: true }) {
-    List<E> list = new List<E>();
-    for (E e in other) {
-      list.add(e);
-    }
-    if (growable) return list;
-    return makeListFixedLength(list);
-  }
+  external factory List.from(Iterable other, { bool growable: true });
 
   /**
    * Generates a list of values.
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index 8de6c86..acb1970 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -424,13 +424,15 @@
    * [int.parse] without a radix).
    * If that fails, it tries to parse the [input] as a double (similar to
    * [double.parse]).
-   * If that fails, too, it invokes [onError] with [input].
+   * If that fails, too, it invokes [onError] with [input], and the result
+   * of that invocation becomes the result of calling `parse`.
    *
    * If no [onError] is supplied, it defaults to a function that throws a
    * [FormatException].
    *
    * For any number `n`, this function satisfies
-   * `identical(n, num.parse(n.toString()))`.
+   * `identical(n, num.parse(n.toString()))` (except when `n` is a NaN `double`
+   * with a payload).
    */
   static num parse(String input, [num onError(String input)]) {
     String source = input.trim();
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index ebc6c20..384b183 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -409,11 +409,12 @@
 
   /**
    * Returns a new string in which  the first occurence of [from] in this string
-   * is replaced with [to]:
+   * is replaced with [to], starting from [startIndex]:
    *
    *     '0.0001'.replaceFirst(new RegExp(r'0'), ''); // '.0001'
+   *     '0.0001'.replaceFirst(new RegExp(r'0'), '7', 1); // '0.7001'
    */
-  String replaceFirst(Pattern from, String to);
+  String replaceFirst(Pattern from, String to, [int startIndex = 0]);
 
   /**
    * Replaces all substrings that match [from] with [replace].
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 4ac855c..dce4606 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -9630,7 +9630,7 @@
    * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
-    this.insertAdjacentText('beforeend', text);
+    this.append(new Text(text));
   }
 
   /**
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index b8ea186..ff1d33d 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -10413,7 +10413,7 @@
    * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
-    this.insertAdjacentText('beforeend', text);
+    this.append(new Text(text));
   }
 
   /**
@@ -28752,10 +28752,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.$_createObjectURL_1_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.$_createObjectURL_2_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.$_createObjectURL_3_Callback(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -39021,3 +39021,7 @@
 void _initializeCustomElement(Element e) {
   _Utils.initializeCustomElement(e);
 }
+
+// Class for unsupported native browser 'DOM' objects.
+class _UnsupportedBrowserObject extends NativeFieldWrapperClass2 {
+}
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 6f5eb56..f0c4282 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -168,10 +168,10 @@
    *
    * By default the following headers are in this set:
    *
-   *    Content-Type: text/plain; charset=utf-8
-   *    X-Frame-Options: SAMEORIGIN
-   *    X-Content-Type-Options: nosniff
-   *    X-XSS-Protection: 1; mode=block
+   *     Content-Type: text/plain; charset=utf-8
+   *     X-Frame-Options: SAMEORIGIN
+   *     X-Content-Type-Options: nosniff
+   *     X-XSS-Protection: 1; mode=block
    *
    * If the `Server` header is added here and the `serverHeader` is set as
    * well then the value of `serverHeader` takes precedence.
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index ab52a21..e0557e0 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1585,12 +1585,12 @@
   }
 
   Future<_ConnectionInfo> connect(String uriHost,
-                                   int uriPort,
-                                   _Proxy proxy,
-                                   _HttpClient client) {
+                                  int uriPort,
+                                  _Proxy proxy,
+                                  _HttpClient client) {
     if (hasIdle) {
       var connection = takeIdle();
-      client._updateTimers();
+      client._connectionsChanged();
       return new Future.value(new _ConnectionInfo(connection, proxy));
     }
     if (client.maxConnectionsPerHost != null &&
@@ -1640,6 +1640,7 @@
 
 class _HttpClient implements HttpClient {
   bool _closing = false;
+  bool _closingForcefully = false;
   final Map<String, _ConnectionTarget> _connectionTargets
       = new HashMap<String, _ConnectionTarget>();
   final List<_Credentials> _credentials = [];
@@ -1650,8 +1651,6 @@
   Duration _idleTimeout = const Duration(seconds: 15);
   Function _badCertificateCallback;
 
-  Timer _noActiveTimer;
-
   Duration get idleTimeout => _idleTimeout;
 
   int maxConnectionsPerHost;
@@ -1663,7 +1662,7 @@
   void set idleTimeout(Duration timeout) {
     _idleTimeout = timeout;
     for (var c in _connectionTargets.values) {
-      for (var idle in c.idle) {
+      for (var idle in c._idle) {
         // Reset timer. This is fine, as it's not happening often.
         idle.stopTimer();
         idle.startTimer();
@@ -1724,7 +1723,8 @@
 
   void close({bool force: false}) {
     _closing = true;
-    _connectionTargets.values.toList().forEach((c) => c.close(force));
+    _closingForcefully = force;
+    _closeConnections(_closingForcefully);
     assert(!_connectionTargets.values.any((s) => s.hasIdle));
     assert(!force ||
         !_connectionTargets.values.any((s) => s._active.isNotEmpty));
@@ -1827,7 +1827,7 @@
   // Return a live connection to the idle pool.
   void _returnConnection(_HttpClientConnection connection) {
     _connectionTargets[connection.key].returnConnection(connection);
-    _updateTimers();
+    _connectionsChanged();
   }
 
   // Remove a closed connnection from the active set.
@@ -1839,28 +1839,19 @@
       if (connectionTarget.isEmpty) {
         _connectionTargets.remove(connection.key);
       }
-      _updateTimers();
+      _connectionsChanged();
     }
   }
 
-  void _updateTimers() {
-    bool hasActive = _connectionTargets.values.any((t) => t.hasActive);
-    if (!hasActive) {
-      bool hasIdle = _connectionTargets.values.any((t) => t.hasIdle);
-      if (hasIdle && _noActiveTimer == null) {
-        _noActiveTimer = new Timer(const Duration(milliseconds: 100), () {
-          _noActiveTimer = null;
-          bool hasActive =
-              _connectionTargets.values.any((t) => t.hasActive);
-          if (!hasActive) {
-            close();
-            _closing = false;
-          }
-        });
-      }
-    } else if (_noActiveTimer != null) {
-      _noActiveTimer.cancel();
-      _noActiveTimer = null;
+  void _connectionsChanged() {
+    if (_closing) {
+      _closeConnections(_closingForcefully);
+    }
+  }
+
+  void _closeConnections(bool force) {
+    for (var connectionTarget in _connectionTargets.values.toList()) {
+      connectionTarget.close(force);
     }
   }
 
@@ -2016,7 +2007,6 @@
   final _HttpParser _httpParser;
   int _state = _IDLE;
   StreamSubscription _subscription;
-  Timer _idleTimer;
   bool _idleMark = false;
   Future _streamFuture;
 
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index 708af8a..872cd32 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -372,6 +372,8 @@
         _upgrade(request, _protocolSelector)
             .then((WebSocket webSocket) => _controller.add(webSocket))
             .catchError(_controller.addError);
+    }, onDone: () {
+      _controller.close();
     });
 
     return _controller.stream;
diff --git a/sdk/lib/profiler/profiler.dart b/sdk/lib/profiler/profiler.dart
index e30fd1d..1834f37b 100644
--- a/sdk/lib/profiler/profiler.dart
+++ b/sdk/lib/profiler/profiler.dart
@@ -77,9 +77,10 @@
   final String description;
 
   Metric(this.name, this.description) {
-    if (name.contains('/')) {
+    if ((name == 'vm') || name.contains('/')) {
       throw new ArgumentError('Invalid Metric name.');
     }
+
   }
 
   Map _toJSON();
diff --git a/site/try/app.yaml b/site/try/app.yaml
index e8044ff..2e53e66 100644
--- a/site/try/app.yaml
+++ b/site/try/app.yaml
@@ -102,36 +102,6 @@
   upload: index.html
   secure: always
 
-# The nossl file below help work around bugs/features in interaction between
-# AppEngine and AppCache. When a return user goes to http://try.dartlang.org/
-# (no SSL), AppCache will serve index.html from cache, try to fetch the old
-# manifest (nossl.appcache) and the files listed in the manifest. In additation
-# the files listed in the manifest, it will also fetch index.html, as it is the
-# master. However, we want index.html to be redirected to the SSL version, and
-# AppCache sees this redirection as a network error. When an error occurs,
-# AppCache will keep serving the old page. So we configure nossl.appcache to
-# provide fallbacks for index.html and leap.dart.js. The fallback for
-# leap.dart.js is nossl.js which will take care of redirecting to
-# https://try.dartlang.org/ (with SSL) using JavaScript.  Unfortunately, Chrome
-# seems to keep the old version of index.html cached indefinitely. The only way
-# to avoid that appears to serve up a different index.html depending on if it
-# is a secure connection or not. This would require a Python script, and
-# something we may consider implementing in the future.
-- url: /nossl.appcache
-  static_files: nossl.appcache
-  upload: nossl.appcache
-  secure: optional
-
-- url: /nossl.js
-  static_files: nossl.js
-  upload: nossl.js
-  secure: optional
-
-- url: /nossl.html
-  static_files: nossl.html
-  upload: nossl.html
-  secure: optional
-
 - url: /ssl.appcache
   static_files: ssl.appcache
   upload: ssl.appcache
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index 2a98ab9..d91ab93 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -145,28 +145,6 @@
           ],
         },
         {
-          'action_name': 'nossl_appcache',
-          'message': 'Creating nossl.appcache',
-          'inputs': [
-            'add_time_stamp.py',
-            'nossl.appcache',
-            'nossl.js',
-            'nossl.html',
-            'build_try.gyp', # If the list of files changed.
-          ],
-          'outputs': [
-            '<(SHARED_INTERMEDIATE_DIR)/nossl.appcache',
-          ],
-          # Try Dart! uses AppCache. Cached files are only validated when the
-          # manifest changes (not its timestamp, but its actual contents).
-          'action': [
-            'python',
-            'add_time_stamp.py',
-            'nossl.appcache',
-            '<(SHARED_INTERMEDIATE_DIR)/nossl.appcache',
-          ],
-        },
-        {
           'action_name': 'ssl_appcache',
           'message': 'Creating ssl.appcache',
           'inputs': [
@@ -214,10 +192,7 @@
           'files': [
             'app.yaml',
             '<@(try_dart_static_files)',
-            '<(SHARED_INTERMEDIATE_DIR)/nossl.appcache',
             '<(SHARED_INTERMEDIATE_DIR)/ssl.appcache',
-            'nossl.js',
-            'nossl.html',
           ],
         },
       ],
diff --git a/site/try/index.html b/site/try/index.html
index c0a703a..09ad1b3 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -30,7 +30,7 @@
   display: none;
   max-width: 70%;
 }
-a:hover.diagnostic>span {
+a:hover.diagnostic>span.diagnostic, a:hover.diagnostic>span.alert {
   display: block;
   position: absolute;
   /* left: 1em; */
diff --git a/site/try/poi/diff.dart b/site/try/poi/diff.dart
new file mode 100644
index 0000000..a2e17eb
--- /dev/null
+++ b/site/try/poi/diff.dart
@@ -0,0 +1,134 @@
+// 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.poi.diff;
+
+import 'dart:async' show
+    Completer,
+    Future,
+    Stream;
+
+import 'dart:convert' show
+    LineSplitter,
+    UTF8;
+
+import 'package:compiler/compiler.dart' as api;
+
+import 'package:compiler/implementation/dart2jslib.dart' show
+    Compiler,
+    Enqueuer,
+    QueueFilter,
+    Script,
+    WorkItem;
+
+import 'package:compiler/implementation/elements/visitor.dart' show
+    ElementVisitor;
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    AbstractFieldElement,
+    ClassElement,
+    CompilationUnitElement,
+    Element,
+    ElementCategory,
+    FunctionElement,
+    LibraryElement,
+    ScopeContainerElement;
+
+import 'package:compiler/implementation/elements/modelx.dart' as modelx;
+
+import 'package:compiler/implementation/dart_types.dart' show
+    DartType;
+
+import 'package:compiler/implementation/scanner/scannerlib.dart' show
+    EOF_TOKEN,
+    ErrorToken,
+    IDENTIFIER_TOKEN,
+    KEYWORD_TOKEN,
+    PartialClassElement,
+    PartialElement,
+    Token;
+
+import 'package:compiler/implementation/source_file.dart' show
+    StringSourceFile;
+
+class Difference {
+  final Element before;
+  final Element after;
+  Token token;
+
+  Difference(this.before, this.after);
+
+  String toString() {
+    if (before == null) return 'Added($after)';
+    if (after == null) return 'Removed($before)';
+    return 'Modified($after -> $before)';
+  }
+}
+
+List<Difference> computeDifference(
+    ScopeContainerElement before,
+    ScopeContainerElement after) {
+  Map<String, Element> beforeMap = <String, Element>{};
+  before.forEachLocalMember((Element element) {
+    beforeMap[element.name] = element;
+  });
+  List<Difference> modifications = <Difference>[];
+  List<Difference> potentiallyChanged = <Difference>[];
+  after.forEachLocalMember((Element element) {
+    Element existing = beforeMap.remove(element.name);
+    if (existing == null) {
+      modifications.add(new Difference(null, element));
+    } else {
+      potentiallyChanged.add(new Difference(existing, element));
+    }
+  });
+
+  modifications.addAll(
+      beforeMap.values.map((Element element) => new Difference(element, null)));
+
+  modifications.addAll(
+      potentiallyChanged.where(areDifferentElements));
+
+  return modifications;
+}
+
+bool areDifferentElements(Difference diff) {
+  Element beforeElement = diff.before;
+  Element afterElement = diff.after;
+  var before = (beforeElement is modelx.VariableElementX)
+      ? beforeElement.variables : beforeElement;
+  var after = (afterElement is modelx.VariableElementX)
+      ? afterElement.variables : afterElement;
+  if (before is PartialElement && after is PartialElement) {
+    Token beforeToken = before.beginToken;
+    Token afterToken = after.beginToken;
+    Token stop = before.endToken;
+    int beforeKind = beforeToken.kind;
+    int afterKind = afterToken.kind;
+    while (beforeKind != EOF_TOKEN && afterKind != EOF_TOKEN) {
+
+      if (beforeKind != afterKind) {
+        diff.token = afterToken;
+        return true;
+      }
+
+      if (beforeToken is! ErrorToken && afterToken is! ErrorToken) {
+        if (beforeToken.value != afterToken.value) {
+          diff.token = afterToken;
+          return true;
+        }
+      }
+
+      if (beforeToken == stop) return false;
+
+      beforeToken = beforeToken.next;
+      afterToken = afterToken.next;
+      beforeKind = beforeToken.kind;
+      afterKind = afterToken.kind;
+    }
+    return beforeKind != afterKind;
+  }
+  print("$before isn't a PartialElement");
+  return true;
+}
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index 2c85c8b..3ba69f6 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -41,13 +41,17 @@
     ElementVisitor;
 
 import 'package:compiler/implementation/elements/elements.dart' show
+    AbstractFieldElement,
     ClassElement,
     CompilationUnitElement,
     Element,
     ElementCategory,
+    FunctionElement,
     LibraryElement,
     ScopeContainerElement;
 
+import 'package:compiler/implementation/elements/modelx.dart' as modelx;
+
 import 'package:compiler/implementation/dart_types.dart' show
     DartType;
 
@@ -365,7 +369,7 @@
           indented.write('"kind": "imports",\n');
           indented.write('"members": [');
           indentationLevel++;
-          e.importScope.importScope.values.forEach(forEach);
+          importScope(e).importScope.values.forEach(forEach);
           indentationLevel--;
           buffer.write('\n');
           indented.write('],\n');
@@ -380,7 +384,7 @@
         },
         serializeMembers: () {
           isFirst = true;
-          e.localScope.values.forEach(forEach);
+          localScope(e).values.forEach(forEach);
         });
   }
 
@@ -467,6 +471,10 @@
     e.enclosingElement.accept(this);
   }
 
+  void visitAbstractFieldElement(AbstractFieldElement e) {
+    throw new UnsupportedError('AbstractFieldElement cannot be serialized.');
+  }
+
   void serialize(
       Element element,
       {bool omitEnclosing: true,
@@ -474,6 +482,34 @@
        void serializeEnclosing(),
        String kind,
        String name}) {
+    if (element.isAbstractField) {
+      AbstractFieldElement field = element;
+      FunctionElement getter = field.getter;
+      FunctionElement setter = field.setter;
+      if (getter != null) {
+        serialize(
+            getter,
+            omitEnclosing: omitEnclosing,
+            serializeMembers: serializeMembers,
+            serializeEnclosing: serializeEnclosing,
+            kind: kind,
+            name: name);
+      }
+      if (setter != null) {
+        if (getter != null) {
+          buffer.write(',\n');
+          indented;
+        }
+        serialize(
+            getter,
+            omitEnclosing: omitEnclosing,
+            serializeMembers: serializeMembers,
+            serializeEnclosing: serializeEnclosing,
+            kind: kind,
+            name: name);
+      }
+      return;
+    }
     DartType type;
     int category = element.kind.category;
     if (category == ElementCategory.FUNCTION ||
@@ -529,3 +565,9 @@
     indented.write('}');
   }
 }
+
+modelx.ScopeX localScope(modelx.LibraryElementX element) => element.localScope;
+
+modelx.ImportScope importScope(modelx.LibraryElementX element) {
+  return element.importScope;
+}
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index ad3bbc8..b234a2a 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -33,6 +33,8 @@
 
 import 'settings.dart' show
     alwaysRunInWorker,
+    alwaysRunInIframe,
+    communicateViaBlobs,
     incrementalCompilation,
     minified,
     onlyAnalyze,
@@ -110,6 +112,8 @@
     }
     interaction.compilationStarting();
     compilerPort.send([['options', options], receivePort.sendPort]);
+    compilerPort.send([['communicateViaBlobs', communicateViaBlobs.value],
+                       receivePort.sendPort]);
     receivePort.listen(onMessage);
     compilerPort.send([source, receivePort.sendPort]);
   }
@@ -214,7 +218,8 @@
           ..appendText('\n');
     }
     interaction.aboutToRun();
-    if (usesDartHtml && !alwaysRunInWorker) {
+    if (alwaysRunInIframe.value ||
+        usesDartHtml && !alwaysRunInWorker) {
       retryInIframe();
     } else {
       runInWorker(url, onError);
diff --git a/site/try/src/compiler_isolate.dart b/site/try/src/compiler_isolate.dart
index adf42a7..f6265ae 100644
--- a/site/try/src/compiler_isolate.dart
+++ b/site/try/src/compiler_isolate.dart
@@ -23,6 +23,8 @@
 Uri sdkLocation;
 List options = [];
 
+var communicateViaBlobs;
+
 var cachedCompiler;
 
 void notifyDartHtml(SendPort port) {
@@ -57,6 +59,8 @@
     var data = (source.length > 1) ? source[1] : null;
     if (messageType == 'options') {
       options = data as List;
+    } if (messageType == 'communicateViaBlobs') {
+      communicateViaBlobs = data as bool;
     }
     return;
   }
@@ -128,13 +132,17 @@
               'Compiled ${source.length}/${charactersRead} characters Dart'
               ' -> ${js.length} characters.',
               compiler.Diagnostic.VERBOSE_INFO);
-      try {
-        // At least Safari and Firefox do not support creating an
-        // object URL from a web worker.  MDN claims that it will be
-        // supported in Firefox 21.
-        url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
-      } catch (_) {
-        // Ignored.
+      if (communicateViaBlobs) {
+        try {
+          // At least Safari and Firefox do not support creating an
+          // object URL from a web worker.  MDN claims that it will be
+          // supported in Firefox 21.
+          url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
+        } catch (_) {
+          // Ignored.
+        }
+      } else  {
+        url = null;
       }
       if (url != null) {
         replyTo.send(['url', url]);
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index edb5f7e..b80296b 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -161,14 +161,15 @@
         } else {
           alert = info(message);
         }
-        Element parent = node.parent;
+        Element parent = node.parentNode;
         if (parent.classes.contains("diagnostic") &&
             !interaction.oldDiagnostics.contains(parent)) {
           Element other = parent.firstChild;
           other.remove();
-          SpanElement wrapper = new SpanElement();
-          wrapper.style
-              ..fontWeight = 'normal';
+          SpanElement wrapper = new SpanElement()
+            ..classes.add('diagnostic')
+            ..style.fontWeight = 'normal';
+
           var root = getShadowRoot(wrapper);
           if (root is ShadowRoot) {
             // When https://code.google.com/p/chromium/issues/detail?id=313458
diff --git a/site/try/src/html_to_text.dart b/site/try/src/html_to_text.dart
index 79660cb..532cad6 100644
--- a/site/try/src/html_to_text.dart
+++ b/site/try/src/html_to_text.dart
@@ -32,7 +32,8 @@
   // div element.
   if (element.classes.contains('dart-code-completion')) return false;
 
-  return element.getComputedStyle().display != 'inline';
+  var display = element.getComputedStyle().display;
+  return display != 'inline' && display != 'none';
 }
 
 /// Writes the text of [root] to [buffer]. Keeps track of [selection] and
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 5891551..7d704e8 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -21,6 +21,8 @@
 import 'dart:collection' show
     Queue;
 
+import 'dart:js' as hack;
+
 import 'package:compiler/implementation/scanner/scannerlib.dart' show
     BeginGroupToken,
     EOF_TOKEN,
@@ -82,7 +84,8 @@
 import 'shadow_root.dart' show
     getShadowRoot,
     getText,
-    setShadowRoot;
+    setShadowRoot,
+    containsNode;
 
 import 'iframe_error_handler.dart' show
     ErrorMessage;
@@ -459,7 +462,7 @@
         state = previousLine.getAttribute('dart-state');
       }
 
-      node.parent.insertAllBefore(
+      node.parentNode.insertAllBefore(
           createHighlightedNodes(trySelection, currentText, state),
           node);
       node.remove();
@@ -476,7 +479,7 @@
           ..addAll(nodes);
     }
 
-    if (mainEditorPane.contains(trySelection.anchorNode)) {
+    if (containsNode(mainEditorPane, trySelection.anchorNode)) {
       // Sometimes the anchor node is removed by the above call. This has
       // only been observed in Firefox, and is hard to reproduce.
       trySelection.adjust(selection);
@@ -1217,7 +1220,7 @@
                              TrySelection selection,
                              Set<Node> normalizedNodes) {
   for (Node node in record.addedNodes) {
-    if (node.parent == null) continue;
+    if (node.parentNode == null) continue;
     normalizedNodes.add(findLine(node));
     if (node is Text) continue;
     StringBuffer buffer = new StringBuffer();
@@ -1238,7 +1241,7 @@
     }
     normalizedNodes.add(line);
   }
-  if (record.type == "characterData" && record.target.parent != null) {
+  if (record.type == "characterData" && record.target.parentNode != null) {
     // At least Firefox sends a "characterData" record whose target is the
     // deleted text node. It also sends a record where "removedNodes" isn't
     // empty whose target is the parent (which we are interested in).
@@ -1250,7 +1253,7 @@
 // If no such parent exists, return mainEditorPane if it is a parent.
 // Otherwise return [node].
 Node findLine(Node node) {
-  for (Node n = node; n != null; n = n.parent) {
+  for (Node n = node; n != null; n = n.parentNode) {
     if (n is Element && n.classes.contains('lineNumber')) return n;
     if (n == mainEditorPane) return n;
   }
@@ -1268,7 +1271,7 @@
   Node line = findLine(text);
   return
       line.nextNode == null &&
-      text.parent.nextNode == null &&
+      text.parentNode.nextNode == null &&
       offset == text.length;
 }
 
@@ -1307,11 +1310,18 @@
     // Safari can also reach this code, but the offset isn't wrong, just
     // inconsistent.  After moving the cursor back and forth, Safari will make
     // the offset relative to a text node.
-    selection
-        ..modify('move', 'backward', 'character')
-        ..modify('move', 'forward', 'character');
-    print('Selection adjusted $node@$offset -> '
-          '${selection.anchorNode}@${selection.anchorOffset}.');
+    // TODO(ahe): Come up with a better way to encapsulate the method below.
+    var selectionProxy = new hack.JsObject.fromBrowserObject(selection);
+    var modify = selectionProxy['modify'];
+    if (modify != null) {
+      // IE doesn't support selection.modify, but it's okay since the code
+      // above is for Firefox, IE doesn't have problems with anchorOffset.
+      selection
+          ..modify('move', 'backward', 'character')
+          ..modify('move', 'forward', 'character');
+      print('Selection adjusted $node@$offset -> '
+            '${selection.anchorNode}@${selection.anchorOffset}.');
+    }
   }
 }
 
diff --git a/site/try/src/leap.dart b/site/try/src/leap.dart
index 4a9d0c6..626048f 100644
--- a/site/try/src/leap.dart
+++ b/site/try/src/leap.dart
@@ -31,6 +31,19 @@
 import 'user_option.dart' show
     UserOption;
 
+import 'settings.dart' show
+    alwaysRunInIframe,
+    communicateViaBlobs;
+
+bool isBrowserIE() {
+  return window.navigator.userAgent.contains(' Trident/7.0;');
+}
+
+initHiddenSettings() {
+  alwaysRunInIframe.setIfNotInitialized(isBrowserIE);
+  communicateViaBlobs.setIfNotInitialized(() => !isBrowserIE());
+}
+
 int count = 0;
 
 main() {
@@ -39,6 +52,8 @@
     currentSource = EXAMPLE_HELLO;
   }
 
+  initHiddenSettings();
+
   buildUI();
   ReceivePort port = new ReceivePort();
   Isolate.spawnUri(
diff --git a/site/try/src/messages.dart b/site/try/src/messages.dart
index 62f4fb4..bbcdda5 100644
--- a/site/try/src/messages.dart
+++ b/site/try/src/messages.dart
@@ -8,6 +8,12 @@
   'alwaysRunInWorker':
     'Always run in Worker thread.',
 
+  'alwaysRunInIframe':
+    'Always run in inline frame.',
+
+  'communicateViaBlobs':
+    'Use blobs to send source code between components.',
+
   'verboseCompiler':
     'Verbose compiler output.',
 
diff --git a/site/try/src/settings.dart b/site/try/src/settings.dart
index 9778206..b78aa53 100644
--- a/site/try/src/settings.dart
+++ b/site/try/src/settings.dart
@@ -95,6 +95,12 @@
 
 const BooleanUserOption live = const BooleanUserOption('live', isHidden: true);
 
+const BooleanUserOption alwaysRunInIframe =
+    const BooleanUserOption('alwaysRunInIframe', isHidden: true);
+
+const BooleanUserOption communicateViaBlobs =
+    const BooleanUserOption('communicateViaBlobs', isHidden: true);
+
 const List<UserOption> options = const <UserOption>[
     _alwaysRunInWorker,
     _verboseCompiler,
@@ -108,4 +114,6 @@
     _codeFont,
     _theme,
     _currentSample,
+    alwaysRunInIframe,
+    communicateViaBlobs,
   ];
diff --git a/site/try/src/shadow_root.dart b/site/try/src/shadow_root.dart
index 110efb3..20ee0b2 100644
--- a/site/try/src/shadow_root.dart
+++ b/site/try/src/shadow_root.dart
@@ -49,6 +49,16 @@
   return '$buffer';
 }
 
+/// Element.contains(n) doesn't work when n is node(Text) in IE,
+/// so this is a brute-force implementation of contains.
+bool containsNode(parent, child) {
+  var p = child;
+  while (p != null && p != parent) {
+    p = p.parentNode;
+  }
+  return p != null;
+}
+
 /// Position [walker] at the last predecessor (that is, child of child of
 /// child...) of [node]. The next call to walker.nextNode will return the first
 /// node after [node].
@@ -60,7 +70,7 @@
   for (Node current = walker.nextNode();
        current != null;
        current = walker.nextNode()) {
-    if (!node.contains(current)) {
+    if (!containsNode(node, current)) {
       walker.previousNode();
       return;
     }
@@ -77,18 +87,19 @@
         node is Element &&
         node.getAttribute('try-dart-shadow-root') != null) {
       skip(node, walker);
-    }
-    int action = f(node);
-    switch (action) {
-      case WALKER_RETURN:
-        return;
-      case WALKER_SKIP_NODE:
-        skip(node, walker);
-        break;
-      case WALKER_NEXT:
-        break;
-      default:
-        throw 'Unexpected action returned from [f]: $action';
+    } else {
+      int action = f(node);
+      switch (action) {
+        case WALKER_RETURN:
+          return;
+        case WALKER_SKIP_NODE:
+          skip(node, walker);
+          break;
+        case WALKER_NEXT:
+          break;
+        default:
+          throw 'Unexpected action returned from [f]: $action';
+      }
     }
   }
 }
diff --git a/site/try/src/user_option.dart b/site/try/src/user_option.dart
index 25c0f0f..532c3f7 100644
--- a/site/try/src/user_option.dart
+++ b/site/try/src/user_option.dart
@@ -35,6 +35,12 @@
   void set value(newValue) {
     storage[name] = newValue;
   }
+
+  void setIfNotInitialized(newValueEvaluator()) {
+    if (storage[name] == null) {
+      value = newValueEvaluator();
+    }
+  }
 }
 
 class BooleanUserOption extends UserOption {
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 076b009..8c520db 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -167,8 +167,6 @@
 LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError
 LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/Node/childNodes_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
@@ -176,17 +174,10 @@
 LibTest/html/Node/dispatchEvent_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/Node/nodes_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning
-LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -206,9 +197,7 @@
 WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement-namespace_t01: StaticWarning # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-appendChild_t02: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-contains_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -270,3 +259,70 @@
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
+
+# co19-roll r761
+LayoutTests/fast/animation/request-animation-frame-missing-arguments_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/backgrounds/001_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-createImageBitmap-animated_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/dom/text-api-arguments_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_location_path_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_predicate_list_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/4XPath/Core/test_step_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/ambiguous-operators_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/attr-namespace_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/attribute-node-predicate_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/complex-id_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/detached-subtree-invalidate-iterator_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/evaluator-exceptions_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/id-path_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/id-simple_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/invalid-resolver_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/name-null-namespace_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xpath/position_t01: CompileTimeError # co19 issue 703
+LayoutTests/fast/xpath/reverse-axes_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xsl/default-html_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xsl/extra-lf-at-end_t01: StaticWarning # co19 issue 703
+LayoutTests/fast/xsl/xslt-string-parameters_t01: StaticWarning # co19 issue 703
+LibTest/isolate/ReceivePort/any_A01_t02: StaticWarning # co19 issue 704.
+WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html-imports/link-import_t01: StaticWarning # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/pattern_attribute_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/range_t02: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/required_attribute_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/search_input_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/semantics/tabular-data/the-caption-element/caption_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: StaticWarning # co19 issue 701
+WebPlatformTest/html/syntax/parsing/math-parse_t01: StaticWarning # co19 issue 701
+WebPlatformTest/html/syntax/parsing/math-parse_t03: StaticWarning # co19 issue 701
+WebPlatformTest/webstorage/storage_builtins_t01: CompileTimeError # co19 issue 702
+WebPlatformTest/webstorage/storage_clear_t01: CompileTimeError # co19 issue 702
+WebPlatformTest/webstorage/storage_local_key_t01: StaticWarning # co19 issue 702
+WebPlatformTest/webstorage/storage_session_key_t01: StaticWarning # co19 issue 702
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index dc691b9..248b79b 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -170,8 +170,6 @@
 LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError
 LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/Node/childNodes_A01_t02: StaticWarning # co19-roll r722: Please triage this failure.
@@ -179,17 +177,10 @@
 LibTest/html/Node/dispatchEvent_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LibTest/html/Node/nodes_A01_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: StaticWarning # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: StaticWarning
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: StaticWarning
-LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -209,9 +200,7 @@
 WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement-namespace_t01: StaticWarning # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-appendChild_t02: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-contains_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -272,3 +261,70 @@
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
+
+# co19-roll r761.
+LayoutTests/fast/animation/request-animation-frame-missing-arguments_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/backgrounds/001_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-createImageBitmap-animated_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/dom/text-api-arguments_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: StaticWarning # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_location_path_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_predicate_list_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/4XPath/Core/test_step_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/ambiguous-operators_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/attr-namespace_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/attribute-node-predicate_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/complex-id_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/detached-subtree-invalidate-iterator_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/evaluator-exceptions_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/id-path_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/id-simple_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/invalid-resolver_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/name-null-namespace_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xpath/position_t01: CompileTimeError # co19 issue 703.
+LayoutTests/fast/xpath/reverse-axes_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xsl/default-html_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xsl/extra-lf-at-end_t01: StaticWarning # co19 issue 703.
+LayoutTests/fast/xsl/xslt-string-parameters_t01: StaticWarning # co19 issue 703.
+LibTest/isolate/ReceivePort/any_A01_t02: StaticWarning # co19 issue 704.
+WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html-imports/link-import_t01: StaticWarning # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/password_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/pattern_attribute_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/range_t02: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/required_attribute_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/search_input_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/semantics/tabular-data/the-caption-element/caption_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: StaticWarning # co19 issue 701.
+WebPlatformTest/html/syntax/parsing/math-parse_t01: StaticWarning # co19 issue 701.
+WebPlatformTest/html/syntax/parsing/math-parse_t03: StaticWarning # co19 issue 701.
+WebPlatformTest/webstorage/storage_builtins_t01: CompileTimeError, StaticWarning # co19 issue 702.
+WebPlatformTest/webstorage/storage_clear_t01: CompileTimeError, StaticWarning # co19 issue 702.
+WebPlatformTest/webstorage/storage_local_key_t01: StaticWarning # co19 issue 702.
+WebPlatformTest/webstorage/storage_session_key_t01: StaticWarning # co19 issue 702.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index aa8bb86..653463b 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -25,16 +25,9 @@
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
 
-LibTest/core/Uri/authority_A01_t01: RuntimeError     # co19 issue 696
-LibTest/core/Uri/hasAuthority_A01_t01: RuntimeError  # co19 issue 696
-
-LibTest/core/Uri/fragment_A01_t01: Fail # assumes space valid in fragment.
-
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: Fail # co19 issue 687
 LibTest/async/Stream/asBroadcastStream_A02_t01: Fail # co19 issue 687
 
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # co19-roll r587: Please triage this failure
-Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # co19-roll r587: Please triage this failure
 
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t04: RuntimeError # co19-roll r607: Please triage this failure
@@ -82,8 +75,9 @@
 LibTest/isolate/SendPort/send_A03_t01: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A03_t02: Fail # Co19 issue 639
 
-LibTest/isolate/ReceivePort/any_A01_t02: RuntimeError # co19 issue 676
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
+Utils/tests/Expect/listEquals_A01_t02: RuntimeError # CO19 issue 707
+Utils/tests/Expect/listEquals_A03_t01: RuntimeError # CO19 issue 707
 
 [ $runtime == dartium || $compiler == dart2js ]
 LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
@@ -93,3 +87,4 @@
 [ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
+LibTest/isolate/ReceivePort/any_A01_t02: RuntimeError # co19 issue 704
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index d4a089e..ecdd0fe 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -18,6 +18,10 @@
 Language/07_Classes/07_Classes_A13_t08: Fail # Missing CT error on member with same name a type parameter
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
 
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # 13363
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # 13363
+
+
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
 
 Language/12_Expressions/12_Instance_Creation/1_New_A04_t02: RuntimeError # co19-roll r607: Please triage this failure
@@ -64,7 +68,6 @@
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
-LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -82,8 +85,6 @@
 Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A05_t02: fail # co19-roll r546: Please triage this failure
 Language/05_Variables/05_Variables_A11_t01: fail
-Language/07_Classes/6_Constructors/2_Factories_A10_t01: crash # co19-roll r587: Please triage this failure
-Language/07_Classes/6_Constructors/2_Factories_A10_t04: crash # co19-roll r587: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index ca3c90b..30100ce 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -16,13 +16,13 @@
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
-LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # Issue 18549
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # Issue 18549
-
 LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
 LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
 Language/05_Variables/05_Variables_A11_t01: fail # Please triage this issue.
 
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # 13363
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # 13363
+
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: MissingCompileTimeError # co19-roll r607: Please triage this failure
 Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
 Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
@@ -68,7 +68,6 @@
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 
-LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 LibTest/html/IFrameElement/enteredView_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
 Language/12_Expressions/07_Maps_A11_t01: CompileTimeError # Maybe ok. Issue 17207
@@ -79,11 +78,7 @@
 LibTest/math/Rectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError, Pass # co19-roll r706: Please triage this failure.
 
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: CompileTimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/Node-replaceChild_t01: CompileTimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
@@ -1553,6 +1548,8 @@
 LibTest/async/Stream/listen_A05_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
+WebPlatformTest/webstorage/storage_clear_t01: CompileTimeError # co19 issue 702
+WebPlatformTest/webstorage/storage_builtins_t01: CompileTimeError # co19 issue 702
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 LibTest/async/DeferredLibrary/*: Skip # Issue 17458
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index ffa33c5..8af447f 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -5,15 +5,11 @@
 [ $compiler == none && $runtime == drt ]
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
-[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid || $runtime == drt) ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 LibTest/html/Window/document_A01_t01: RuntimeError # Issue 20146
 LibTest/html/Window/postMessage_A01_t02: RuntimeError # Issue 20146
 LibTest/html/Window/moveBy_A01_t01: RuntimeError # Issue 20146
-
-[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
-# Temporarily skip tests, to narrow down new breakage to a particular test by binary search:
 LayoutTests/fast/dom: Skip # Unknown tests are breaking the test infrastructure. Issue 18558
-
 LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Breaks the test infrastructure. Issue 18558
 LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Breaks the test infrastructure. Issue 18558.
 # Only one of the next two causes the problem - not sure which.
@@ -26,8 +22,6 @@
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
-LibTest/typed_data/Int64List/buffer_A01_t01: Fail # Issue co19 694
-LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
@@ -430,6 +424,169 @@
 WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # co19-roll r738: Please triage this failure.
 
+# co19-roll r761
+LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/borders/border-radius-child_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/alpha_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-2d-imageData-create-nonfinite_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: Skip # Times out. co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/drawImage-with-broken-image_t01: Timeout, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/linearGradient-infinite-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/radialGradient-infinite-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: Skip # Causes following tests to fail. co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/winding-enumeration_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/content/content-none_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/content/content-normal_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/media-query-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/pseudo-any_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Skip # Times out. co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Skip # Times out. co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/style-element-process-crash_t01: Skip # Times out. co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/attr-namespace_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/position_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError # co19-roll r761: Please triage this failure.
+LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/dom/Node-replaceChild_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html-imports/link-import_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html-imports/link-import_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html-imports/loading-import_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/email_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/storage_clear_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/storage_local_key_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
+WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 # New Dartium checked failures on new co19 browser tests in co19 revision 706.
 LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -455,9 +612,120 @@
 LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 
+# co19-roll r761
+LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/name-null-namespace_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/xsl/default-html_t01: RuntimeError # co19-roll r761: Please triage this failure.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: Skip # Issue 20540.
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
 LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 19127.
+LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
+
+[ $compiler == none && $runtime == dartium && ($mode != debug || $system != macos) ]
+LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 47e138d..2f8f992 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -18,8 +18,6 @@
 LibTest/core/RegExp/firstMatch_A01_t01: Fail # Issue 12508
 LibTest/core/int/toRadixString_A01_t01: Fail # co19 issue 492
 
-Language/05_Variables/05_Variables_A05_t01: fail # Dart issue 12539
-Language/05_Variables/05_Variables_A05_t02: fail # Dart issue 12539
 Language/13_Statements/06_For_A01_t11: fail # Dart issue 5675
 Language/13_Statements/09_Switch_A01_t02: fail # Dart issue 12908
 Language/13_Statements/12_Labels_A01_t03: fail # Dart issue 2238
@@ -28,11 +26,6 @@
 
 LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 
-# All isolate are being ignored at the moment as the library will go through some changes.
-LibTest/isolate/IsolateStream/any_A02_t01: fail # co19 issue 668
-LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19 issue 668
-LibTest/isolate/ReceivePort/receive_A01_t02: Fail # VM triage, check spec.
-
 LibTest/isolate/Isolate/spawnUri_A01_t02: Skip # Dart issue 15974
 LibTest/isolate/Isolate/spawnUri_A01_t03: Skip # Dart issue 15974
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Dart issue 15617
@@ -46,7 +39,6 @@
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # Issue 13596
 
 [ $compiler == none && $runtime == vm ]
-LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
 
diff --git a/tests/compiler/dart2js/backend_dart/dart_backend_test.dart b/tests/compiler/dart2js/backend_dart/dart_backend_test.dart
index 1af28e2..b92152f 100644
--- a/tests/compiler/dart2js/backend_dart/dart_backend_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_backend_test.dart
@@ -32,32 +32,30 @@
 }
 ''';
 
-testDart2Dart(String src, {void continuation(String s), bool minify: false,
-    bool stripTypes: false}) {
-  // If continuation is not provided, check that source string remains the same.
-  if (continuation == null) {
-    continuation = (s) { Expect.equals(src, s); };
-  }
-  testDart2DartWithLibrary(src, '', continuation: continuation, minify: minify,
-      stripTypes: stripTypes);
-}
-
 /**
  * Library name is assumed to be 'mylib' in 'mylib.dart' file.
  */
-testDart2DartWithLibrary(
-    String srcMain, String srcLibrary,
-    {void continuation(String s), bool minify: false,
-    bool stripTypes: false}) {
+testDart2Dart(String mainSrc, {String librarySrc,
+                               String expectedResult,
+                               bool minify: false,
+                               bool stripTypes: false}) {
+
+  // If expectedResult is not provided, check that source string remains the
+  // same.
+  if (expectedResult == null) {
+    Expect.equals(null, librarySrc);
+    expectedResult = mainSrc;
+  }
+
   fileUri(path) => new Uri(scheme: 'file', path: path);
 
   final scriptUri = fileUri('script.dart');
   final libUri = fileUri('mylib.dart');
 
   provider(uri) {
-    if (uri == scriptUri) return new Future.value(srcMain);
+    if (uri == scriptUri) return new Future.value(mainSrc);
     if (uri.toString() == libUri.toString()) {
-      return new Future.value(srcLibrary);
+      return new Future.value(librarySrc);
     }
     if (uri.path.endsWith('/core.dart')) {
       return new Future.value(buildLibrarySource(DEFAULT_CORE_LIBRARY));
@@ -92,13 +90,17 @@
   if (minify) options.add('--minify');
   if (stripTypes) options.add('--force-strip=types');
 
-  asyncTest(() => compile(
-      scriptUri,
-      fileUri('libraryRoot/'),
-      fileUri('packageRoot/'),
-      provider,
-      handler,
-      options).then(continuation));
+  asyncTest(() {
+    return compile(
+        scriptUri,
+        fileUri('libraryRoot/'),
+        fileUri('packageRoot/'),
+        provider,
+        handler,
+        options).then((s) {
+      Expect.equals(expectedResult, s);
+    });
+  });
 }
 
 testSimpleFileUnparse() {
@@ -113,15 +115,12 @@
   should_be_kept();
 }
 ''';
-  testDart2Dart(src, continuation: (String s) {
-    print(s);
-    Expect.equals('''
+  testDart2Dart(src, expectedResult: '''
 should_be_kept() {}
 main() {
   should_be_kept();
 }
-''', s);
-  });
+''');
 }
 testTopLevelField() {
   testDart2Dart('''
@@ -330,6 +329,17 @@
 }
 ''';
   var expectedResult = '''
+globalfoo_A() {}
+var globalVar_A;
+var globalVarInitialized_A = 6;
+var globalVarInitialized2_A = 7;
+class A_A {
+  A_A() {}
+  A_A.fromFoo_A() {}
+  static staticfoo_A() {}
+  foo() {}
+  static const field_A = 5;
+}
 globalfoo() {}
 var globalVar;
 var globalVarInitialized = 6;
@@ -341,27 +351,7 @@
   foo() {}
   static const field = 5;
 }
-A_globalfoo() {}
-var A_globalVar;
-var A_globalVarInitialized = 6;
-var A_globalVarInitialized2 = 7;
-class A_A {
-  A_A() {}
-  A_A.A_fromFoo() {}
-  static A_staticfoo() {}
-  foo() {}
-  static const A_field = 5;
-}
 main() {
-  A_globalVar;
-  A_globalVarInitialized;
-  A_globalVarInitialized2;
-  A_globalfoo();
-  A_A.A_field;
-  A_A.A_staticfoo();
-  new A_A();
-  new A_A.A_fromFoo();
-  new A_A().foo();
   globalVar;
   globalVarInitialized;
   globalVarInitialized2;
@@ -371,10 +361,19 @@
   new A();
   new A.fromFoo();
   new A().foo();
+  globalVar_A;
+  globalVarInitialized_A;
+  globalVarInitialized2_A;
+  globalfoo_A();
+  A_A.field_A;
+  A_A.staticfoo_A();
+  new A_A();
+  new A_A.fromFoo_A();
+  new A_A().foo();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testNoConflictSendsRename() {
@@ -454,8 +453,8 @@
   new A().foo();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testConflictLibraryClassRename() {
@@ -493,11 +492,11 @@
 }
 ''';
   var expectedResult = '''
-topfoo() {}
+topfoo_A() {}
 class A {
   foo() {}
 }
-A_topfoo() {
+topfoo() {
   var x = 5;
 }
 class A_A {
@@ -515,12 +514,12 @@
   var GREATVAR = b.myliba;
   b.mylist;
   a = getA();
-  A_topfoo();
   topfoo();
+  topfoo_A();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testClassExtendsWithArgs() {
@@ -563,19 +562,19 @@
 }
 ''';
   var expectedResult = '''
-get topgetset => 5;
+get topgetset_A => 5;
+set topgetset_A(arg) {}
+get topgetset => 6;
 set topgetset(arg) {}
-get A_topgetset => 6;
-set A_topgetset(arg) {}
 main() {
-  A_topgetset;
-  A_topgetset = 6;
   topgetset;
-  topgetset = 5;
+  topgetset = 6;
+  topgetset_A;
+  topgetset_A = 5;
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testFieldTypeOutput() {
@@ -657,29 +656,29 @@
 }
 ''';
   var expectedResult = '''
-typedef void MyFunction<T extends num>(T arg);
-class T {}
-class B<T> {}
-class A<T> extends B<T> {
-  T f;
+typedef void MyFunction_A<T_B extends num>(T_B arg);
+class T_A {}
+class B_A<T_B> {}
+class A_A<T_B> extends B_A<T_B> {
+  T_B f;
 }
-typedef void A_MyFunction<A_T extends num>(A_T arg);
-class A_T {}
-class A_B<A_T> {}
-class A_A<A_T> extends A_B<A_T> {
-  A_T f;
+typedef void MyFunction<T_B extends num>(T_B arg);
+class T {}
+class B<T_B> {}
+class A<T_B> extends B<T_B> {
+  T_B f;
 }
 main() {
-  A_MyFunction myf1;
-  MyFunction myf2;
-  new A_A<int>().f;
-  new A_T();
+  MyFunction myf1;
+  MyFunction_A myf2;
   new A<int>().f;
   new T();
+  new A_A<int>().f;
+  new T_A();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testClassTypeArgumentBound() {
@@ -702,18 +701,18 @@
 }
 ''';
   var expectedResult = '''
+class I_A {}
+class A_A<T extends I_A> {}
 class I {}
 class A<T extends I> {}
-class A_I {}
-class A_A<A_T extends A_I> {}
 main() {
-  new A_A();
   new A();
+  new A_A();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
-}
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
+  }
 
 testDoubleMains() {
   var librarySrc = '''
@@ -727,13 +726,13 @@
 }
 ''';
   var expectedResult = '''
-A_main() {}
+main_A() {}
 main() {
-  A_main();
+  main_A();
 }
 ''';
-  testDart2DartWithLibrary(mainSrc, librarySrc,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(mainSrc, librarySrc: librarySrc,
+      expectedResult: expectedResult);
 }
 
 testStaticAccessIoLib() {
@@ -745,13 +744,12 @@
 }
 ''';
   var expectedResult = '''
-import "dart:io" as p;
+import "dart:io";
 main() {
-  p.Platform.operatingSystem;
+  Platform.operatingSystem;
 }
 ''';
-  testDart2Dart(src,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(src, expectedResult: expectedResult);
 }
 
 testMinification() {
@@ -764,8 +762,7 @@
   var expectedResult =
       'class A{}'
       'main(){new A();}';
-  testDart2Dart(src, continuation:
-      (String result) { Expect.equals(expectedResult, result); }, minify: true);
+  testDart2Dart(src, expectedResult: expectedResult, minify: true);
 }
 
 testClosureLocalsMinified() {
@@ -783,8 +780,7 @@
 ''';
   var expectedResult =
       'main(){var A=7; B(A,C){ D(E,F){var G=A;}D(C,A);}B(A,8);}';
-  testDart2Dart(src, continuation:
-      (String result) { Expect.equals(expectedResult, result); }, minify: true);
+  testDart2Dart(src, expectedResult: expectedResult, minify: true);
 }
 
 testParametersMinified() {
@@ -810,8 +806,7 @@
   var expectedResult =
       'class B{var E;static C(A){A=5;}}D(A,{optionalarg: 7}){A=6;}'
       'main(){new B().E;B.C(8);D(8);}';
-  testDart2Dart(src, continuation:
-      (String result) { Expect.equals(expectedResult, result); }, minify: true);
+  testDart2Dart(src, expectedResult: expectedResult, minify: true);
 }
 
 testDeclarationTypePlaceholders() {
@@ -833,9 +828,7 @@
   foo("5");
 }
 ''';
-  testDart2Dart(src,
-      continuation: (String result) { Expect.equals(expectedResult, result); },
-      stripTypes: true);
+  testDart2Dart(src, expectedResult: expectedResult, stripTypes: true);
 }
 
 testPlatformLibraryMemberNamesAreFixed() {
@@ -851,16 +844,15 @@
 }
 ''';
   var expectedResult = '''
-import "dart:html" as p;
+import "dart:html";
 class A {
-  static String get A_userAgent => p.window.navigator.userAgent;
+  static String get userAgent_A => window.navigator.userAgent;
 }
 main() {
-  A.A_userAgent;
+  A.userAgent_A;
 }
 ''';
-  testDart2Dart(src,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(src, expectedResult: expectedResult);
 }
 
 testConflictsWithCoreLib() {
@@ -875,16 +867,15 @@
 }
 ''';
   var expectedResult = """
-A_print(x) {
+print_A(x) {
   throw 'fisk';
 }
 main() {
   print('corelib');
-  A_print('local');
+  print_A('local');
 }
 """;
-  testDart2Dart(src,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(src, expectedResult: expectedResult);
 }
 
 testUnresolvedNamedConstructor() {
@@ -904,11 +895,10 @@
 }
 main() {
   new A();
-  new A_Unresolved();
+  new Unresolved_A();
 }
 """;
-  testDart2Dart(src,
-      continuation: (String result) { Expect.equals(expectedResult, result); });
+  testDart2Dart(src, expectedResult: expectedResult);
 }
 
 main() {
diff --git a/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart b/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart
new file mode 100644
index 0000000..32299d5
--- /dev/null
+++ b/tests/compiler/dart2js/backend_dart/opt_constprop_test.dart
@@ -0,0 +1,431 @@
+// 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:async';
+import '../mock_compiler.dart';
+import 'sexpr_unstringifier.dart';
+import 'package:async_helper/async_helper.dart';
+import "package:expect/expect.dart";
+import 'package:compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart';
+import 'package:compiler/implementation/cps_ir/optimizers.dart';
+import 'package:compiler/implementation/dart2jslib.dart' as dart2js;
+
+// The tests in this file that ensure that sparse constant propagation on the
+// CPS IR works as expected.
+
+// CP1 represents the following incoming dart code:
+//
+//  int main() {
+//    int i = 1;
+//    int j;
+//    if (i == 1) {
+//      j = 2;
+//    } else {
+//      j = 3;
+//    }
+//    return j;
+//  }
+
+String CP1_IN = """
+(FunctionDefinition main (return) (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 1))
+  (LetCont (k0 v2)
+    (LetCont (k1) (LetPrim v3 (Constant 2))
+      (InvokeContinuation return v3))
+    (LetCont (k2) (LetPrim v4 (Constant 3))
+      (InvokeContinuation return v4))
+    (Branch (IsTrue v2) k1 k2))
+  (InvokeMethod v0 == v1 k0))
+""";
+String CP1_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 1))
+  (LetCont (k0 v2)
+    (LetCont (k1)
+      (LetPrim v3 (Constant 2))
+      (InvokeContinuation return v3))
+    (LetCont (k2)
+      (LetPrim v4 (Constant 3))
+      (InvokeContinuation return v4))
+    (InvokeContinuation k1 ))
+  (LetPrim v5 (Constant true))
+  (InvokeContinuation k0 v5))
+""";
+
+// CP2 represents the following incoming dart code:
+//
+//  int main() {
+//    int i = 1;
+//    while (true) {
+//      if (false || false) {
+//        return i;
+//      }
+//      if (true && i == 1) {
+//        return i;
+//      }
+//    }
+//    return 42;
+//  }
+
+String CP2_IN = """
+(FunctionDefinition main (return) (LetPrim v0 (Constant 1))
+  (LetCont* (k0)
+    (LetCont (k1) (LetPrim v1 (Constant 42))
+      (InvokeContinuation return v1))
+    (LetCont (k2) (LetPrim v2 (Constant false))
+      (LetCont (k3 v3)
+        (LetCont (k4) (InvokeContinuation return v0))
+        (LetCont (k5) (LetPrim v4 (Constant true))
+          (LetCont (k6 v5)
+            (LetCont (k7) (InvokeContinuation return v0))
+            (LetCont (k8) (InvokeContinuation* k0))
+            (Branch (IsTrue v5) k7 k8))
+          (LetCont (k9) (LetPrim v6 (Constant 1))
+            (LetCont (k10 v7)
+              (LetCont (k11) (LetPrim v8 (Constant true))
+                (InvokeContinuation k6 v8))
+              (LetCont (k12) (LetPrim v9 (Constant false))
+                (InvokeContinuation k6 v9))
+              (Branch (IsTrue v7) k11 k12))
+            (InvokeMethod v0 == v6 k10))
+          (LetCont (k13) (LetPrim v10 (Constant false))
+            (InvokeContinuation k6 v10))
+          (Branch (IsTrue v4) k9 k13))
+        (Branch (IsTrue v3) k4 k5))
+      (LetCont (k14) (LetPrim v11 (Constant true))
+        (InvokeContinuation k3 v11))
+      (LetCont (k15) (LetPrim v12 (Constant false))
+        (LetCont (k16) (LetPrim v13 (Constant true))
+          (InvokeContinuation k3 v13))
+        (LetCont (k17) (LetPrim v14 (Constant false))
+          (InvokeContinuation k3 v14))
+        (Branch (IsTrue v12) k16 k17))
+      (Branch (IsTrue v2) k14 k15))
+    (LetPrim v15 (Constant true))
+    (Branch (IsTrue v15) k2 k1))
+  (InvokeContinuation k0))
+""";
+String CP2_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetCont* (k0)
+    (LetCont (k1) (LetPrim v1 (Constant 42))
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (LetPrim v2 (Constant false))
+      (LetCont (k3 v3)
+        (LetCont (k4) (InvokeContinuation return v0))
+        (LetCont (k5)
+          (LetPrim v4 (Constant true))
+          (LetCont (k6 v5)
+            (LetCont (k7) (InvokeContinuation return v0))
+            (LetCont (k8) (InvokeContinuation* k0 ))
+            (InvokeContinuation k7 ))
+          (LetCont (k9)
+            (LetPrim v6 (Constant 1))
+            (LetCont (k10 v7)
+              (LetCont (k11)
+                (LetPrim v8 (Constant true))
+                (InvokeContinuation k6 v8))
+              (LetCont (k12) (LetPrim v9 (Constant false))
+                (InvokeContinuation k6 v9))
+              (InvokeContinuation k11 ))
+            (LetPrim v10 (Constant true))
+            (InvokeContinuation k10 v10))
+          (LetCont (k13) (LetPrim v11 (Constant false))
+            (InvokeContinuation k6 v11))
+          (InvokeContinuation k9 ))
+        (InvokeContinuation k5 ))
+      (LetCont (k14) (LetPrim v12 (Constant true))
+        (InvokeContinuation k3 v12))
+      (LetCont (k15)
+        (LetPrim v13 (Constant false))
+        (LetCont (k16) (LetPrim v14 (Constant true))
+          (InvokeContinuation k3 v14))
+        (LetCont (k17)
+          (LetPrim v15 (Constant false))
+          (InvokeContinuation k3 v15))
+        (InvokeContinuation k17 ))
+      (InvokeContinuation k15 ))
+    (LetPrim v16 (Constant true))
+    (InvokeContinuation k2 ))
+  (InvokeContinuation k0 ))
+""";
+
+// CP3 represents the following incoming dart code:
+//
+//  int main() {
+//    int i = 1;
+//    i = f();
+//    if (i == 1) {
+//      return 42;
+//    }
+//    return i;
+//  }
+
+String CP3_IN = """
+(FunctionDefinition main ( return) (LetPrim v0 (Constant 1))
+  (LetCont (k0 v1) (LetPrim v2 (Constant 1))
+    (LetCont (k1 v3)
+      (LetCont (k2) (LetPrim v4 (Constant 42))
+        (InvokeContinuation return v4))
+      (LetCont (k3) (InvokeContinuation return v1))
+      (Branch (IsTrue v3) k2 k3))
+    (InvokeMethod v1 == v2 k1))
+  (InvokeStatic f k0))
+""";
+String CP3_OUT = CP3_IN;
+
+// Addition.
+
+String CP4_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 2))
+  (LetCont (k0 v2)
+     (InvokeContinuation return v2))
+  (InvokeMethod v0 + v1 k0))
+""";
+String CP4_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 2))
+  (LetCont (k0 v2)
+     (InvokeContinuation return v2))
+  (LetPrim v3 (Constant 3))
+  (InvokeContinuation k0 v3))
+""";
+
+// Array access operator (no optimization).
+
+String CP5_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 2))
+  (LetCont (k0 v2)
+     (InvokeContinuation return v2))
+  (InvokeMethod v0 [] v1 k0))
+""";
+String CP5_OUT = CP5_IN;
+
+// Division by 0.
+
+String CP6_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 0))
+  (LetCont (k0 v2)
+     (InvokeContinuation return v2))
+  (InvokeMethod v0 / v1 k0))
+""";
+String CP6_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 0))
+  (LetCont (k0 v2)
+     (InvokeContinuation return v2))
+  (LetPrim v3 (Constant Infinity))
+  (InvokeContinuation k0 v3))
+""";
+
+// Concatenate strings.
+
+String CP7_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("b")))
+  (LetPrim v1 (Constant StringConstant("d")))
+  (LetPrim v2 (Constant StringConstant("a")))
+  (LetPrim v3 (Constant StringConstant("c")))
+  (LetPrim v4 (Constant StringConstant("")))
+  (LetCont (k0 v5)
+    (LetCont (k1 v6)
+      (InvokeContinuation return v6))
+    (InvokeMethod v5 length k1))
+  (ConcatenateStrings v2 v0 v3 v1 v4 k0))
+""";
+String CP7_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("b")))
+  (LetPrim v1 (Constant StringConstant("d")))
+  (LetPrim v2 (Constant StringConstant("a")))
+  (LetPrim v3 (Constant StringConstant("c")))
+  (LetPrim v4 (Constant StringConstant("")))
+  (LetCont (k0 v5)
+    (LetCont (k1 v6)
+      (InvokeContinuation return v6))
+    (InvokeMethod v5 length k1))
+  (LetPrim v7 (Constant StringConstant("abcd")))
+  (InvokeContinuation k0 v7))
+""";
+
+// TODO(jgruber): We can't test is-check optimization because the unstringifier
+// does not recreate accurate types for the TypeOperator node.
+
+// Simple branch removal.
+
+String CP8_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 1))
+  (LetCont (k0 v2)
+    (LetCont (k1)
+      (LetPrim v3 (Constant 42))
+      (InvokeContinuation return v3))
+    (LetCont (k2)
+      (InvokeContinuation return v0))
+    (Branch (IsTrue v2) k1 k2))
+  (InvokeMethod v0 == v1 k0))
+""";
+String CP8_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetPrim v1 (Constant 1))
+  (LetCont (k0 v2)
+    (LetCont (k1) (LetPrim v3 (Constant 42))
+      (InvokeContinuation return v3))
+    (LetCont (k2) (InvokeContinuation return v0))
+    (InvokeContinuation k1 ))
+  (LetPrim v4 (Constant true))
+  (InvokeContinuation k0 v4))
+""";
+
+// While loop.
+
+String CP9_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetCont* (k0 v1)
+    (LetCont (k1)
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (LetPrim v2 (Constant 1))
+      (LetCont (k3 v3)
+        (LetCont (k4 v4)
+          (LetCont (k5)
+            (LetPrim v5 (Constant 42))
+            (InvokeContinuation return v5))
+          (LetCont (k6)
+            (LetPrim v6 (Constant 1))
+            (LetCont (k7 v7)
+              (InvokeContinuation* k0 v7))
+            (InvokeMethod v1 + v6 k7))
+          (Branch (IsTrue v4) k5 k6))
+        (LetCont (k8)
+          (LetPrim v8 (Constant false))
+          (InvokeContinuation k4 v8))
+        (LetCont (k9)
+          (LetPrim v9 (Constant true))
+          (InvokeContinuation k4 v9))
+        (Branch (IsTrue v3) k8 k9))
+      (InvokeMethod v1 == v2 k3))
+    (LetPrim v10 (Constant true))
+    (Branch (IsTrue v10) k2 k1))
+  (InvokeContinuation k0 v0))
+""";
+String CP9_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 1))
+  (LetCont* (k0 v1)
+    (LetCont (k1)
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (LetPrim v2 (Constant 1))
+      (LetCont (k3 v3)
+        (LetCont (k4 v4)
+          (LetCont (k5)
+            (LetPrim v5 (Constant 42))
+            (InvokeContinuation return v5))
+          (LetCont (k6)
+            (LetPrim v6 (Constant 1))
+            (LetCont (k7 v7)
+              (InvokeContinuation* k0 v7))
+            (InvokeMethod v1 + v6 k7))
+          (Branch (IsTrue v4) k5 k6))
+        (LetCont (k8)
+          (LetPrim v8 (Constant false))
+          (InvokeContinuation k4 v8))
+        (LetCont (k9)
+          (LetPrim v9 (Constant true))
+          (InvokeContinuation k4 v9))
+        (Branch (IsTrue v3) k8 k9))
+      (InvokeMethod v1 == v2 k3))
+    (LetPrim v10 (Constant true))
+    (InvokeContinuation k2 ))
+  (InvokeContinuation k0 v0))
+""";
+
+// While loop, from:
+//
+//  int main() {
+//    for (int i = 0; i < 2; i++) {
+//      print(42 + i);
+//    }
+//  }
+
+String CP10_IN = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 0))
+  (LetCont* (k0 v1)
+    (LetCont (k1)
+      (LetPrim v2 (Constant null))
+      (InvokeContinuation return v2))
+    (LetCont (k2)
+      (LetPrim v3 (Constant 42))
+      (LetCont (k3 v4)
+        (LetCont (k4 v5)
+          (LetPrim v6 (Constant 1))
+          (LetCont (k5 v7)
+            (InvokeContinuation* k0 v7))
+          (InvokeMethod v1 + v6 k5))
+        (InvokeStatic print v4 k4))
+      (InvokeMethod v3 + v1 k3))
+    (LetPrim v8 (Constant 2))
+    (LetCont (k6 v9)
+      (Branch (IsTrue v9) k2 k1))
+    (InvokeMethod v1 < v8 k6))
+  (InvokeContinuation k0 v0))
+""";
+String CP10_OUT = CP10_IN;
+
+/// Normalizes whitespace by replacing all whitespace sequences by a single
+/// space and trimming leading and trailing whitespace.
+String normalizeSExpr(String input) {
+  return input.replaceAll(new RegExp(r'[ \n\t]+'), ' ').trim();
+}
+
+/// Parses the given input IR, runs an optimization pass over it, and compares
+/// the stringification of the result against the expected output.
+Future testConstantPropagator(String input, String expectedOutput) {
+  final compiler = new MockCompiler.internal(
+      emitJavaScript: false,
+      enableMinification: false);
+  return compiler.init().then((_) {
+    final unstringifier = new SExpressionUnstringifier();
+    final stringifier   = new SExpressionStringifier();
+    final optimizer     = new ConstantPropagator(
+        compiler, dart2js.DART_CONSTANT_SYSTEM);
+
+    final f = unstringifier.unstringify(input);
+    optimizer.rewrite(f);
+
+    String expected = normalizeSExpr(expectedOutput);
+    String actual   = normalizeSExpr(stringifier.visit(f));
+
+    Expect.equals(expected, actual);
+  });
+}
+
+void main() {
+  asyncTest(() => testConstantPropagator(CP1_IN, CP1_OUT));
+  asyncTest(() => testConstantPropagator(CP2_IN, CP2_OUT));
+  asyncTest(() => testConstantPropagator(CP3_IN, CP3_OUT));
+  asyncTest(() => testConstantPropagator(CP4_IN, CP4_OUT));
+  asyncTest(() => testConstantPropagator(CP5_IN, CP5_OUT));
+  asyncTest(() => testConstantPropagator(CP6_IN, CP6_OUT));
+  asyncTest(() => testConstantPropagator(CP7_IN, CP7_OUT));
+  asyncTest(() => testConstantPropagator(CP8_IN, CP8_OUT));
+  asyncTest(() => testConstantPropagator(CP9_IN, CP9_OUT));
+  asyncTest(() => testConstantPropagator(CP10_IN, CP10_OUT));
+}
diff --git a/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart b/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
index b66a3ea..c37ce56 100644
--- a/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
+++ b/tests/compiler/dart2js/backend_dart/opt_redundant_phi_test.dart
@@ -167,6 +167,65 @@
 
 String BASIC_LOOP_OUT = BASIC_LOOP_IN;
 
+// Ensures that proper scoping is preserved, i.e. that the optimized
+// continuation body does reference out of scope primitives.
+// IR written by hand since this case is currently not being generated.
+
+String SCOPING_IN = """
+(FunctionDefinition main ( return)
+  (LetCont (k0 v1)
+    (InvokeStatic print v1 return))
+  (LetPrim v0 (Constant 0))
+  (LetPrim v2 (Constant null))
+  (InvokeContinuation k0 v0))
+""";
+
+String SCOPING_OUT = """
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant 0))
+  (LetCont (k0)
+    (InvokeStatic print v0 return))
+  (LetPrim v1 (Constant null))
+  (InvokeContinuation k0 ))
+""";
+
+// Ensures that continuations which are never invoked are not optimized.
+// IR written by hand.
+
+String NEVER_INVOKED1_IN = """
+(FunctionDefinition main ( return) 
+  (LetPrim v0 (Constant 0))
+  (LetCont (k0 v1)
+    (InvokeStatic print v1 return))
+  (InvokeContinuation return v0))
+""";
+
+String NEVER_INVOKED1_OUT = NEVER_INVOKED1_IN;
+
+// As in the previous test, except with the added wrinkle of higher order
+// continuations.
+
+String NEVER_INVOKED2_IN = """
+(FunctionDefinition main ( return)
+  (LetCont (k0 v0)
+    (InvokeStatic print v0 return))
+  (InvokeContinuation return k0))
+""";
+
+String NEVER_INVOKED2_OUT = NEVER_INVOKED2_IN;
+
+// As in the previous test, but the continuation is invoked as well as passed
+// as an argument.
+
+String AS_ARG_IN = """
+(FunctionDefinition main ( return)
+  (LetCont (k0 v0)
+    (InvokeStatic print v0 return))
+  (InvokeContinuation k0 k0))
+""";
+
+String AS_ARG_OUT = AS_ARG_IN;
+
 /// Normalizes whitespace by replacing all whitespace sequences by a single
 /// space and trimming leading and trailing whitespace.
 String normalizeSExpr(String input) {
@@ -193,4 +252,8 @@
   testRedundantPhi(READ_IN_LOOP_IN, READ_IN_LOOP_OUT);
   testRedundantPhi(INNER_LOOP_IN, INNER_LOOP_OUT);
   testRedundantPhi(BASIC_LOOP_IN, BASIC_LOOP_OUT);
+  testRedundantPhi(SCOPING_IN, SCOPING_OUT);
+  testRedundantPhi(NEVER_INVOKED1_IN, NEVER_INVOKED1_OUT);
+  testRedundantPhi(NEVER_INVOKED2_IN, NEVER_INVOKED2_OUT);
+  testRedundantPhi(AS_ARG_IN, AS_ARG_OUT);
 }
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index c84f1d8..bdd9ed4 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -22,7 +22,8 @@
             MessageKind,
             Selector,
             TypedSelector,
-            SourceSpan;
+            SourceSpan,
+            World;
 
 import 'package:compiler/implementation/ssa/ssa.dart' as ssa;
 
@@ -179,10 +180,18 @@
   switch (how) {
     case 'exact': return new types.TypeMask.exact(element);
     case 'nonNullExact': return new types.TypeMask.nonNullExact(element);
-    case 'subclass': return new types.TypeMask.subclass(element);
-    case 'nonNullSubclass': return new types.TypeMask.nonNullSubclass(element);
-    case 'subtype': return new types.TypeMask.subtype(element);
-    case 'nonNullSubtype': return new types.TypeMask.nonNullSubtype(element);
+    case 'subclass': {
+      return new types.TypeMask.subclass(element, compiler.world);
+    }
+    case 'nonNullSubclass': {
+      return new types.TypeMask.nonNullSubclass(element, compiler.world);
+    }
+    case 'subtype': {
+      return new types.TypeMask.subtype(element, compiler.world);
+    }
+    case 'nonNullSubtype': {
+      return new types.TypeMask.nonNullSubtype(element, compiler.world);
+    }
   }
   Expect.fail('Unknown TypeMask constructor $how');
 }
diff --git a/tests/compiler/dart2js/concrete_type_inference_test.dart b/tests/compiler/dart2js/concrete_type_inference_test.dart
index d0cd86d..07d69fa 100644
--- a/tests/compiler/dart2js/concrete_type_inference_test.dart
+++ b/tests/compiler/dart2js/concrete_type_inference_test.dart
@@ -74,7 +74,8 @@
   });
   checkPrintType('"foo"', (compiler, type) {
     var inferrer = compiler.typesTask.typesInferrer;
-    Expect.isTrue(compiler.typesTask.stringType.containsOnlyString(compiler));
+    Expect.isTrue(
+        compiler.typesTask.stringType.containsOnlyString(compiler.world));
   });
 }
 
diff --git a/tests/compiler/dart2js/container_mask_equal_test.dart b/tests/compiler/dart2js/container_mask_equal_test.dart
index f082bef..28a7645 100644
--- a/tests/compiler/dart2js/container_mask_equal_test.dart
+++ b/tests/compiler/dart2js/container_mask_equal_test.dart
@@ -4,7 +4,7 @@
 
 // Regression test for dart2js that used to have a bogus
 // implementation of var.== and
-// var.hashCode. 
+// var.hashCode.
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
@@ -27,7 +27,7 @@
 };
 
 main() {
-  var compiler = compilerFor(MEMORY_SOURCE_FILES);  
+  var compiler = compilerFor(MEMORY_SOURCE_FILES);
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     var typesInferrer = compiler.typesTask.typesInferrer;
 
@@ -43,7 +43,7 @@
     element = compiler.mainApp.find('d');
     var mask4 = typesInferrer.getReturnTypeOfElement(element);
 
-    Expect.notEquals(mask1.union(mask2, compiler),
-                     mask3.union(mask4, compiler));
+    Expect.notEquals(mask1.union(mask2, compiler.world),
+                     mask3.union(mask4, compiler.world));
   }));
 }
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 6f3aab0..d0296f6 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -1594,15 +1594,15 @@
     }
 
     Expect.equals(convert(singleton(a).union(singleton(b))),
-                  new TypeMask.nonNullSubclass(a));
+                  new TypeMask.nonNullSubclass(a, result.compiler.world));
 
     Expect.equals(
         convert(singleton(a).union(singleton(b)).union(nullSingleton)),
-                  new TypeMask.subclass(a));
+                  new TypeMask.subclass(a, result.compiler.world));
 
     Expect.equals(
         simplify(convert(singleton(b).union(singleton(d))), result.compiler),
-        new TypeMask.nonNullSubtype(a));
+        new TypeMask.nonNullSubtype(a, result.compiler.world));
   });
 }
 
@@ -1646,20 +1646,21 @@
     result.checkSelectorHasType(
         foo,
         new TypeMask.unionOf([a, b, c]
-            .map((cls) => new TypeMask.nonNullExact(cls)), result.compiler));
+            .map((cls) => new TypeMask.nonNullExact(cls)),
+            result.compiler.world));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(x, foo, result.compiler),
+        new TypedSelector.subclass(x, foo, result.compiler.world),
         new TypeMask.nonNullExact(b));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(y, foo, result.compiler),
+        new TypedSelector.subclass(y, foo, result.compiler.world),
         new TypeMask.nonNullExact(c));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(z, foo, result.compiler),
+        new TypedSelector.subclass(z, foo, result.compiler.world),
         new TypeMask.nonNullExact(a));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(xy, foo, result.compiler),
+        new TypedSelector.subclass(xy, foo, result.compiler.world),
         new TypeMask.unionOf([b, c].map((cls) =>
-            new TypeMask.nonNullExact(cls)), result.compiler));
+            new TypeMask.nonNullExact(cls)), result.compiler.world));
 
     result.checkSelectorHasType(new Selector.call("bar", null, 0), null);
   });
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 96da696..a16b240 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -25,14 +25,17 @@
 mirrors/library_imports_prefixed_show_hide_test: Fail
 mirrors/library_imports_shown_test: Fail
 
+message_kind_test: Fail  # Native annotation applied twice?
+
 [ $unchecked ]
 exit_code_test: Skip # This tests requires checked mode.
 
 [ $checked ]
 deferred_mirrors_test: Pass, Slow
+mirror_final_field_inferrer2_test: Pass, Slow
 
 [ $checked || $mode == debug ]
-check_elements_invariants_test: Skip # Slow and only needs to be run in one 
+check_elements_invariants_test: Skip # Slow and only needs to be run in one
                                      # configuration
 
 [ $mode == debug ]
diff --git a/tests/compiler/dart2js/dictionary_types_test.dart b/tests/compiler/dart2js/dictionary_types_test.dart
index feaa693..7cea785 100644
--- a/tests/compiler/dart2js/dictionary_types_test.dart
+++ b/tests/compiler/dart2js/dictionary_types_test.dart
@@ -112,7 +112,7 @@
     }));
   asyncTest(() => compileAndTest("Union.dart", (types, getType, compiler) {
     Expect.equals(getType('nullOrInt'), types.uint31Type.nullable());
-    Expect.isTrue(getType('aString').containsOnlyString(compiler));
+    Expect.isTrue(getType('aString').containsOnlyString(compiler.world));
     Expect.equals(getType('doubleOrNull'), types.doubleType.nullable());
   }));
   asyncTest(() =>
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index 9d5e04d..00864e7 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -42,18 +42,45 @@
 }
 """;
 
+const String TEST_TWO = r"""
 main() {
-  var compiler = compilerFor({'main.dart': TEST_ONE}, options: ["--dump-info"]);
-  asyncTest(() => compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) {
-    var dumpTask = compiler.dumpInfoTask;
-    dumpTask.collectInfo();
-    var info = dumpTask.infoCollector;
+  print(bar);
+  print(bar());
+  print(new X().foo);
+  print(new X().foo());
+}
 
-    StringBuffer sb = new StringBuffer();
-    dumpTask.dumpInfoJson(sb);
-    String json = sb.toString();
-    Map<String, dynamic> map = JSON.decode(json);
-    Expect.isTrue(map.isNotEmpty);
+bar() => [() => [() => [() => [() => [() => [() => [() => [() => [() => [() =>
+[() => []]]]]]]]]]]];
+
+class X {
+  foo() => [() => [() => [() => [() => [() => [() => [() => [() => [() =>
+[() => []]]]]]]]]]];
+}
+""";
+
+typedef void JsonTaking(Map<String, dynamic> json);
+
+void jsonTest(String program, JsonTaking testFn) {
+  var compiler = compilerFor({'main.dart': program}, options: ['--dump-info']);
+  asyncTest(() => compiler.runCompiler(Uri.parse('memory:main.dart')).then(
+    (_) {
+      Expect.isFalse(compiler.compilationFailed);
+      var dumpTask = compiler.dumpInfoTask;
+      dumpTask.collectInfo();
+      var info = dumpTask.infoCollector;
+
+      StringBuffer sb = new StringBuffer();
+      dumpTask.dumpInfoJson(sb);
+      String json = sb.toString();
+      Map<String, dynamic> map = JSON.decode(json);
+
+      testFn(map);
+    }));
+}
+
+main() {
+  jsonTest(TEST_ONE, (map) {
     Expect.isTrue(map['elements'].isNotEmpty);
     Expect.isTrue(map['elements']['function'].isNotEmpty);
     Expect.isTrue(map['elements']['library'].isNotEmpty);
@@ -67,5 +94,15 @@
     Expect.isTrue(map['elements']['function'].values.any((fun) {
       return fun['name'] == 'f';
     }));
-  }));
+  });
+
+  jsonTest(TEST_TWO, (map) {
+    var functions = map['elements']['function'].values;
+    Expect.isTrue(functions.any((fn) {
+      return fn['name'] == 'bar' && fn['children'].length == 11;
+    }));
+    Expect.isTrue(functions.any((fn) {
+      return fn['name'] == 'foo' && fn['children'].length == 10;
+    }));
+  });
 }
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 82a6613..bc1f6a9 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -534,7 +534,8 @@
   runTest(TEST_15, {'f': (types) {
                             ClassElement cls =
                                 types.compiler.backend.jsIndexableClass;
-                            return new TypeMask.nonNullSubtype(cls);
+                            return new TypeMask.nonNullSubtype(cls,
+                                types.compiler.world);
                          }});
   runTest(TEST_16, {'f': subclassOfInterceptor});
   runTest(TEST_17, {'f': (types) => types.uint31Type.nullable()});
diff --git a/tests/compiler/dart2js/map_tracer_test.dart b/tests/compiler/dart2js/map_tracer_test.dart
index cf0ae97..a239a39 100644
--- a/tests/compiler/dart2js/map_tracer_test.dart
+++ b/tests/compiler/dart2js/map_tracer_test.dart
@@ -215,6 +215,7 @@
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(generateTest(allocation), uri,
       expectedErrors: 0, expectedWarnings: 1);
+  var classWorld = compiler.world;
   asyncTest(() => compiler.runCompiler(uri).then((_) {
     var keyType, valueType;
     var typesTask = compiler.typesTask;
@@ -240,9 +241,9 @@
       Expect.equals(valueType, simplify(mask.valueType, compiler), name);
     }
 
-    K(TypeMask other) => simplify(keyType.union(other, compiler), compiler);
+    K(TypeMask other) => simplify(keyType.union(other, classWorld), compiler);
     V(TypeMask other) =>
-        simplify(valueType.union(other, compiler), compiler).nullable();
+        simplify(valueType.union(other, classWorld), compiler).nullable();
 
     checkType('mapInField', K(aKeyType), V(typesTask.numType));
     checkType('mapPassedToMethod', K(aKeyType), V(typesTask.numType));
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 81b6824..dfadfb2 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -39,11 +39,6 @@
     MessageKind.UNIMPLEMENTED_METHOD_ONE,
     MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
     MessageKind.VOID_NOT_ALLOWED,
-
-    MessageKind.HEX_DIGIT_EXPECTED, // http://dartbug.com/18574
-    MessageKind.UNMATCHED_TOKEN, // http://dartbug.com/18574
-    MessageKind.UNTERMINATED_COMMENT, // http://dartbug.com/18574
-    MessageKind.UNTERMINATED_STRING, // http://dartbug.com/18574
 ]);
 
 /// Most messages can be tested without causing a fatal error. Add an exception
@@ -60,7 +55,6 @@
 /// stop before analyzing all input, and it isn't safe to reuse it.
 final Set<MessageKind> kindsWithFatalErrors = new Set<MessageKind>.from([
     // If you add something here, please file a *new* bug report.
-    MessageKind.HEX_DIGIT_EXPECTED,
     MessageKind.UNMATCHED_TOKEN,
     MessageKind.UNTERMINATED_STRING,
 ]);
diff --git a/tests/compiler/dart2js/mirror_helper_rename_test.dart b/tests/compiler/dart2js/mirror_helper_rename_test.dart
index 52e6581..e20d6e9 100644
--- a/tests/compiler/dart2js/mirror_helper_rename_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_rename_test.dart
@@ -37,7 +37,7 @@
       then((Compiler compiler) {
     DartBackend backend = compiler.backend;
     MirrorRenamer mirrorRenamer = backend.mirrorRenamer;
-    Map<Node, String> renames = backend.renames;
+    Map<Node, String> renames = backend.placeholderRenamer.renames;
     Map<String, String> symbols = mirrorRenamer.symbols;
 
     Expect.isFalse(null == backend.mirrorHelperLibrary);
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index 80888b8..68fe257 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -42,8 +42,9 @@
 
     DartBackend backend = compiler.backend;
     MirrorRenamer mirrorRenamer = backend.mirrorRenamer;
-    Map<Node, String> renames = backend.renames;
-    Map<LibraryElement, String> imports = backend.imports;
+    Map<Node, String> renames = backend.placeholderRenamer.renames;
+    Set<LibraryElement> imports =
+        backend.placeholderRenamer.platformImports;
 
     FunctionExpression node = backend.memberNodes.values.first.first;
     Block block = node.body;
@@ -54,7 +55,7 @@
                   renames[send.selector]);
     Expect.equals("",
                   renames[send.receiver]);
-    Expect.equals(1, imports.keys.length);
+    Expect.equals(1, imports.length);
   }));
 }
 
@@ -63,17 +64,16 @@
       then((Compiler compiler) {
 
     DartBackend backend = compiler.backend;
-    Map<Node, String> renames = backend.renames;
-    Map<LibraryElement, String> imports = backend.imports;
-
+    Map<Node, String> renames = backend.placeholderRenamer.renames;
+    Set<LibraryElement> imports =
+        backend.placeholderRenamer.platformImports;
     FunctionExpression node = backend.memberNodes.values.first.first;
     Block block = node.body;
     ExpressionStatement getNameFunctionNode = block.statements.nodes.head;
     Send send = getNameFunctionNode.expression;
 
     Expect.isFalse(renames.containsKey(send.selector));
-    Expect.isFalse(renames.containsKey(send.receiver));
-    Expect.equals(1, imports.keys.length);
+    Expect.equals(1, imports.length);
   }));
 }
 
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index 9d1c314..4f77639 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -37,7 +37,7 @@
       then((Compiler compiler) {
     DartBackend backend = compiler.backend;
     MirrorRenamer mirrorRenamer = backend.mirrorRenamer;
-    Map<Node, String> renames = backend.renames;
+    Map<Node, String> renames = backend.placeholderRenamer.renames;
     Map<String, String> symbols = mirrorRenamer.symbols;
 
     // Check that no two different source code names get the same mangled name,
@@ -63,7 +63,7 @@
   asyncTest(() => runCompiler(useMirrorHelperLibrary: false, minify: true).
       then((Compiler compiler) {
     DartBackend backend = compiler.backend;
-    Map<Node, String> renames = backend.renames;
+    Map<Node, String> renames = backend.placeholderRenamer.renames;
 
     // 'Foo' appears twice and 'invocation' and 'hest' get the same mangled
     // name.
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 2adea62..af3f5f3 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -60,7 +60,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 381;
+    int expectedMethodCount = 404;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 3da4a32..3099144 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -763,7 +763,9 @@
         int method() => 0;
         @patch void clear() {}
       }
-      """).then((compiler) {
+      """).then((Compiler compiler) {
+    World world = compiler.world;
+
     ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
                               expectIsPatched: true);
     cls.ensureResolved(compiler);
@@ -778,27 +780,29 @@
 
     // Check that a method just in the patch class is a target for a
     // typed selector.
-    var selector = new Selector.call('method', compiler.coreLibrary, 0);
-    var typedSelector = new TypedSelector.exact(cls, selector, compiler);
-    Element method = cls.implementation.lookupLocalMember('method');
-    Expect.isTrue(selector.applies(method, compiler));
-    Expect.isTrue(typedSelector.applies(method, compiler));
+    Selector selector = new Selector.call('method', compiler.coreLibrary, 0);
+    TypedSelector typedSelector = new TypedSelector.exact(cls, selector, world);
+    FunctionElement method = cls.implementation.lookupLocalMember('method');
+    method.computeSignature(compiler);
+    Expect.isTrue(selector.applies(method, world));
+    Expect.isTrue(typedSelector.applies(method, world));
 
     // Check that the declaration method in the declaration class is a target
     // for a typed selector.
     selector = new Selector.call('clear', compiler.coreLibrary, 0);
-    typedSelector = new TypedSelector.exact(cls, selector, compiler);
+    typedSelector = new TypedSelector.exact(cls, selector, world);
     method = cls.lookupLocalMember('clear');
-    Expect.isTrue(selector.applies(method, compiler));
-    Expect.isTrue(typedSelector.applies(method, compiler));
+    method.computeSignature(compiler);
+    Expect.isTrue(selector.applies(method, world));
+    Expect.isTrue(typedSelector.applies(method, world));
 
     // Check that the declaration method in the declaration class is a target
     // for a typed selector on a subclass.
     cls = ensure(compiler, "B", compiler.coreLibrary.find);
     cls.ensureResolved(compiler);
-    typedSelector = new TypedSelector.exact(cls, selector, compiler);
-    Expect.isTrue(selector.applies(method, compiler));
-    Expect.isTrue(typedSelector.applies(method, compiler));
+    typedSelector = new TypedSelector.exact(cls, selector, world);
+    Expect.isTrue(selector.applies(method, world));
+    Expect.isTrue(typedSelector.applies(method, world));
   }));
 }
 
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 399c21e..ef0f575 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -609,7 +609,7 @@
   return MockCompiler.create((MockCompiler compiler) {
     ResolverVisitor visitor = compiler.resolverVisitor();
     Map mapping = compiler.resolveStatement("int f() {}").map;
-    Expect.equals(1, mapping.length);
+    Expect.equals(2, mapping.length);
     Element element;
     Node node;
     mapping.forEach((Node n, Element e) {
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 18409d8..5ecfce8 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -736,7 +736,8 @@
     checkReturn('returnInt8', typesTask.positiveIntType);
     checkReturn('returnEmpty1', const TypeMask.nonNullEmpty());
     checkReturn('returnEmpty2', const TypeMask.nonNullEmpty());
-    TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass);
+    TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass,
+        compiler.world);
     checkReturn('testIsCheck1', intType);
     checkReturn('testIsCheck2', intType);
     checkReturn('testIsCheck3', intType.nullable());
@@ -769,7 +770,7 @@
     checkReturn('testIf1', typesTask.uint31Type.nullable());
     checkReturn('testIf2', typesTask.uint31Type.nullable());
     checkReturn('returnAsString',
-        new TypeMask.subtype(compiler.stringClass));
+        new TypeMask.subtype(compiler.stringClass, compiler.world));
     checkReturn('returnIntAsNum', typesTask.uint31Type);
     checkReturn('returnAsTypedef', typesTask.functionType.nullable());
     checkReturn('returnTopLevelGetter', typesTask.uint31Type);
@@ -777,7 +778,7 @@
     checkReturn('testLabeledIf', typesTask.uint31Type.nullable());
     checkReturn('testSwitch1', simplify(
         typesTask.intType
-            .union(typesTask.doubleType, compiler)
+            .union(typesTask.doubleType, compiler.world)
             .nullable(),
         compiler));
     checkReturn('testSwitch2', typesTask.uint31Type);
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index bf7f0fe..7a3f570 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
@@ -184,7 +184,7 @@
     checkReturn('returnInt4', typesTask.uint31Type);
     checkReturn('returnInt5', typesTask.uint31Type);
     checkReturn('returnInt6',
-        new TypeMask.nonNullSubtype(compiler.intClass));
+        new TypeMask.nonNullSubtype(compiler.intClass, compiler.world));
 
     var subclassOfInterceptor =
         findTypeMask(compiler, 'Interceptor', 'nonNullSubclass');
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index 95ed88d..035b5b98 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -98,7 +98,7 @@
 
 void testUnion(MockCompiler compiler) {
   RuleSet ruleSet = new RuleSet('union',
-      (t1, t2) => simplify(t1.union(t2, compiler), compiler));
+      (t1, t2) => simplify(t1.union(t2, compiler.world), compiler));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
   check(type1, type2, predicate) => ruleSet.check(type1, type2, predicate);
 
@@ -386,7 +386,7 @@
 void testIntersection(MockCompiler compiler) {
   JavaScriptBackend backend = compiler.backend;
   RuleSet ruleSet = new RuleSet('intersection',
-                                (t1, t2) => t1.intersection(t2, compiler));
+      (t1, t2) => t1.intersection(t2, compiler.world));
   rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
 
   rule(emptyType, emptyType, emptyType);
@@ -520,9 +520,9 @@
   rule(jsIndexable, nonPrimitive1, emptyType);
   rule(jsIndexable, nonPrimitive2, emptyType);
   rule(jsIndexable, potentialArray, new TypeMask.nonNullSubtype(
-      backend.jsArrayClass));
+      backend.jsArrayClass, compiler.world));
   rule(jsIndexable, potentialString, new TypeMask.nonNullSubtype(
-      backend.jsStringClass));
+      backend.jsStringClass, compiler.world));
   rule(jsIndexable, jsBooleanOrNull, emptyType);
   rule(jsIndexable, jsNumberOrNull, emptyType);
   rule(jsIndexable, jsIntegerOrNull, emptyType);
@@ -671,14 +671,16 @@
 
 void testRegressions(MockCompiler compiler) {
   TypeMask nonNullPotentialString = new TypeMask.nonNullSubtype(
-      patternClass);
+      patternClass, compiler.world);
   Expect.equals(
-      potentialString, jsStringOrNull.union(nonNullPotentialString, compiler));
+      potentialString, jsStringOrNull.union(
+          nonNullPotentialString, compiler.world));
 }
 
 void main() {
   asyncTest(() => MockCompiler.create((MockCompiler compiler) {
     JavaScriptBackend backend = compiler.backend;
+    World world = compiler.world;
     backend.interceptorsLibrary.forEachLocalMember((element) {
       if (element.isClass) {
         compiler.enqueuer.resolution.registerInstantiatedClass(
@@ -694,40 +696,46 @@
     patternClass = compiler.coreLibrary.find('Pattern');
 
     nonPrimitive1 = new TypeMask.nonNullSubtype(
-        compiler.mapClass);
+        compiler.mapClass, world);
     nonPrimitive2 = new TypeMask.nonNullSubtype(
-        compiler.functionClass);
+        compiler.functionClass, world);
     potentialArray = new TypeMask.subtype(
-        compiler.listClass);
-    potentialString = new TypeMask.subtype(patternClass);
-    jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
-    jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
-    jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
-    jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
-    jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
+        compiler.listClass, world);
+    potentialString = new TypeMask.subtype(patternClass, world);
+    jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass,
+        world);
+    jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass, world);
+    jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass,
+        world);
+    jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass,
+        world);
+    jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass,
+        world);
     jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
     jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
     jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
-    jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
-    jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
-    jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
-    jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
+    jsExtendableArray = new TypeMask.nonNullExact(
+        backend.jsExtendableArrayClass);
+    jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass, world);
+    jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass, world);
+    jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass,
+        world);
     jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
     jsString = new TypeMask.nonNullExact(backend.jsStringClass);
     jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
-    jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
+    jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass, world);
     jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
     jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
     jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
-    jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
+    jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass, world);
     jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
     jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
     nullType = const TypeMask.empty();
     objectType = new TypeMask.nonNullSubclass(
-        compiler.objectClass);
+        compiler.objectClass, world);
     emptyType = const TypeMask.nonNullEmpty();
     dynamicType = new TypeMask.subclass(
-        compiler.objectClass);
+        compiler.objectClass, world);
 
     testUnion(compiler);
     testIntersection(compiler);
diff --git a/tests/compiler/dart2js/type_mask2_test.dart b/tests/compiler/dart2js/type_mask2_test.dart
new file mode 100644
index 0000000..dcc1ec9
--- /dev/null
+++ b/tests/compiler/dart2js/type_mask2_test.dart
@@ -0,0 +1,180 @@
+// 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 type_mask2_test;
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'type_test_helper.dart';
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/elements/elements.dart'
+       show Element, ClassElement;
+import 'package:compiler/implementation/types/types.dart';
+
+void main() {
+  testUnionTypeMaskFlatten();
+}
+
+void testUnionTypeMaskFlatten() {
+  asyncTest(() => TypeEnvironment.create(r"""
+      class A {}
+      class B {}
+      class C extends A {}
+      class D implements A {}
+      class E extends B implements A {}
+      """,
+      mainSource: r"""
+      main() {
+        new A();
+        new B();
+        new C();
+        new D();
+        new E();
+      }
+      """,
+      useMockCompiler: false).then((env) {
+    var classWorld = env.compiler.world;
+
+    ClassElement Object_ = env.getElement("Object");
+    ClassElement A = env.getElement("A");
+    ClassElement B = env.getElement("B");
+    ClassElement C = env.getElement("C");
+    ClassElement D = env.getElement("D");
+    ClassElement E = env.getElement("E");
+
+    List<ClassElement> allClasses = <ClassElement>[Object_, A, B, C, D, E];
+
+    check(List<FlatTypeMask> masks,
+          {FlatTypeMask result,
+           List<FlatTypeMask> disjointMasks,
+           FlatTypeMask flattened,
+           List<ClassElement> containedClasses}) {
+      List<FlatTypeMask> disjoint = <FlatTypeMask>[];
+      UnionTypeMask.unionOfHelper(masks, disjoint, classWorld);
+      Expect.listEquals(disjointMasks, disjoint,
+          'Unexpected disjoint masks: $disjoint, expected $disjointMasks.');
+      if (flattened == null) {
+        Expect.throws(() => UnionTypeMask.flatten(disjoint, classWorld),
+          (e) => e is AssertionError,
+          'Expect assertion failure on flattening of $disjoint.');
+      } else {
+        TypeMask flattenResult =
+            UnionTypeMask.flatten(disjoint, classWorld);
+        Expect.equals(flattened, flattenResult,
+            'Unexpected flattening of $disjoint: '
+            '$flattenResult, expected $flattened.');
+      }
+      var union = UnionTypeMask.unionOf(masks, classWorld);
+      if (result == null) {
+        Expect.isTrue(union is UnionTypeMask,
+            'Expected union of $masks to be a union-type: $union.');
+        Expect.listEquals(disjointMasks, union.disjointMasks,
+            'Unexpected union masks: '
+            '${union.disjointMasks}, expected $disjointMasks.');
+      } else {
+        Expect.equals(result, union,
+            'Unexpected union of $masks: $union, expected $result.');
+      }
+      if (containedClasses != null) {
+        for (ClassElement cls in allClasses) {
+          if (containedClasses.contains(cls)) {
+            Expect.isTrue(union.contains(cls, classWorld),
+                'Expected $union to contain $cls.');
+          } else {
+            Expect.isFalse(union.contains(cls, classWorld),
+                '$union not expected to contain $cls.');
+          }
+        }
+
+      }
+      return union;
+    }
+
+    TypeMask empty = const TypeMask.nonNullEmpty();
+    TypeMask subclassObject = new TypeMask.nonNullSubclass(Object_, classWorld);
+    TypeMask exactA = new TypeMask.nonNullExact(A);
+    TypeMask subclassA = new TypeMask.nonNullSubclass(A, classWorld);
+    TypeMask subtypeA = new TypeMask.nonNullSubtype(A, classWorld);
+    TypeMask exactB = new TypeMask.nonNullExact(B);
+    TypeMask subclassB = new TypeMask.nonNullSubclass(B, classWorld);
+    TypeMask exactC = new TypeMask.nonNullExact(C);
+    TypeMask exactD = new TypeMask.nonNullExact(D);
+    TypeMask exactE = new TypeMask.nonNullExact(E);
+
+    check([],
+          result: empty,
+          disjointMasks: [],
+          containedClasses: []);
+
+    check([exactA],
+          result: exactA,
+          disjointMasks: [exactA],
+          containedClasses: [A]);
+
+    check([exactA, exactA],
+          result: exactA,
+          disjointMasks: [exactA],
+          containedClasses: [A]);
+
+    check([exactA, exactB],
+          disjointMasks: [exactA, exactB],
+          flattened: subclassObject,
+          containedClasses: [A, B]);
+
+    check([subclassObject],
+          result: subclassObject,
+          disjointMasks: [subclassObject],
+          containedClasses: [Object_, A, B, C, D, E]);
+
+    check([subclassObject, exactA],
+          disjointMasks: [subclassObject],
+          result: subclassObject,
+          containedClasses: [Object_, A, B, C, D, E]);
+
+    check([exactA, exactC],
+          disjointMasks: [subclassA],
+          result: subclassA,
+          containedClasses: [A, C]);
+
+    check([exactA, exactB, exactC],
+          disjointMasks: [subclassA, exactB],
+          flattened: subclassObject,
+          containedClasses: [A, B, C]);
+
+    check([exactA, exactD],
+          disjointMasks: [subtypeA],
+          result: subtypeA,
+          containedClasses: [A, C, D, E]);
+
+    check([exactA, exactB, exactD],
+          disjointMasks: [subtypeA, exactB],
+          flattened: subclassObject,
+          containedClasses: [A, B, C, D, E]);
+
+    check([exactA, exactE],
+          disjointMasks: [subtypeA],
+          result: subtypeA,
+          containedClasses: [A, C, D, E]);
+
+    check([exactA, exactB, exactE],
+          disjointMasks: [subtypeA, exactB],
+          flattened: subclassObject,
+          containedClasses: [A, B, C, D, E]);
+
+    check([exactB, exactE, exactA],
+          disjointMasks: [subclassB, exactA],
+          flattened: subclassObject,
+          containedClasses: [A, B, E]);
+
+    check([exactE, exactA, exactB],
+          disjointMasks: [subtypeA, exactB],
+          flattened: subclassObject,
+          containedClasses: [A, B, C, D, E]);
+
+    check([exactE, exactB, exactA],
+          disjointMasks: [subclassB, exactA],
+          flattened: subclassObject,
+          containedClasses: [A, B, E]);
+  }));
+}
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
index c1cc2fa..984b1d8 100644
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -12,28 +12,51 @@
 class A {}
 class B extends A {}
 class C implements A {}
+class D implements A {}
 main() {
-  print([new A(), new B(), new C()]);
+  print([new A(), new B(), new C(), new D()]);
 }
 """;
 
 main() {
   Uri uri = new Uri(scheme: 'source');
   var compiler = compilerFor(CODE, uri);
+  var classWorld = compiler.world;
 
   asyncTest(() => compiler.runCompiler(uri).then((_) {
     var classA = findElement(compiler, 'A');
     var classB = findElement(compiler, 'B');
     var classC = findElement(compiler, 'C');
+    var classD = findElement(compiler, 'D');
 
-    var exactA = new TypeMask.exact(classA);
-    var exactB = new TypeMask.exact(classB);
-    var exactC = new TypeMask.exact(classC);
+    var exactA = new TypeMask.nonNullExact(classA);
+    var exactB = new TypeMask.nonNullExact(classB);
+    var exactC = new TypeMask.nonNullExact(classC);
+    var exactD = new TypeMask.nonNullExact(classD);
 
-    var subclassA = new TypeMask.subclass(classA);
-    var subtypeA = new TypeMask.subtype(classA);
+    var subclassA = new TypeMask.nonNullSubclass(classA, classWorld);
+    var subtypeA = new TypeMask.nonNullSubtype(classA, classWorld);
 
-    rule(a, b, c) => Expect.equals(c, a.isInMask(b, compiler));
+    var subclassObject = new TypeMask.nonNullSubclass(compiler.objectClass,
+        classWorld);
+
+    var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], classWorld);
+    var unionABnC = UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC],
+        classWorld);
+    var unionAB = UnionTypeMask.unionOf([exactA, exactB], classWorld);
+    var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], classWorld);
+    var unionSubclassAC = UnionTypeMask.unionOf([subclassA, exactC],
+        classWorld);
+    var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], classWorld);
+    var unionBCDn = UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()],
+        classWorld);
+
+    Expect.isFalse(unionABC.isNullable);
+    Expect.isTrue(unionABnC.isNullable);
+    Expect.isFalse(unionBCD.isNullable);
+    Expect.isTrue(unionBCDn.isNullable);
+
+    rule(a, b, c) => Expect.equals(c, a.isInMask(b, classWorld));
 
     rule(exactA, exactA, true);
     rule(exactA, exactB, false);
@@ -64,5 +87,41 @@
     rule(subtypeA, exactC, false);
     rule(subtypeA, subclassA, false);
     rule(subtypeA, subtypeA, true);
+
+    rule(unionABC, unionSubtypeAC, true);
+    rule(unionSubtypeAC, unionABC, true);
+    rule(unionAB, unionSubtypeAC, true);
+    rule(unionSubtypeAC, unionAB, false);
+    rule(unionABC, unionSubclassAC, true);
+    rule(unionSubclassAC, unionABC, true);
+    rule(unionAB, unionSubclassAC, true);
+    rule(unionSubclassAC, unionAB, false);
+    rule(unionAB, subclassA, true);
+    rule(subclassA, unionAB, true);
+    rule(unionABC, subtypeA, true);
+    rule(subtypeA, unionABC, true);
+    rule(unionABC, subclassA, false);
+    rule(subclassA, unionABC, true);
+    rule(unionAB, subclassA, true);
+    rule(subclassA, unionAB, true);
+
+    rule(exactA, subclassObject, true);
+    rule(exactB, subclassObject, true);
+    rule(subclassA, subclassObject, true);
+    rule(subtypeA, subclassObject, true);
+    rule(unionABC, subclassObject, true);
+    rule(unionAB, subclassObject, true);
+    rule(unionSubtypeAC, subclassObject, true);
+    rule(unionSubclassAC, subclassObject, true);
+
+    rule(unionABnC, unionABC, false);
+    rule(unionABC, unionABnC, true);
+    rule(exactA.nullable(), unionABnC, true);
+    rule(exactA.nullable(), unionABC, false);
+    rule(exactB, unionABnC, true);
+    rule(unionBCDn, unionBCD, false);
+    rule(unionBCD, unionBCDn, true);
+    rule(exactB.nullable(), unionBCDn, true);
+    rule(exactB.nullable(), unionBCD, false);
   }));
 }
diff --git a/tests/compiler/dart2js/type_mask_test_helper.dart b/tests/compiler/dart2js/type_mask_test_helper.dart
index 129ec7a..f348138 100644
--- a/tests/compiler/dart2js/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/type_mask_test_helper.dart
@@ -12,7 +12,7 @@
   if (mask is ForwardingTypeMask) {
     return simplify(mask.forwardTo, compiler);
   } else if (mask is UnionTypeMask) {
-    return UnionTypeMask.flatten(mask.disjointMasks, compiler);
+    return UnionTypeMask.flatten(mask.disjointMasks, compiler.world);
   } else {
     return mask;
   }
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index 20859ba..34fa22a 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -32,19 +32,26 @@
   static Future<TypeEnvironment> create(
       String source, {bool useMockCompiler: true,
                       bool expectNoErrors: false,
-                      bool expectNoWarningsOrErrors: false}) {
+                      bool expectNoWarningsOrErrors: false,
+                      bool stopAfterTypeInference: false,
+                      String mainSource}) {
     Uri uri;
     Function getErrors;
     Function getWarnings;
     Compiler compiler;
+    bool stopAfterTypeInference = mainSource != null;
+    if (mainSource == null) {
+      source = 'main() {}\n$source';
+    } else {
+      source = '$mainSource\n$source';
+    }
     if (useMockCompiler) {
       uri = new Uri(scheme: 'source');
-      mock.MockCompiler mockCompiler = mock.compilerFor('''
-          main() {}
-          $source''',
+      mock.MockCompiler mockCompiler = mock.compilerFor(
+          source,
           uri,
-          analyzeAll: true,
-          analyzeOnly: true);
+          analyzeAll: !stopAfterTypeInference,
+          analyzeOnly: !stopAfterTypeInference);
       getErrors = () => mockCompiler.errors;
       getWarnings = () => mockCompiler.warnings;
       compiler = mockCompiler;
@@ -54,10 +61,12 @@
       compiler = memory.compilerFor(
           {'main.dart': source},
           diagnosticHandler: collector,
-          options: ['--analyze-all', '--analyze-only']);
+          options: stopAfterTypeInference 
+              ? [] : ['--analyze-all', '--analyze-only']);
       getErrors = () => collector.errors;
       getWarnings = () => collector.warnings;
     }
+    compiler.stopAfterTypeInference = stopAfterTypeInference;
     return compiler.runCompiler(uri).then((_) {
       if (expectNoErrors || expectNoWarningsOrErrors) {
         var errors = getErrors();
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/union_type_test.dart
index 966d4c5..ae59da3 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/union_type_test.dart
@@ -19,8 +19,8 @@
         new FlatTypeMask.exact(compiler.intClass);
     FlatTypeMask mask2 =
         new FlatTypeMask.exact(compiler.stringClass);
-    UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler);
-    UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler);
+    UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler.world);
+    UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler.world);
     Expect.equals(union1, union2);
   }));
 }
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index a741052..ce5e49c 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -11,9 +11,6 @@
 native_no_such_method_exception4_frog_test: Fail  # Issue 9631
 native_no_such_method_exception5_frog_test: Fail  # Issue 9631
 
-[ $compiler == dart2js && $unminified ]
-fake_thing_test: Fail # Issue 13010
-
 [ $compiler == dart2js && $minified ]
 optimization_hints_test: Fail, OK # Test relies on unminified names.
 
diff --git a/tests/compiler/dart2js_native/js_const_test.dart b/tests/compiler/dart2js_native/js_const_test.dart
new file mode 100644
index 0000000..710323a
--- /dev/null
+++ b/tests/compiler/dart2js_native/js_const_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.
+
+import 'package:expect/expect.dart';
+
+import 'dart:_foreign_helper' show JS, JS_CONST;
+
+test1() {
+  var re = const JS_CONST(r'/-([\da-z])/ig');
+  var fToUpper = const JS_CONST(
+      r'function(_, letter){return letter.toUpperCase()}');
+  var s1 = '-hello-world';
+  var s2 = JS('String', r'#.replace(#, #)', s1, re, fToUpper);
+  Expect.equals('HelloWorld', s2);
+
+  s1 = 'hello-world';
+  s2 = JS('String', r'#.replace(#, #)', s1, re, fToUpper);
+  Expect.equals('helloWorld', s2);
+}
+
+main() {
+  test1();
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 11c51f2..5093dba 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -80,6 +80,9 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 main_test: Fail  # Dartium needs to check for both main() and main(args).
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+core_runtime_types_test: Pass, Fail # Issue 20525
+
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
 unicode_test: Fail
 
@@ -98,6 +101,7 @@
 unicode_test: Fail # Issue 14694
 
 [ $compiler == dart2js ]
+growable_list_test: RuntimeError # Fails to detect concurrent modification in addAll.
 error_stack_trace1_test: RuntimeError # Issue 12399
 hash_set_test/01: RuntimeError # Issue 11551
 integer_to_string_test/01: RuntimeError # Issue 1533
diff --git a/tests/corelib/growable_list_test.dart b/tests/corelib/growable_list_test.dart
new file mode 100644
index 0000000..98b4e1f
--- /dev/null
+++ b/tests/corelib/growable_list_test.dart
@@ -0,0 +1,133 @@
+// 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.
+
+// Sanity check on the growing behavior of a growable list.
+
+import "package:expect/expect.dart";
+import "dart:collection" show IterableBase;
+
+// Iterable generating numbers in range [0..count).
+// May perform callback at some point underways.
+class TestIterableBase extends IterableBase<int> {
+  final int length;
+  final int count;
+  // call [callback] if generating callbackIndex.
+  final int callbackIndex;
+  final Function callback;
+  TestIterableBase(this.length, this.count,
+                   this.callbackIndex, this.callback);
+  Iterator<int> get iterator => new CallbackIterator(this);
+}
+
+class TestIterable extends TestIterableBase {
+  TestIterable(count, [callbackIndex = -1, callback])
+      : super(-1, count, callbackIndex, callback);
+  int get length => throw "SHOULD NOT BE CALLED";
+}
+
+// Implement Set for private EfficientLength interface.
+class EfficientTestIterable extends TestIterableBase
+                            implements Set<int> {
+  EfficientTestIterable(length, count, [callbackIndex = -1, callback])
+      : super(length, count, callbackIndex, callback);
+  // Avoid warnings because we don't actually implement Set.
+  noSuchMethod(i) => super.noSuchMethod(i);
+}
+
+class CallbackIterator implements Iterator<int> {
+  TestIterableBase _iterable;
+  int _current = null;
+  int _nextIndex = 0;
+  CallbackIterator(this._iterable);
+  bool moveNext() {
+    if (_nextIndex >= _iterable.count) {
+      _current = null;
+      return false;
+    }
+    _current = _nextIndex;
+    _nextIndex++;
+    if (_current == _iterable.callbackIndex) {
+      _iterable.callback();
+    }
+    return true;
+  }
+  int get current => _current;
+}
+
+
+void main() {
+  // Without EfficientLength interface
+  {
+    // Change length of list after 20 additions.
+    var l = [];
+    var ci = new TestIterable(257, 200, () {
+      l.add("X");
+    });
+    Expect.throws(() {
+      l.addAll(ci);
+    }, (e) => e is ConcurrentModificationError);
+  }
+
+  {
+    // Change length of list after 20 additions.
+    var l = [];
+    var ci = new TestIterable(257, 200, () {
+      l.length = 0;
+    });
+    Expect.throws(() {
+      l.addAll(ci);
+    }, (e) => e is ConcurrentModificationError);
+  }
+
+  // With EfficientLength interface (uses length).
+  {
+    // Change length of list after 20 additions.
+    var l = [];
+    var ci = new EfficientTestIterable(257, 257, 20, () {
+      l.add("X");
+    });
+    Expect.throws(() {
+      l.addAll(ci);
+    }, (e) => e is ConcurrentModificationError);
+  }
+
+  {
+    var l = [];
+    var ci = new EfficientTestIterable(257, 257, 20, () {
+      l.length = 0;
+    });
+    Expect.throws(() {
+      l.addAll(ci);
+    }, (e) => e is ConcurrentModificationError);
+  }
+
+  {
+    // Length 50, only 25 elements.
+    var l = [];
+    var ci = new EfficientTestIterable(500, 250);
+    l.addAll(ci);
+    Expect.listEquals(new List.generate(250, (x)=>x), l);
+  }
+
+  {
+    // Length 25, but 50 elements.
+    var l = [];
+    var ci = new EfficientTestIterable(250, 500);
+    l.addAll(ci);
+    Expect.listEquals(new List.generate(500, (x)=>x), l);
+  }
+
+  {
+    // Adding to yourself.
+    var l = [1];
+    Expect.throws(() { l.addAll(l); }, (e) => e is ConcurrentModificationError);
+  }
+
+  {
+    // Adding to yourself.
+    var l = [1, 2, 3];
+    Expect.throws(() { l.addAll(l); }, (e) => e is ConcurrentModificationError);
+  }
+}
+
diff --git a/tests/corelib/iterable_return_type_test.dart b/tests/corelib/iterable_return_type_test.dart
index a16e1e5..023384e 100644
--- a/tests/corelib/iterable_return_type_test.dart
+++ b/tests/corelib/iterable_return_type_test.dart
@@ -18,7 +18,6 @@
 void testIterable(Iterable<int> iterable, [int depth = 3]) {
   testIntIterable(iterable);
   if (depth > 0) {
-    testIterable(iterable, depth - 1);
     testIterable(iterable.where((x) => true), depth - 1);
     testIterable(iterable.skip(1), depth - 1);
     testIterable(iterable.take(1), depth - 1);
diff --git a/tests/corelib/string_replace_test.dart b/tests/corelib/string_replace_test.dart
index 136cc96..df426fa 100644
--- a/tests/corelib/string_replace_test.dart
+++ b/tests/corelib/string_replace_test.dart
@@ -42,6 +42,51 @@
 
     // Test replacing the empty string.
     Expect.equals("toAtoBtoCto", "AtoBtoCto".replaceFirst("", "to"));
+
+    // Test startIndex.
+    Expect.equals(
+        "foo-AAA-foo-bar", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 4));
+
+    // Test startIndex skipping one case at the begining.
+    Expect.equals(
+        "foo-bar-AAA-bar", "foo-bar-foo-bar".replaceFirst("foo", "AAA", 1));
+
+    // Test startIndex skipping one case at the begining.
+    Expect.equals(
+        "foo-bar-foo-AAA", "foo-bar-foo-bar".replaceFirst("bar", "AAA", 5));
+
+    // Test startIndex replacing with the empty string.
+    Expect.equals(
+        "foo-bar--bar", "foo-bar-foo-bar".replaceFirst("foo", "", 1));
+
+    // Test startIndex with a RegExp with carat
+    Expect.equals(
+        "foo-bar-foo-bar",
+        "foo-bar-foo-bar".replaceFirst(new RegExp(r"^foo"), "", 8));
+
+    // Test startIndex with a RegExp
+    Expect.equals(
+        "aaa{3}X{3}", "aaa{3}aaa{3}".replaceFirst(new RegExp(r"a{3}"), "X", 1));
+
+    // Test startIndex with regexp-looking String
+    Expect.equals(
+        "aaa{3}aaX", "aaa{3}aaa{3}".replaceFirst("a{3}", "X", 3));
+
+    // Test negative startIndex
+    Expect.throws(
+        () => "hello".replaceFirst("h", "X", -1), (e) => e is RangeError);
+
+    // Test startIndex too large
+    Expect.throws(
+        () => "hello".replaceFirst("h", "X", 6), (e) => e is RangeError);
+
+    // Test null startIndex
+    Expect.throws(
+        () => "hello".replaceFirst("h", "X", null), (e) => e is ArgumentError);
+
+    // Test object startIndex
+    Expect.throws(
+        () => "hello".replaceFirst("h", "X", new Object()));
   }
 }
 
diff --git a/tests/html/element_add_test.dart b/tests/html/element_add_test.dart
index 0f9cc2e..778fa33 100644
--- a/tests/html/element_add_test.dart
+++ b/tests/html/element_add_test.dart
@@ -74,6 +74,18 @@
       expect(el.nodes.length, equals(1));
     });
 
+    test('htmlelement', () {
+      var el = new DivElement();
+      var twoNewLines = "\n\n";
+      el.appendText(twoNewLines);
+      // No children were created.
+      expect(el.children.length, equals(0));
+      // One text node was added.
+      expect(el.nodes.length, equals(1));
+      expect(el.nodes[0], isText);
+      expect(el.nodes[0].text, equals(twoNewLines));
+    });
+
     test('documentFragment', () {
       var fragment = new DocumentFragment();
       fragment.appendText('foo');
diff --git a/tests/html/html.status b/tests/html/html.status
index 7c90bd5..dc3a830 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -14,6 +14,9 @@
 indexeddb_4_test: Skip # Issue 19726
 mouse_event_test: Fail # Issue 20437
 
+[ $compiler == none && $mode == debug && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
+datalistelement_test: Skip # Issue 20540
+
 [ $compiler == dart2js && $csp ]
 custom/js_custom_test: Fail # Issue 14643
 custom/element_upgrade_test: Fail # Issue 17298
@@ -46,6 +49,8 @@
 audiobuffersourcenode_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 audiocontext_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
+canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass, Fail # Issue 20524
+
 element_offset_test/offset: RuntimeError # Issue 17550
 request_animation_frame_test: Skip # Times out, and also passes while taking 4.00 minutes. Issue 19127.
 fileapi_test/fileEntry: RuntimeError # Issue 20488
@@ -117,11 +122,9 @@
 js_test: Fail # Issue 14246
 element_test/click: Fail                # IE does not support firing this event.
 serialized_script_value_test: Fail
-transferables_test: Fail # Issue 9846
 websocket_test/websocket: Fail # TODO(efortuna): Issue 7875.
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # IE does not support drawImage w/ video element
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # IE does not support drawImage w/ video element
-worker_test/functional: Fail # IE uses incorrect security context for Blob URIs.
 
 [$runtime == ie10 ]
 # IE10 Feature support statuses-
@@ -165,10 +168,15 @@
 xhr_test/json: Fail # IE10 returns string, not JSON object
 xhr_test/supported_overrideMimeType: Fail
 xsltprocessor_test/supported: Fail
+worker_test/functional: Fail # IE uses incorrect security context for Blob URIs.
+transferables_test: Fail # Issue 9846
 
 [ $runtime == ie11 ]
 custom/document_register_type_extensions_test/single-parameter: Fail # Issue 13193.
 canvasrenderingcontext2d_test/arc: Pass, Fail # Pixel unexpected value. Please triage this failure.
+node_validator_test: Pass, RuntimeError # Issues 20657, 20659.
+worker_test/functional: Pass, Fail # Issues 20659.
+transferables_test: Pass, Fail # Issues 20659.
 
 # IE11 Feature support statuses-
 # These results not yet noted in platform support annotations.
diff --git a/tests/language/async_control_structures_test.dart b/tests/language/async_control_structures_test.dart
index beb875a..aca024a 100644
--- a/tests/language/async_control_structures_test.dart
+++ b/tests/language/async_control_structures_test.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.
 
-// VMOptions=--enable_async
+// VMOptions=--enable_async --optimization-counter-threshold=10
 
 import 'package:expect/expect.dart';
 
@@ -69,27 +69,29 @@
 main() {
   var asyncReturn;
 
-  asyncReturn = asyncIf(true);
-  expectThenValue(asyncReturn, 1);
-  asyncReturn = asyncIf(false);
-  expectThenValue(asyncReturn, 2);
+  for (int i = 0; i < 10; i++) {
+    asyncReturn = asyncIf(true);
+    expectThenValue(asyncReturn, 1);
+    asyncReturn = asyncIf(false);
+    expectThenValue(asyncReturn, 2);
 
-  asyncReturn = asyncFor(true);
-  expectThenValue(asyncReturn, 1);
-  asyncReturn = asyncFor(false);
-  expectThenValue(asyncReturn, 2);
+    asyncReturn = asyncFor(true);
+    expectThenValue(asyncReturn, 1);
+    asyncReturn = asyncFor(false);
+    expectThenValue(asyncReturn, 2);
 
-  asyncReturn = asyncTryCatchFinally(true, false);
-  expectThenValue(asyncReturn, 3);
-  asyncReturn = asyncTryCatchFinally(false, false);
-  expectThenValue(asyncReturn, 1);
-  asyncReturn = asyncTryCatchFinally(true, true);
-  expectThenValue(asyncReturn, 3);
-  asyncReturn = asyncTryCatchFinally(false, true);
-  expectThenValue(asyncReturn, 444);
-  asyncReturn = asyncTryCatchLoop();
-  expectThenValue(asyncReturn, 13);
+    asyncReturn = asyncTryCatchFinally(true, false);
+    expectThenValue(asyncReturn, 3);
+    asyncReturn = asyncTryCatchFinally(false, false);
+    expectThenValue(asyncReturn, 1);
+    asyncReturn = asyncTryCatchFinally(true, true);
+    expectThenValue(asyncReturn, 3);
+    asyncReturn = asyncTryCatchFinally(false, true);
+    expectThenValue(asyncReturn, 444);
+    asyncReturn = asyncTryCatchLoop();
+    expectThenValue(asyncReturn, 13);
 
-  asyncReturn = asyncImplicitReturn();
-  expectThenValue(asyncReturn, null);
+    asyncReturn = asyncImplicitReturn();
+    expectThenValue(asyncReturn, null);
+  }
 }
diff --git a/tests/language/await_backwards_compatibility_test.dart b/tests/language/await_backwards_compatibility_test.dart
new file mode 100644
index 0000000..5b25b17
--- /dev/null
+++ b/tests/language/await_backwards_compatibility_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable_async
+
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+
+get await => 4;
+
+// For functions that are declared with the async modifier we treat await as
+// keyword.
+
+test0() async {
+  var x = await 7;
+  Expect.equals(7, x);
+  var await = 1;  /// await1: compile-time error
+}
+
+test1() async {
+  var x = await 9;
+  Expect.equals(9, x);
+  var y = await;  /// await2: compile-time error
+}
+
+// For functions that are not declared with the async modifier we allow await to
+// be used as an identifier.
+
+test2() {
+  var y = await;
+  Expect.equals(4, y);
+  var x = await 1;  /// await3: compile-time error
+}
+
+test3() {
+  var await = 3;
+  Expect.equals(3, await);
+  var x = await 1;  /// await4: compile-time error
+}
+
+main() {
+  test0();
+  test1();
+  test2();
+  test3();
+}
diff --git a/tests/language/await_future_test.dart b/tests/language/await_future_test.dart
new file mode 100644
index 0000000..9811f37
--- /dev/null
+++ b/tests/language/await_future_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.
+
+// VMOptions=--enable_async --optimization-counter-threshold=5
+
+import 'package:expect/expect.dart';
+
+import 'dart:async';
+
+// It does not matter where a future is generated.
+bar(p) async => p;
+baz(p) => new Future(() => p);
+
+foo() async {
+  var b = 0;
+  for(int i = 0; i < 10; i++) {
+    b += (await bar(1)) + (await baz(2));
+  }
+  return b;
+}
+
+quaz(p) async {
+  var x = 0;
+  try {
+    for (var j = 0; j < 10; j++) {
+      x += await baz(j);
+    }
+    return x;
+  } finally {
+    Expect.equals(x, 45);
+    return p;
+  }
+}
+
+quazz() async {
+  var x = 0;
+  try {
+    try {
+      x = await bar(1);
+      throw x;
+    } catch (e1) {
+      var y = await baz(e1 + 1);
+      throw y;
+    }
+  } catch (e2) {
+    return e2;
+  }
+}
+
+main() async {
+  var result;
+  for (int i = 0; i < 10; i++) {
+    result = await foo();
+    Expect.equals(result, 30);
+    result = await quaz(17);
+    Expect.equals(result, 17);
+    result = await quazz();
+    Expect.equals(result, 2);
+  }
+}
diff --git a/tests/language/await_test.dart b/tests/language/await_test.dart
new file mode 100644
index 0000000..ef2b56f
--- /dev/null
+++ b/tests/language/await_test.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.
+
+// VMOptions=--enable_async --optimization-counter-threshold=10
+
+import 'package:expect/expect.dart';
+
+import 'dart:async';
+
+int globalVariable = 1;
+int topLevelFoo(int param) => 1;
+int get topLevelGetter => globalVariable;
+int set topLevelSetter(val) {
+  globalVariable = val;
+}
+
+class C {
+  static int staticField = 1;
+  static int get staticGetter => staticField;
+  static int set staticSetter(val) {
+    staticField = val;
+  }
+  static int staticFoo(int param) => param;
+  
+  int field = 1;
+  int get getter => field;
+  int set setter(val) {
+    field = val;
+  }
+  int foo(int param) => param;
+}
+
+dummy() => 1;
+
+staticMembers() async {
+  var a = C.staticField + await dummy();
+  Expect.equals(a, 2);
+  var f = (C.staticField = 1) + await dummy();
+  Expect.equals(f, 2);
+  var b = C.staticGetter + await dummy();
+  Expect.equals(b, 2);
+  var c = (C.staticSetter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = C.staticFoo(2) + await dummy();
+  Expect.equals(d, 3);
+  var e = C.staticField +
+          C.staticGetter +
+          (C.staticSetter = 1) +
+          C.staticFoo(1) +
+          await dummy();
+  Expect.equals(e, 5);
+}
+
+topLevelMembers() async {
+  var a = globalVariable + await dummy();
+  Expect.equals(a, 2);
+  var b = topLevelGetter + await dummy();
+  Expect.equals(b, 2);
+  var c = (topLevelSetter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = topLevelFoo(1) + await dummy();
+  Expect.equals(d, 2);
+  var e = globalVariable +
+          topLevelGetter +
+          (topLevelSetter = 1) +
+          topLevelFoo(1) +
+          await dummy();
+  Expect.equals(e, 5);
+}
+
+instanceMembers() async {
+  var inst = new C();
+  var a = inst.field + await dummy();
+  Expect.equals(a, 2);
+  var b = inst.getter + await dummy();
+  Expect.equals(b, 2);
+  var c = (inst.setter = 1) + await dummy();
+  Expect.equals(c, 2);
+  var d = inst.foo(1) + await dummy();
+  Expect.equals(d, 2);
+  var e = inst.field +
+          inst.getter +
+          (inst.setter = 1) +
+          inst.foo(1) +
+          await dummy();
+  Expect.equals(e, 5);
+}
+
+await() => 4;
+nonAsyncFunction() => await();
+
+others() async {
+  var a = "${globalVariable} ${await dummy()} " + await "someString";
+  Expect.equals(a, "1 1 someString");
+  try {
+    var c = new C();
+    var d = c.nooooo() + await bar();
+  } catch (e) {}
+  var cnt = 2;
+  var b = [1,2,3];
+  b[cnt] = await dummy();
+  Expect.equals(b[cnt], 1);
+  var e = b[0] + await dummy();
+  Expect.equals(e, 2);
+  Expect.equals(nonAsyncFunction(), 4);
+}
+
+conditionals() async {
+  var a = false;
+  var b = true;
+  var c = (a || b) || await dummy();
+  Expect.isTrue(c);
+  var d = (a || b) ? a : await dummy();
+  Expect.isFalse(d);
+  var e = (a is int) ? await dummy() : 2;
+  Expect.equals(e, 2);
+  try {
+    var f = (a is intt) ? await dummy() : 2;
+  } catch(e) {}
+}
+
+main() {
+  for (int i = 0; i < 10; i++) {
+    staticMembers();
+    topLevelMembers();
+    instanceMembers();
+    conditionals();
+    others();
+  }
+}
+
diff --git a/tests/language/bad_raw_string_negative_test.dart b/tests/language/bad_raw_string_negative_test.dart
new file mode 100644
index 0000000..89b4659
--- /dev/null
+++ b/tests/language/bad_raw_string_negative_test.dart
@@ -0,0 +1,9 @@
+// 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.
+
+main() {
+  // Raw String may not contain newline (may not be multi-line).
+  print(r'
+');
+}
diff --git a/tests/language/constructor_duplicate_final_test.dart b/tests/language/constructor_duplicate_final_test.dart
new file mode 100644
index 0000000..8f977b6
--- /dev/null
+++ b/tests/language/constructor_duplicate_final_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.
+
+// Check that duplicate initialization of a final field is a runtime error.
+
+
+class Class {
+  final f = 10;
+
+  Class(v) : f = v;  /// 01: runtime error, static type warning
+
+  Class(this.f);  /// 02: runtime error, static type warning
+
+  // If a field is initialized multiple times in the initializer
+  // list, it's a compile time error.
+  Class(this.f) : f = 0;  /// 03: compile-time error
+}
+
+main() {
+  new Class(5);  /// 01: continued
+  new Class(5);  /// 02: continued
+  new Class(5);  /// 03: continued
+}
diff --git a/tests/language/import_self_test.dart b/tests/language/import_self_test.dart
new file mode 100644
index 0000000..e193f7d
--- /dev/null
+++ b/tests/language/import_self_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.
+//
+// Check that private names cannot be imported even if the library imports
+// itself.
+
+library import_self;
+
+import "package:expect/expect.dart";
+
+// Eliminate the import of the unmodified file or else the analyzer
+// will generate the static warning in the import_self_test_none case.
+import "import_self_test.dart" as p;  /// 01: continued
+
+var _x = "The quick brown fox jumps over the dazy log";
+
+main() {
+  var t = "Falsches Üben von Xylophonmusik quält jeden größeren Zwerg";
+
+  // Check that referencing p._x causes a warning from the analyzer,
+  // and the runtime fails to resolve p._x, even though it refers to
+  // top level variable _x of this file.
+  Expect.throws(() { t = p._x; },  /// 01: static type warning
+                (e) => e is NoSuchMethodError);  /// 01: continued
+
+  Expect.isTrue(t.endsWith("Zwerg"));
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index c636a06..c8d875a 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -32,14 +32,20 @@
 deferred_constraints_constants_old_syntax_test/constructor2: Fail, Ok
 
 [ $runtime != vm ]
-# Async tests are currently only supported by the vm.
+# Async/await is currently only supported by the vm.
 async_test/*: Skip
 async_control_structures_test: Skip
+await_test: Skip
+await_future_test: Skip
+await_backwards_compatibility_test/*: Skip
 
 [ $compiler == dart2dart]
-# Async tests are not yet supported in dart2dart.
+# Async/await not yet supported in dart2dart.
 async_test/*: Skip
 async_control_structures_test: Skip
+await_test: Skip
+await_future_test: Skip
+await_backwards_compatibility_test/*: Skip
 deferred_load_library_wrong_args_test/none: Fail # Issue 17523
 deferred_load_inval_code_test: Fail # Issue 17523
 deferred_not_loaded_check_test: Fail # Issue 17523
@@ -100,9 +106,6 @@
 dynamic_prefix_core_test/none: Fail # Issue 12478
 export_ambiguous_main_negative_test: Fail # Issue 14763
 
-[ $compiler == dart2js && $runtime == ie9 ]
-lazy_static3_test: Fail # Issue 13469
-
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
 assertion_test: Fail # Issue 13719: Please triage this failure.
 generic_test: Fail # Issue 13719: Please triage this failure.
@@ -141,4 +144,7 @@
 stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
 large_class_declaration_test: Skip # Times out. Issue 20352
 
+[ $compiler == none && ($runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) && $mode == debug ]
+large_class_declaration_test: Skip # Times out. Issue 20352
+
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 2beeedd..b72e2af 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -18,6 +18,8 @@
 external_test/21: Fail
 external_test/24: Fail
 external_test/25: Fail
+constructor_duplicate_final_test/03: Fail
+
 
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index d8d25d5..89067a9 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -18,6 +18,8 @@
 external_test/21: Fail
 external_test/24: Fail
 external_test/25: Fail
+constructor_duplicate_final_test/03: Fail
+
 
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 498301e..0410018 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -3,6 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2js || $compiler == dart2dart ]
+constructor_duplicate_final_test/01: Fail # Issue 13363
+constructor_duplicate_final_test/02: Fail # Issue 13363
 override_inheritance_mixed_test/08: Fail # Issue 18124
 override_inheritance_mixed_test/09: Fail # Issue 18124
 bad_constructor_test/05: CompileTimeError # Issue 13669
@@ -181,13 +183,13 @@
 label_test: Skip
 
 [ $compiler == dart2dart && $builder_tag == new_backend && $minified == false ]
-dynamic_test: RuntimeError # Issue 19751
-
-[ $compiler == dart2dart && $builder_tag == new_backend && $minified == false ]
 # This test happens not to fail in minified, because the type-argument is
 # renamed, but the unresolved reference to it is not.
 type_variable_conflict2_test/04: Fail # Issue 19725
 
+[ $compiler == dart2dart && $minified && $builder_tag != new_backend ]
+type_variable_conflict2_test/01: RuntimeError # Issue 16180
+
 [ $compiler == dart2dart ]
 type_variable_conflict2_test/02: MissingCompileTimeError # Issue 19725
 type_variable_conflict2_test/06: MissingCompileTimeError # Issue 16180
@@ -199,9 +201,6 @@
 
 built_in_identifier_prefix_test: Fail # Issue 6972
 constructor_initializer_test/none: Fail # Issue 12633
-factory3_test: Fail # Issue 13077
-redirecting_factory_long_test: Fail # Issue 13077
-type_checks_in_factory_method_test: Fail # Issue 12747
 
 # Mixins fail on the VM.
 mixin_forwarding_constructor2_test: Fail # Issue 13641
@@ -230,9 +229,6 @@
 method_override5_test: Fail # Issue 12810
 scope_variable_test/01: Fail # Issue 13016
 factory_redirection_test/01: Fail # Issue 12753
-factory_redirection_test/02: Crash # Issue 12753
-factory_redirection_test/03: Crash # Issue 12753
-factory_redirection_test/09: Fail # Issue 12753
 
 # DartVM problem.
 constructor5_test: Fail
@@ -256,7 +252,6 @@
 f_bounded_quantification4_test: Fail # Issue 12605.
 f_bounded_quantification5_test: Fail # Issue 12605.
 type_variable_typedef_test: Fail # Issue 11467
-type_variable_conflict2_test/01: RuntimeError # Issue 16180
 
 invocation_mirror_test: Fail, OK # Issue 12706 (hardcoded names).
 super_call4_test: Fail, OK # hardcoded names.
diff --git a/tests/language/lazy_static3_test.dart b/tests/language/lazy_static3_test.dart
index ee412e1..796b39f 100644
--- a/tests/language/lazy_static3_test.dart
+++ b/tests/language/lazy_static3_test.dart
@@ -43,7 +43,7 @@
   Expect.equals(null, x);
 
   Expect.throws(() => fib(x2), (e) => e == "interrupt initialization");
-  Expect.equals(499, x2);
+  Expect.equals(null, x2);
 
   Expect.throws(() => fib(x3), (e) => e is CyclicInitializationError);
   Expect.equals(null, x3);
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index f682dc4..be1c380 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -20,3 +20,32 @@
 lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16522
 
 lib/_internal/compiler/samples/compile_loop/compile_loop: CompileTimeError  # Issue 16524
+
+# Pub is starting to use the new async syntax, which isn't supported on the
+# analyzer bots yet.
+lib/_internal/pub/bin/async_compile: CompileTimeError
+lib/_internal/pub/bin/pub: CompileTimeError
+lib/_internal/pub/lib/src/command: CompileTimeError
+lib/_internal/pub/lib/src/command/barback: CompileTimeError
+lib/_internal/pub/lib/src/command/build: CompileTimeError
+lib/_internal/pub/lib/src/command/cache: CompileTimeError
+lib/_internal/pub/lib/src/command/cache_add: CompileTimeError
+lib/_internal/pub/lib/src/command/cache_list: CompileTimeError
+lib/_internal/pub/lib/src/command/cache_repair: CompileTimeError
+lib/_internal/pub/lib/src/command/deps: CompileTimeError
+lib/_internal/pub/lib/src/command/downgrade: CompileTimeError
+lib/_internal/pub/lib/src/command/get: CompileTimeError
+lib/_internal/pub/lib/src/command/global: CompileTimeError
+lib/_internal/pub/lib/src/command/global_activate: CompileTimeError
+lib/_internal/pub/lib/src/command/global_deactivate: CompileTimeError
+lib/_internal/pub/lib/src/command/global_list: CompileTimeError
+lib/_internal/pub/lib/src/command/global_run: CompileTimeError
+lib/_internal/pub/lib/src/command/help: CompileTimeError
+lib/_internal/pub/lib/src/command/lish: CompileTimeError
+lib/_internal/pub/lib/src/command/list_package_dirs: CompileTimeError
+lib/_internal/pub/lib/src/command/run: CompileTimeError
+lib/_internal/pub/lib/src/command/serve: CompileTimeError
+lib/_internal/pub/lib/src/command/upgrade: CompileTimeError
+lib/_internal/pub/lib/src/command/uploader: CompileTimeError
+lib/_internal/pub/lib/src/command/version: CompileTimeError
+lib/_internal/pub/lib/src/executable: CompileTimeError
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index 3260db8..d50523b 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -27,6 +27,7 @@
   'dart.async._scheduleAsyncCallback',
   'dart.async._setTimerFactoryClosure',
 
+  'dart.isolate._startMainIsolate',
   'dart.isolate._startIsolate',
   'dart.io.sleep',
   'dart.io.HttpServer.HttpServer.listenOn',
diff --git a/tests/lib/profiler/metrics_test.dart b/tests/lib/profiler/metrics_test.dart
index 69be446..4dbf642 100644
--- a/tests/lib/profiler/metrics_test.dart
+++ b/tests/lib/profiler/metrics_test.dart
@@ -99,6 +99,9 @@
   Expect.throws(() {
     var counter = new Counter('a.b/c', 'description');
   });
+  Expect.throws(() {
+    var counter = new Counter('vm', 'description');
+  });
 }
 
 main() {
diff --git a/tests/standalone/io/http_client_stays_alive_test.dart b/tests/standalone/io/http_client_stays_alive_test.dart
new file mode 100644
index 0000000..64ced6e
--- /dev/null
+++ b/tests/standalone/io/http_client_stays_alive_test.dart
@@ -0,0 +1,75 @@
+// 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.
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+// NOTE: This test tries to ensure that an HttpClient will close it's
+// underlying idle connections after [HttpClient.idleTimeout].
+//
+// The main script spawns a server and a subprocess which does a connection back
+// to it.
+// The subprocess is expected to shut down it's idle sockets after
+// [HttpClient.idleTimeout] and the main script will assert that this happens
+// within +/- 2 <= seconds.
+
+const SECONDS = 4;
+
+void runServerProcess() {
+  asyncStart();
+  HttpServer.bind('127.0.0.1', 0).then((server) {
+    var url = 'http://127.0.0.1:${server.port}/';
+
+    server.idleTimeout = const Duration(hours: 1);
+
+    var subscription = server.listen((HttpRequest request) {
+      return request.response..write('hello world')..close();
+    });
+
+    var sw = new Stopwatch()..start();
+    var arguments = ['--package-root=${Platform.packageRoot}',
+                     '${Platform.script}',
+                     url];
+    Process.run(Platform.executable, arguments).then((res) {
+      subscription.cancel();
+      if (res.exitCode != 0) {
+        throw "Child exited with ${res.exitCode} instead of 0. "
+              "(stdout: ${res.stdout}, stderr: ${res.stderr})";
+      }
+      var seconds = sw.elapsed.inSeconds;
+      // NOTE: There is a slight chance this will cause flakiness, but there is
+      // no other good way of testing correctness of timing-dependent code
+      // form the outside.
+      if (seconds < SECONDS || (SECONDS + 10) < seconds) {
+        throw "Child did exit within $seconds seconds, but expected it to take "
+              "roughly $SECONDS seconds.";
+      }
+
+      asyncEnd();
+    });
+  });
+}
+
+void runClientProcess(String url) {
+  var uri = Uri.parse(url);
+
+  // NOTE: We make an HTTP client request and then *forget to close* the HTTP
+  // client instance. The idle timer should fire after SECONDS.
+  var client = new HttpClient();
+  client.idleTimeout = const Duration(seconds: SECONDS);
+
+  client.getUrl(uri)
+      .then((req) =>req.close())
+      .then((response) => response.drain())
+      .then((_) => print('drained client request'));
+}
+
+void main(List<String> args) {
+  if (args.length == 1) {
+    runClientProcess(args.first);
+  } else {
+    runServerProcess();
+  }
+}
diff --git a/tests/standalone/io/http_client_timeout_test.dart b/tests/standalone/io/http_client_timeout_test.dart
deleted file mode 100644
index 0703abb4..0000000
--- a/tests/standalone/io/http_client_timeout_test.dart
+++ /dev/null
@@ -1,85 +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.
-
-import 'dart:async';
-import 'dart:io';
-
-
-void testOneRequest(int connections) {
-  HttpServer.bind('127.0.0.1', 0).then((server) {
-    server.listen((request) => request.response.close());
-    var client = new HttpClient();
-    var futures = [];
-    for (int i = 0; i < connections; i++) {
-      futures.add(
-          client.get('127.0.0.1', server.port, '/')
-              .then((request) => request.close())
-              .then((response) => response.fold(null, (x, y) {})));
-    }
-    Future.wait(futures).then((_) {
-      new Timer.periodic(const Duration(milliseconds: 100), (timer) {
-        if (server.connectionsInfo().total == 0) {
-          timer.cancel();
-          server.close();
-        }
-      });
-    });
-  });
-}
-
-
-void testIdleTimeout(int timeout) {
-  HttpServer.bind('127.0.0.1', 0).then((server1) {
-    HttpServer.bind('127.0.0.1', 0).then((server2) {
-      server1.listen((request) => request.pipe(request.response));
-      server2.listen((request) => request.pipe(request.response));
-
-      var client = new HttpClient();
-      client.idleTimeout = new Duration(milliseconds: timeout);
-
-      // Create a 'slow' connection..
-      Future connect(int port) {
-        return client.post('127.0.0.1', port, '/')
-            .then((request) {
-              request.write("data");
-              new Timer(const Duration(milliseconds: 250), () {
-                request.close();
-              });
-              return request.done;
-            })
-            .then((response) {
-              return response.fold(null, (x, y) {});
-            });
-      }
-
-      // Create a single, slow request, to server1.
-      connect(server1.port);
-
-      // Create a repeating connection to server2.
-      run() {
-        connect(server2.port).then((_) {
-          if (server1.connectionsInfo().total == 0) {
-            server1.close();
-            server2.close();
-            return;
-          }
-          Timer.run(run);
-        });
-      }
-      run();
-    });
-  });
-}
-
-
-main() {
-  testOneRequest(1);
-  testOneRequest(5);
-  testOneRequest(20);
-  testIdleTimeout(0);
-  testIdleTimeout(100);
-  testIdleTimeout(500);
-  testIdleTimeout(1000);
-  testIdleTimeout(2000);
-}
diff --git a/tests/standalone/io/http_cross_process_test.dart b/tests/standalone/io/http_cross_process_test.dart
index 1b24c95..b16763d 100644
--- a/tests/standalone/io/http_cross_process_test.dart
+++ b/tests/standalone/io/http_cross_process_test.dart
@@ -54,6 +54,7 @@
   var client = new HttpClient();
   client.get('127.0.0.1', port, "/")
       .then((request) => request.close())
-      .then((response) => response.listen((data) {},
-                                          onDone: () => print('SUCCESS')));
+      .then((response) => response.drain())
+      .then((_) => client.close())
+      .then((_) => print('SUCCESS'));
 }
diff --git a/tests/standalone/io/https_bad_certificate_client.dart b/tests/standalone/io/https_bad_certificate_client.dart
index 064131f..35edb69 100644
--- a/tests/standalone/io/https_bad_certificate_client.dart
+++ b/tests/standalone/io/https_bad_certificate_client.dart
@@ -69,7 +69,7 @@
       expect(e is HandshakeException || e is SocketException);
     }));
 
-  return Future.wait(testFutures);
+  return Future.wait(testFutures).then((_) => client.close());
 }
 
 void main(List<String> args) {
diff --git a/tests/standalone/io/web_socket_test.dart b/tests/standalone/io/web_socket_test.dart
index 564f412..b04e02f 100644
--- a/tests/standalone/io/web_socket_test.dart
+++ b/tests/standalone/io/web_socket_test.dart
@@ -43,9 +43,14 @@
 
   void testRequestResponseClientCloses(int totalConnections,
                                        int closeStatus,
-                                       String closeReason) {
+                                       String closeReason,
+                                       int numberOfMessages) {
+    assert (numberOfMessages >= 1);
+
+    asyncStart();
     createServer().then((server) {
       server.transform(new WebSocketTransformer()).listen((webSocket) {
+        asyncStart();
         webSocket.listen(
             webSocket.add,
             onDone: () {
@@ -55,20 +60,24 @@
               Expect.equals(
                   closeReason == null ? ""
                                       : closeReason, webSocket.closeReason);
+              asyncEnd();
             });
+        }, onDone: () {
+          asyncEnd();
         });
 
       int closeCount = 0;
       String messageText = "Hello, world!";
       for (int i = 0; i < totalConnections; i++) {
-        int messageCount = 0;
+        asyncStart();
         createClient(server.port).then((webSocket) {
           webSocket.add(messageText);
           webSocket.listen(
               (message) {
-                messageCount++;
-                if (messageCount < 1 ) {
-                  Expect.equals(messageText, message);
+                numberOfMessages--;
+                Expect.equals(messageText, message);
+
+                if (numberOfMessages > 0) {
                   webSocket.add(message);
                 } else {
                   webSocket.close(closeStatus, closeReason);
@@ -83,6 +92,7 @@
                 if (closeCount == totalConnections) {
                   server.close();
                 }
+                asyncEnd();
               });
           });
       }
@@ -423,9 +433,9 @@
   }
 
   void runTests() {
-    testRequestResponseClientCloses(2, null, null);
-    testRequestResponseClientCloses(2, 3001, null);
-    testRequestResponseClientCloses(2, 3002, "Got tired");
+    testRequestResponseClientCloses(2, null, null, 1);
+    testRequestResponseClientCloses(2, 3001, null, 2);
+    testRequestResponseClientCloses(2, 3002, "Got tired", 3);
     testRequestResponseServerCloses(2, null, null);
     testRequestResponseServerCloses(2, 3001, null);
     testRequestResponseServerCloses(2, 3002, "Got tired");
@@ -455,9 +465,7 @@
 
 
 main() {
-  asyncStart();
   new SecurityConfiguration(secure: false).runTests();
   initializeSSL();
   new SecurityConfiguration(secure: true).runTests();
-  asyncEnd();
 }
diff --git a/tests/standalone/issue14236_source.dart b/tests/standalone/issue14236_source.dart
deleted file mode 100644
index 65becdf..0000000
--- a/tests/standalone/issue14236_source.dart
+++ /dev/null
@@ -1,45 +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.
-//
-// This is the original dart program that was used to generate the snapshot
-// in file issue14236_test.dart
-// The original test/main has been commented out and we have a test/main which
-// throws an error to ensure that this file is not executed as part of the
-// test.
-//
-// When issue14236_test.dart fails, you must regenerate it using the VM
-// with your changes. You should understand what in your change makes
-// regeneration of the snapshot necessary.
-// Steps for regenerating:
-// 1) Swap the test functions below.
-// 2) $ ./xcodebuild/DebugIA32/dart --package-root=./xcodebuild/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
-// OR:
-// 2) $ ./out/DebugIA32/dart --package-root=./out/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
-// 3) Undo changes in 1.
-
-library test.issue14236;
-import "dart:isolate";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-
-/*
-test(SendPort replyTo) {
-  replyTo.send("from Isolate");
-}
-*/
-
-test(dummy) {
-  Expect.fail("Don't expect this to run at all");
-}
-
-main() {
-  asyncStart();
-  ReceivePort port = new ReceivePort();
-  Isolate.spawn(test, port.sendPort);
-  port.first.then((msg) {
-    Expect.equals("from Isolate", msg);
-    asyncEnd();
-  });
-}
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
deleted file mode 100644
index 7e248f3..0000000
--- a/tests/standalone/issue14236_test.dart
+++ /dev/null
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 6e630fe..56d0fcf 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -87,6 +87,7 @@
 issue14236_test: Skip # dart2js does not deal with Script snapshots.
 javascript_compatibility_errors_test: Skip
 javascript_compatibility_warnings_test: Skip
+unboxed_int_converter_test: Skip
 
 [ $compiler == dart2js && $jscl ]
 assert_test: RuntimeError, OK # Assumes unspecified fields on the AssertionError.
diff --git a/tests/standalone/unboxed_int_converter_test.dart b/tests/standalone/unboxed_int_converter_test.dart
new file mode 100644
index 0000000..2b75a01
--- /dev/null
+++ b/tests/standalone/unboxed_int_converter_test.dart
@@ -0,0 +1,79 @@
+// 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 UnboxedIntConverter for int32.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+
+import "package:expect/expect.dart";
+import "dart:typed_data";
+
+int32_add(a, b, c) => (a * c) + (b * c);
+int32_mul(a, b, c) => (a * c) * b;
+int32_sub(a, b, c) => (a * c) - (b * c);
+int32_shr(a, b, c) => (a * c * b) >> 16;
+int32_shl(a, b, c) => (a * c * b) << 16;
+int32_xor(a, b, c) => (a * c) ^ (b * c);
+int32_or(a, b, c) => (a * c) | (b * c);
+int32_and(a, b, c) => (a * c) & (b * c);
+
+int32_to_mint(a, b) {
+  var sum = 0;
+  var j = 0;
+  for (var i = a; i <= b; i++) {
+    sum -= (j * ++j) & 0xff;
+  }
+
+  return 0xffffffff + sum;
+}
+
+mint_to_int32(a, c, d) {
+  return a * a * a * (c - d);
+}
+
+uint32_to_int32(a, c) {
+  return (a * a * a) * (c & 0xFFFFFFFF);
+
+}
+
+main() {
+  for (var j = 0; j < 1000; j++) {
+    Expect.equals(2, int32_add(1, 1, 1));
+    Expect.equals(1, int32_mul(1, 1, 1));
+    Expect.equals(0, int32_sub(1, 1, 1));
+    Expect.equals(0, int32_shr(1, 1, 1));
+    Expect.equals(1 << 16, int32_shl(1, 1, 1));
+    Expect.equals(0, int32_xor(1, 1, 1));
+    Expect.equals(1, int32_or(1, 1, 1));
+    Expect.equals(1, int32_and(1, 1, 1));
+  }
+
+  Expect.equals(0x7ffffffe, int32_add(0x7ffffffc ~/ 2, 1, 2));
+  Expect.equals(-0x80000000, int32_add(-0x7ffffffe ~/ 2, -1, 2));
+  Expect.equals(-0x80000002, int32_add(-0x7ffffffe ~/ 2, -2, 2));  // Overflow.
+  Expect.equals(0x7ffffffe, int32_sub(0x7ffffffc ~/ 2, -1, 2));
+  Expect.equals(-0x80000000, int32_sub(-0x7ffffffe ~/ 2, 1, 2));
+  Expect.equals(-0x80000002, int32_sub(-0x7ffffffe ~/ 2, 2, 2));  // Overflow.
+  Expect.equals(-0x7ffffffe, int32_mul(0x7ffffffe ~/ 2, -1, 2));
+  Expect.equals(-0x80000000, int32_mul(-0x80000000 ~/ 2, 1, 2));
+  Expect.equals(0x80000000, int32_mul(-0x80000000 ~/ 2, -1, 2));  // Overflow.
+  Expect.equals(0x60000000, int32_xor(0x40000000 ~/ 2, 0x20000000 ~/ 2, 2));
+  Expect.equals(0x00000000, int32_xor(0x40000000 ~/ 2, 0x40000000 ~/ 2, 2));
+  Expect.equals(0x60000000, int32_or(0x40000000 ~/ 2, 0x20000000 ~/ 2, 2));
+  Expect.equals(0x60000000, int32_or(0x60000000 ~/ 2, 0x40000000 ~/ 2, 2));
+  Expect.equals(0x00000000, int32_and(0x40000000 ~/ 2, 0x20000000 ~/ 2, 2));
+  Expect.equals(0x40000000, int32_and(0x60000000 ~/ 2, 0x40000000 ~/ 2, 2));
+  Expect.equals(1, int32_shr(1, 1 << 16, 1));
+  Expect.equals(-1 << 15, int32_shr(1 << 15, -(1 << 16), 1));
+  Expect.equals(-0x080000000, int32_shl(-1 << 15, 1, 1));
+  Expect.equals(-0x100000000, int32_shl(-1 << 16, 1, 1));  // Overflow.
+
+  Expect.equals(0, int32_shr(1, 1, 1));
+  Expect.equals(1 << 16, int32_shl(1, 1, 1));
+
+  for (var j = 0; j < 1000; j++) {
+    Expect.equals(4294839503, int32_to_mint(0, 1000));
+    Expect.equals(-8, mint_to_int32(2, 0x100000000, 0x100000001));
+    Expect.equals(8, uint32_to_int32(2, 0x100000001));
+  }
+  Expect.equals(8 * 0x80000001, uint32_to_int32(2, 0x180000001));
+}
\ No newline at end of file
diff --git a/tests/standalone/vmservice/isolate_class_field_test.dart b/tests/standalone/vmservice/isolate_class_field_test.dart
index dd3f44e..3ea4466 100644
--- a/tests/standalone/vmservice/isolate_class_field_test.dart
+++ b/tests/standalone/vmservice/isolate_class_field_test.dart
@@ -16,48 +16,44 @@
 
   _testFieldA(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('a', field['user_name']);
     Expect.equals('a', field['name']);
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('dynamic', field['guard_class']);
-    Expect.equals(true, field['guard_nullable']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('dynamic', field['guardClass']);
+    Expect.equals(true, field['guardNullable']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   _testFieldFinalFixedLengthList(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('final_fixed_length_list', field['user_name']);
     Expect.equals('final_fixed_length_list', field['name']);
-    Expect.equals('_Float32Array', field['guard_class']['user_name']);
+    Expect.equals('_Float32Array', field['guardClass']['name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals(4, field['guard_length']);
+    Expect.equals(4, field['guardLength']);
   }
 
   _testFieldFixedLengthList(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('fixed_length_list', field['user_name']);
     Expect.equals('fixed_length_list', field['name']);
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('_Float32Array', field['guard_class']['user_name']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('_Float32Array', field['guardClass']['name']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   _testFieldName(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('name', field['user_name']);
     Expect.equals('name', field['name']);
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('_OneByteString', field['guard_class']['user_name']);
-    Expect.equals(false, field['guard_nullable']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('_OneByteString', field['guardClass']['name']);
+    Expect.equals(false, field['guardNullable']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   Future makeRequest() {
@@ -81,48 +77,44 @@
 
   _testFieldV(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('v', field['user_name']);
     Expect.equals('v', field['name']);
     Expect.equals(false, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('_Double', field['guard_class']['user_name']);
-    Expect.equals(true, field['guard_nullable']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('_Double', field['guardClass']['name']);
+    Expect.equals(true, field['guardNullable']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   _testFieldC(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('c', field['user_name']);
     Expect.equals('c', field['name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(true, field['final']);
-    Expect.equals('_Smi', field['guard_class']['user_name']);
-    Expect.equals(false, field['guard_nullable']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('_Smi', field['guardClass']['name']);
+    Expect.equals(false, field['guardNullable']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   _testFieldFinalFixedLengthList(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('final_fixed_length_list', field['user_name']);
     Expect.equals('final_fixed_length_list', field['name']);
-    Expect.equals('_Float32Array', field['guard_class']['user_name']);
+    Expect.equals('_Float32Array', field['guardClass']['name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals('variable', field['guard_length']);
+    Expect.equals('variable', field['guardLength']);
   }
 
   _testFieldFixedLengthArray(Map field) {
     Expect.equals('Field', field['type']);
-    Expect.equals('fixed_length_array', field['user_name']);
     Expect.equals('fixed_length_array', field['name']);
-    Expect.equals('_List', field['guard_class']['user_name']);
+    Expect.equals('_List', field['guardClass']['name']);
     Expect.equals(true, field['final']);
     Expect.equals(false, field['static']);
     Expect.equals(false, field['const']);
-    Expect.equals(3, field['guard_length']);
+    Expect.equals(3, field['guardLength']);
   }
 
   Future makeRequest() {
diff --git a/tests/standalone/vmservice/isolate_code_test.dart b/tests/standalone/vmservice/isolate_code_test.dart
index 3b48a69..620f43b 100644
--- a/tests/standalone/vmservice/isolate_code_test.dart
+++ b/tests/standalone/vmservice/isolate_code_test.dart
@@ -25,7 +25,7 @@
 
   onRequestCompleted(Map reply) {
     Expect.equals('Code', reply['type']);
-    Expect.equals('c', reply['function']['user_name']);
+    Expect.equals('c', reply['function']['name']);
     Expect.isTrue(reply['disassembly'].length > 0);
   }
 }
diff --git a/tests/standalone/vmservice/isolate_function_test.dart b/tests/standalone/vmservice/isolate_function_test.dart
index 6da0aba..1531229 100644
--- a/tests/standalone/vmservice/isolate_function_test.dart
+++ b/tests/standalone/vmservice/isolate_function_test.dart
@@ -13,8 +13,8 @@
       super('http://127.0.0.1:$port/$id/$functionId');
   onRequestCompleted(Map reply) {
     Expect.equals('Function', reply['type']);
-    Expect.equals('c', reply['user_name']);
-    Expect.equals(false, reply['is_static']);
+    Expect.equals('c', reply['name']);
+    Expect.equals(false, reply['static']);
   }
 }
 
@@ -25,7 +25,7 @@
   onRequestCompleted(Map reply) {
     Expect.equals('Function', reply['type']);
     Expect.equals('a', reply['name']);
-    Expect.equals(true, reply['is_static']);
+    Expect.equals(true, reply['static']);
   }
 }
 
diff --git a/tests/standalone/vmservice/test_helper.dart b/tests/standalone/vmservice/test_helper.dart
index 9591647..0d98bfb 100644
--- a/tests/standalone/vmservice/test_helper.dart
+++ b/tests/standalone/vmservice/test_helper.dart
@@ -208,22 +208,22 @@
     Expect.equals('ClassList', classTable['type'], 'Not a ClassTable.');
   }
 
-  bool classExists(String user_name) {
+  bool classExists(String name) {
     List members = classTable['members'];
     for (var i = 0; i < members.length; i++) {
       Map klass = members[i];
-      if (klass['user_name'] == user_name) {
+      if (klass['name'] == name) {
         return true;
       }
     }
     return false;
   }
 
-  String classId(String user_name) {
+  String classId(String name) {
     List members = classTable['members'];
     for (var i = 0; i < members.length; i++) {
       Map klass = members[i];
-      if (klass['user_name'] == user_name) {
+      if (klass['name'] == name) {
         return klass['id'];
       }
     }
@@ -259,7 +259,7 @@
     List<Future> requests = new List<Future>();
     fieldNames.forEach((fn) {
       class_fields.forEach((f) {
-        if (f['user_name'] == fn) {
+        if (f['name'] == fn) {
           var request = new FieldRequestHelper(port_, isolate_id_, f['id']);
           requests.add(request.makeRequest());
         }
@@ -267,7 +267,7 @@
     });
     return Future.wait(requests).then((a) {
       a.forEach((FieldRequestHelper field) {
-        fields[field.field['user_name']] = field.field;
+        fields[field.field['name']] = field.field;
       });
       return this;
     });
diff --git a/tests/try/poi/data/abstract_field.dart b/tests/try/poi/data/abstract_field.dart
new file mode 100644
index 0000000..cc793b9
--- /dev/null
+++ b/tests/try/poi/data/abstract_field.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 abstract_field;
+
+class A {
+  String get foo => null;
+
+  set foo(String v) => null;
+
+  method() {
+  }
+}
+
+String get bar => null;
+
+set bar(String v) => null;
+
+main() {}
diff --git a/tests/try/poi/diff_test.dart b/tests/try/poi/diff_test.dart
new file mode 100644
index 0000000..ae384cf
--- /dev/null
+++ b/tests/try/poi/diff_test.dart
@@ -0,0 +1,123 @@
+// 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 of element diff.
+library trydart.diff_test;
+
+import 'dart:async' show
+    Future;
+
+import 'package:expect/expect.dart' show
+    Expect;
+
+import 'package:async_helper/async_helper.dart' show
+    asyncTest;
+
+import 'package:compiler/implementation/dart2jslib.dart' show
+    Compiler,
+    Script;
+
+import 'package:compiler/implementation/source_file.dart' show
+    StringSourceFile;
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    Element,
+    LibraryElement;
+
+import 'package:try/poi/diff.dart' show
+    Difference,
+    computeDifference;
+
+import '../../compiler/dart2js/compiler_helper.dart' show
+    MockCompiler,
+    compilerFor;
+
+final TEST_DATA = [
+    {
+      'beforeSource': 'main() {}',
+      'afterSource': 'main() { var x; }',
+      'expectations': [['main', 'main']],
+    },
+    {
+      'beforeSource': 'main() {}',
+      'afterSource': 'main() { /* ignored */ }',
+      'expectations': [],
+    },
+    {
+      'beforeSource': 'main() {}',
+      'afterSource': 'main() { }',
+      'expectations': [],
+    },
+    {
+      'beforeSource': 'var i; main() {}',
+      'afterSource': 'main() { } var i;',
+      'expectations': [],
+    },
+    {
+      'beforeSource': 'main() {}',
+      'afterSource': '',
+      'expectations': [['main', null]],
+    },
+    {
+      'beforeSource': '',
+      'afterSource': 'main() {}',
+      'expectations': [[null, 'main']],
+    },
+];
+
+const String SCHEME = 'org.trydart.diff-test';
+
+Uri customUri(String path) => Uri.parse('$SCHEME://$path');
+
+Future<List<Difference>> testDifference(
+    String beforeSource,
+    String afterSource) {
+  Uri scriptUri = customUri('main.dart');
+  MockCompiler compiler = compilerFor(beforeSource, scriptUri);
+
+  Future<LibraryElement> future = compiler.libraryLoader.loadLibrary(scriptUri);
+  return future.then((LibraryElement library) {
+    Script sourceScript = new Script(
+        scriptUri, scriptUri, new StringSourceFile('$scriptUri', afterSource));
+    var dartPrivacyIsBroken = compiler.libraryLoader;
+    LibraryElement newLibrary = dartPrivacyIsBroken.createLibrarySync(
+        null, sourceScript, scriptUri);
+    return computeDifference(library, newLibrary);
+  });
+}
+
+Future testData(Map data) {
+  String beforeSource = data['beforeSource'];
+  String afterSource = data['afterSource'];
+  List expectations = data['expectations'];
+
+  validate(List<Difference> differences) {
+    return checkExpectations(expectations, differences);
+  }
+
+  return testDifference(beforeSource, afterSource).then(validate);
+}
+
+String elementNameOrNull(Element element) {
+  return element == null ? null : element.name;
+}
+
+checkExpectations(List expectations, List<Difference> differences) {
+  Iterator iterator = expectations.iterator;
+  for (Difference difference in differences) {
+    Expect.isTrue(iterator.moveNext());
+    List expectation = iterator.current;
+    String expectedBeforeName = expectation[0];
+    String expectedAfterName = expectation[1];
+    Expect.stringEquals(
+        expectedBeforeName, elementNameOrNull(difference.before));
+    Expect.stringEquals(expectedAfterName, elementNameOrNull(difference.after));
+    print(difference);
+  }
+  Expect.isFalse(iterator.moveNext());
+}
+
+void main() {
+  asyncTest(() => Future.forEach(TEST_DATA, testData));
+}
diff --git a/tests/try/poi/serialize_test.dart b/tests/try/poi/serialize_test.dart
index 731a4b1..06b11c3 100644
--- a/tests/try/poi/serialize_test.dart
+++ b/tests/try/poi/serialize_test.dart
@@ -61,6 +61,26 @@
     String scope = poi.scopeInformation(element, position);
     Expect.stringEquals(
         JSON.encode(expectedSubclass), JSON.encode(JSON.decode(scope)), scope);
+
+    return testAbstractField(handler);
+  });
+}
+
+Future testAbstractField(FormattingDiagnosticHandler handler) {
+  int position = 321;
+
+  Uri script = Platform.script.resolve('data/abstract_field.dart');
+
+  Future future = poi.runPoi(script, position, handler.provider, handler);
+  return future.then((Element element) {
+    Uri foundScript = element.compilationUnit.script.resourceUri;
+    Expect.stringEquals('$script', '$foundScript');
+    Expect.stringEquals('method', element.name);
+
+    String scope = poi.scopeInformation(element, position);
+    Expect.stringEquals(
+        JSON.encode(expectedAbstractField), JSON.encode(JSON.decode(scope)),
+        scope);
   });
 }
 
@@ -242,6 +262,69 @@
   }
 };
 
+final expectedAbstractField = {
+  "name": "method",
+  "kind": "function",
+  "type": "() -> dynamic",
+  "enclosing": {
+    "name": "A",
+    "kind": "class side",
+    "members": [
+      {
+        "kind": "generative_constructor",
+        "type": "() -> A"
+      }
+    ],
+    "enclosing": {
+      "name": "A",
+      "kind": "instance side",
+      "members": [
+        {
+          "name": "foo",
+          "kind": "getter"
+        },
+        {
+          "name": "foo",
+          "kind": "setter"
+        },
+        {
+          "name": "method",
+          "kind": "function",
+          "type": "() -> dynamic"
+        }
+      ],
+      "enclosing": {
+        "name": "abstract_field",
+        "kind": "library",
+        "members": [
+          {
+            "name": "A",
+            "kind": "class"
+          },
+          {
+            "name": "bar",
+            "kind": "getter"
+          },
+          {
+            "name": "bar",
+            "kind": "getter"
+          },
+          {
+            "name": "main",
+            "kind": "function",
+            "type": "() -> dynamic"
+          }
+        ],
+        "enclosing": {
+          "kind": "imports",
+          "members": coreImports,
+          "enclosing": object
+        },
+      },
+    },
+  },
+};
+
 final coreImports = [
   {
     "name": "Deprecated",
diff --git a/tests/try/try.status b/tests/try/try.status
index 1375419..544d97b 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -6,7 +6,7 @@
 # dart2js-drt (Content Shell --dump-render-tree)
 # dart2js-chrome
 # dart2js-ff (Firefox)
-[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff && $runtime != safari) ]
+[ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff && $runtime != safari && $runtime != ie11) ]
 web/*: Skip
 
 [ $compiler == dart2js && $runtime == drt ]
diff --git a/tools/VERSION b/tools/VERSION
index 870331c..4f39310 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 6
+MINOR 7
 PATCH 0
-PRERELEASE 9
-PRERELEASE_PATCH 7
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index e7e6eed..05b178b 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -63,7 +63,7 @@
   csp = None
   arch = None
   dart2js_full = False
-  batch = False
+  batch = True
   builder_tag = None
 
   dart2js_pattern = re.match(DART2JS_BUILDER, builder_name)
@@ -123,9 +123,6 @@
       minified = True
     if dart2js_pattern.group(12) == 'x64':
       arch = 'x64'
-    if dart2js_pattern.group(14) == 'batch':
-      batch = True
-
     shard_index = dart2js_pattern.group(15)
     total_shards = dart2js_pattern.group(16)
   elif dartium_pattern:
@@ -144,10 +141,6 @@
   if system == 'mac10.8' or system == 'mac10.7':
     system = 'mac'
 
-  # This is temporary, slowly enabling this.
-  if system == 'linux' or system == 'mac':
-    batch = True
-
   if (system == 'windows' and platform.system() != 'Windows') or (
       system == 'mac' and platform.system() != 'Darwin') or (
       system == 'linux' and platform.system() != 'Linux'):
diff --git a/tools/bots/dart2js_dump_info.py b/tools/bots/dart2js_dump_info.py
new file mode 100644
index 0000000..e213954
--- /dev/null
+++ b/tools/bots/dart2js_dump_info.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+
+# 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.
+
+"""
+Buildbot steps for testing dart2js with --dump-info turned on
+"""
+import os
+import shutil
+import sys
+import bot
+import bot_utils
+
+utils = bot_utils.GetUtils()
+HOST_OS = utils.GuessOS()
+
+def DumpConfig(name, is_buildbot):
+  """Returns info for the current buildbot.
+  We only run this bot on linux, so all of this is just hard coded.
+  """
+  return bot.BuildInfo('none', 'none', 'release', 'linux')
+
+def Run(args):
+  print "Running: %s" % ' '.join(args)
+  sys.stdout.flush()
+  bot.RunProcess(args)
+
+def DumpSteps(build_info):
+  build_root = utils.GetBuildRoot(HOST_OS, mode='release', arch='ia32')
+  compilations_dir = os.path.join(bot_utils.DART_DIR,
+                                  build_root,
+                                  'generated_compilations')
+  tests = ['html', 'samples']
+
+  with bot.BuildStep('Cleaning out old compilations'):
+    print "Cleaning out %s" % compilations_dir
+    shutil.rmtree(compilations_dir, ignore_errors=True)
+
+  with utils.TempDir() as temp_dir:
+    normal_compilations = os.path.join(temp_dir, 'normal')
+    dump_compilations = os.path.join(temp_dir, 'dump')
+    normal_compilation_command = [sys.executable,
+                                  './tools/test.py',
+                                  '--mode=%s' % build_info.mode,
+                                  '-cdart2js',
+                                  '-rnone',
+                                  '--time',
+                                  '--use-sdk',
+                                  '--report',
+                                  '--progress=buildbot',
+                                  '-v'
+                                  ] + tests
+    with bot.BuildStep('Compiling without dump info'):
+      Run(normal_compilation_command)
+      pass
+
+    with bot.BuildStep('Store normal compilation artifacts'):
+      args = ['mv', compilations_dir, normal_compilations]
+      Run(args)
+
+    with bot.BuildStep('Compiling with dump info'):
+      args = normal_compilation_command + ['--dart2js-options=--dump-info']
+      Run(args)
+
+    with bot.BuildStep('Store normal compilation artifacts'):
+      args = ['mv', compilations_dir, dump_compilations]
+      Run(args)
+
+    with bot.BuildStep('Compare outputs'):
+      args = ['diff', '-rq', '-x', '*\.json',
+              normal_compilations, dump_compilations]
+      # Diff will return non zero and we will throw if there are any differences
+      Run(args)
+
+    with bot.BuildStep('Validate dump files'):
+      # Do whatever you like :-), files are in dump_compilations
+      pass
+
+if __name__ == '__main__':
+  bot.RunBot(DumpConfig, DumpSteps)
+
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index dc56e03..640bd0b 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -50,6 +50,8 @@
   # There are a number of big/integration tests in pkg, run with bigger timeout
   common_args.append('--timeout=120')
 
+  if build_info.system == 'windows':
+    common_args.append('-j1')
   opt_threshold = '--vm-options=--optimization-counter-threshold=5'
   if build_info.mode == 'release':
     bot.RunTest('pub and pkg ', build_info,
@@ -80,8 +82,6 @@
     # 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__':
diff --git a/tools/bots/run_android_tests.sh b/tools/bots/run_android_tests.sh
index 6361d37..6bd2034 100755
--- a/tools/bots/run_android_tests.sh
+++ b/tools/bots/run_android_tests.sh
@@ -13,7 +13,7 @@
 cd src
 ninja -C out/Release forwarder2
 ninja -C out/Release pkg_packages
-cp -R out/Release/packages out/ReleaseARM/packages
+cp -R out/Release/packages out/ReleaseARM
 export PATH=$PATH:third_party/android_tools/sdk/platform-tools/\
 :third_party/android_tools/sdk/tools/
 
diff --git a/tools/build.py b/tools/build.py
index 2b2ab88..5878dca 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -8,6 +8,7 @@
 import optparse
 import os
 import re
+import shutil
 import subprocess
 import sys
 import time
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index 1c754c4..4a6dddb 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -10,6 +10,7 @@
 # binary packages.
 
 import optparse
+import os
 import sys
 import tarfile
 import subprocess
@@ -31,23 +32,29 @@
                     help="Where to put the packages.")
   result.add_option("-a", "--arch",
       help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64]',
+      metavar='[all,ia32,x64,armel,armhf]',
       default='x64')
+  result.add_option("-t", "--toolchain",
+      help='Cross-compilation toolchain prefix',
+      default=None)
 
   return result
 
-def RunBuildPackage(opt, cwd):
+def RunBuildPackage(opt, cwd, toolchain=None):
+  env = os.environ.copy()
+  if toolchain != None:
+    env["TOOLCHAIN"] = '--toolchain=' + toolchain
   cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
   cmd.extend(opt)
   process = subprocess.Popen(cmd,
                              stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                             cwd=cwd)
+                             cwd=cwd, env=env)
   (stdout, stderr) = process.communicate()
   if process.returncode != 0:
     raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
                     (' '.join(cmd), stderr, stdout))
 
-def BuildDebianPackage(tarball, out_dir, arch):
+def BuildDebianPackage(tarball, out_dir, arch, toolchain):
   version = utils.GetVersion()
   tarroot = 'dart-%s' % version
   origtarname = 'dart_%s.orig.tar.gz' % version
@@ -77,6 +84,18 @@
       print "Building amd64 package"
       RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot))
 
+    # Build armhf binary package.
+    if 'armhf' in arch:
+      print "Building armhf package"
+      RunBuildPackage(
+          ['-B', '-aarmhf', '-us', '-uc'], join(temp_dir, tarroot), toolchain)
+
+    # Build armel binary package.
+    if 'armel' in arch:
+      print "Building armel package"
+      RunBuildPackage(
+          ['-B', '-aarmel', '-us', '-uc'], join(temp_dir, tarroot), toolchain)
+
     # Copy the Debian package files to the build directory.
     debbase = 'dart_%s' % version
     source_package = [
@@ -90,6 +109,12 @@
     amd64_package = [
       '%s-1_amd64.deb' % debbase
     ]
+    armhf_package = [
+      '%s-1_armhf.deb' % debbase
+    ]
+    armel_package = [
+      '%s-1_armel.deb' % debbase
+    ]
 
     for name in source_package:
       copyfile(join(temp_dir, name), join(out_dir, name))
@@ -99,6 +124,13 @@
     if 'x64' in arch:
       for name in amd64_package:
         copyfile(join(temp_dir, name), join(out_dir, name))
+    if ('armhf' in arch):
+      for name in armhf_package:
+        copyfile(join(temp_dir, name), join(out_dir, name))
+    if ('armel' in arch):
+      for name in armel_package:
+        copyfile(join(temp_dir, name), join(out_dir, name))
+
 
 def Main():
   if HOST_OS != 'linux':
@@ -109,7 +141,7 @@
   out_dir = options.out_dir
   tar_filename = options.tar_filename
   if options.arch == 'all':
-    options.arch = 'ia32,x64'
+    options.arch = 'ia32,x64,armhf'
   arch = options.arch.split(',')
 
   if not options.out_dir:
@@ -120,7 +152,7 @@
                         utils.GetBuildDir(HOST_OS),
                         'dart-%s.tar.gz' % utils.GetVersion())
 
-  BuildDebianPackage(tar_filename, out_dir, arch)
+  BuildDebianPackage(tar_filename, out_dir, arch, options.toolchain)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/create_pub_snapshot.py b/tools/create_pub_snapshot.py
new file mode 100644
index 0000000..5ba0beb
--- /dev/null
+++ b/tools/create_pub_snapshot.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2014 The Dart Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+This script runs the async/await compiler on pub and then compiles the output
+of that to a snapshot.
+
+Usage: create_pub_snapshot.py <dart> <compiler> <package root> <output dir>
+
+When #104 is fixed, this script is no longer needed. Instead, replace the
+generate_pub_snapshot action in utils/pub.gyp with:
+
+    'action': [
+      '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+      '--package-root=<(PRODUCT_DIR)/pub_packages/',
+      '--snapshot=<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
+      '../../sdk/lib/_internal/pub/bin/pub.dart',
+    ]
+"""
+
+import os
+import subprocess
+import sys
+
+
+def Main():
+  if len(sys.argv) < 5:
+    raise Exception("""Not enough arguments.
+
+Usage: create_pub_snapshot.py <dart> <compiler> <package root> <output file>""")
+
+  dart_path = sys.argv[1]
+  compiler = sys.argv[2]
+  package_root = sys.argv[3]
+  output_dir = sys.argv[4]
+
+  # Run the async compiler.
+  status = subprocess.call([
+    dart_path,
+    '--package-root=' + package_root,
+    compiler,
+    output_dir,
+    '--silent'
+  ])
+  if status != 0: return status
+
+  # Generate the snapshot from the output of that.
+  status = subprocess.call([
+    dart_path,
+    '--package-root=' + package_root,
+    '--snapshot=' + os.path.join(output_dir, 'pub.dart.snapshot'),
+    os.path.join(output_dir, 'pub_async/bin/pub.dart')
+  ])
+  if status != 0: return status
+
+
+if __name__ == '__main__':
+  sys.exit(Main())
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 20b98f3..90d8687 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -20,6 +20,7 @@
 # ......dartanalyzer
 # ......pub
 # ......snapshots/
+# ........analysis_server.dart.snapshot
 # ........dart2js.dart.snapshot
 # ........dartanalyzer.dart.snapshot
 # ........dartfmt.dart.snapshot
@@ -100,20 +101,25 @@
   if HOST_OS == 'win32':
     file_extension = '.bat'
 
+  # If we're copying an SDK-specific shell script, strip off the suffix.
+  dest_file = basename(src_file)
+  if dest_file.endswith('_sdk'):
+    dest_file = dest_file.replace('_sdk', '')
+
   src = src_file + file_extension
-  dest = join(dest_dir, basename(src_file) + file_extension)
+  dest = join(dest_dir, dest_file + file_extension)
   Copy(src, dest)
 
 
 def CopyDartScripts(home, sdk_root):
-  for executable in ['dart2js', 'dartanalyzer', 'dartfmt', 'docgen', 'pub']:
+  for executable in ['dart2js', 'dartanalyzer', 'dartfmt', 'docgen', 'pub_sdk']:
     CopyShellScript(os.path.join(home, 'sdk', 'bin', executable),
                     os.path.join(sdk_root, 'bin'))
 
 
 def CopySnapshots(snapshots, sdk_root):
-  for snapshot in ['dart2js', 'dartanalyzer', 'dartfmt', 'utils_wrapper',
-                   'pub']:
+  for snapshot in ['analysis_server', 'dart2js', 'dartanalyzer', 'dartfmt',
+                   'utils_wrapper', 'pub']:
     snapshot += '.dart.snapshot'
     copyfile(join(snapshots, snapshot),
              join(sdk_root, 'bin', 'snapshots', snapshot))
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
index 452421f..5dd1c84 100755
--- a/tools/dartium/update_deps.py
+++ b/tools/dartium/update_deps.py
@@ -40,7 +40,7 @@
 # Repositories to auto-update
 ########################################################################
 
-BRANCH_CURRENT="dart/1985"
+BRANCH_CURRENT="dart/dartium"
 BRANCH_NEXT="dart/dartium"
 BRANCH_MULTIVM="dart/multivm"
 
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 57f75da..6fee3f5 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -990,3 +990,7 @@
 void _initializeCustomElement(Element e) {
   _Utils.initializeCustomElement(e);
 }
+
+// Class for unsupported native browser 'DOM' objects.
+class _UnsupportedBrowserObject extends NativeFieldWrapperClass2 {
+}
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 210ef42..b0deead 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -714,7 +714,7 @@
    * Adds the specified text after the last child of this element.
    */
   void appendText(String text) {
-    this.insertAdjacentText('beforeend', text);
+    this.append(new Text(text));
   }
 
   /**
diff --git a/tools/linux_dist_support/debian/control b/tools/linux_dist_support/debian/control
index 2e8ce4d..e39f877 100644
--- a/tools/linux_dist_support/debian/control
+++ b/tools/linux_dist_support/debian/control
@@ -8,7 +8,7 @@
 	openjdk-6-jdk
 
 Package: dart
-Architecture: amd64 i386
+Architecture: amd64 i386 armhf armel
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Description: Dart SDK
 
diff --git a/tools/linux_dist_support/debian/rules b/tools/linux_dist_support/debian/rules
index e2ebca3..b58fcb0 100755
--- a/tools/linux_dist_support/debian/rules
+++ b/tools/linux_dist_support/debian/rules
@@ -9,14 +9,24 @@
 PARALLEL_JOBS := 1
 endif
 
-DEB_HOST_ARCH_CPU := $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
 ifeq (amd64,$(DEB_HOST_ARCH_CPU))
 BUILD_TYPE += ReleaseX64
+ARCH += x64
 else
 ifeq (i386,$(DEB_HOST_ARCH_CPU))
 BUILD_TYPE += ReleaseIA32
+ARCH += ia32
 else
-$(warning unsupported target arch $(DEB_HOST_ARCH_CPU) - continuing anyway)
+ifeq (arm,$(DEB_HOST_ARCH_CPU))
+ifeq ($(DEB_BUILD_ARCH_CPU),$(DEB_HOST_ARCH_CPU))
+BUILD_TYPE += ReleaseARM
+else
+BUILD_TYPE += ReleaseXARM
+endif
+ARCH += arm
+else
+$(error unsupported target arch '$(DEB_HOST_ARCH_CPU)')
+endif
 endif
 endif
 
@@ -40,12 +50,18 @@
 	GYP_GENERATORS=make python dart/tools/gyp_dart.py all
 
 override_dh_auto_build:
-	make -C dart -j$(PARALLEL_JOBS) \
-		BUILDTYPE=$(BUILD_TYPE) $(BUILD_ARGS) create_sdk
+	cd dart; \
+	python tools/build.py -v -m release -a $(ARCH) $(TOOLCHAIN) create_sdk; \
+	cd ..
 
 # Building the Dart SDK will already strip all binaries.
 override_dh_strip:
 
+# This override allows us to ignore spurious missing library errors when
+# cross-compiling.
+override_dh_shlibdeps:
+	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
+
 override_dh_auto_install:
 	mkdir -p debian/tmp/out
 	cp -R dart/out/$(BUILD_TYPE)/dart-sdk debian/tmp/out
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 6579c395..d76e4379 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -91,7 +91,8 @@
     const ['safari', 'ff', 'firefox', 'chrome', 'ie9', 'ie10',
            'ie11', 'dartium'];
 
-  static const List<String> BROWSERS_WITH_WINDOW_SUPPORT = const ['ie11'];
+  static const List<String> BROWSERS_WITH_WINDOW_SUPPORT =
+      const ['ie11', 'ie10'];
 
   // TODO(kustermann): add standard support for chrome on android
   static bool supportedBrowser(String name) {
@@ -1307,9 +1308,11 @@
       if (request.uri.path.startsWith(driverPath)) {
         var browserId = request.uri.path.substring(driverPath.length + 1);
         textResponse = getDriverPage(browserId);
+        request.response.headers.set('Content-Type', 'text/html');
       } else if (request.uri.path.startsWith(nextTestPath)) {
         var browserId = request.uri.path.substring(nextTestPath.length + 1);
         textResponse = getNextTest(browserId);
+        request.response.headers.set('Content-Type', 'text/plain');
       } else {
         // /favicon.ico requests
       }
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index f686e24..36ddb25 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -366,6 +366,7 @@
     } else if (path.filename.endsWith('.dart')) {
       response.headers.set('Content-Type', 'application/dart');
     }
+    response.headers.removeAll("X-Frame-Options");
     file.openRead().pipe(response).catchError((e) {
       DebugLogger.warning(
           'HttpServer: error while closing the response stream', e);
diff --git a/tools/testing/dart/test_controller.js b/tools/testing/dart/test_controller.js
index dace747..e952aaf 100644
--- a/tools/testing/dart/test_controller.js
+++ b/tools/testing/dart/test_controller.js
@@ -109,16 +109,39 @@
 
 var waitForDone = false;
 
+var driverWindowCached = false;
+var driverWindow;
+var reportingDriverWindowError = false;
+
 // Returns the driving window object if available
+// This function occasionally returns null instead of the
+// parent on Android content shell, so we cache the value
+// to get a consistent answer.
 function getDriverWindow() {
   if (window != window.parent) {
     // We're running in an iframe.
-    return window.parent;
+    result = window.parent;
   } else if (window.opener) {
     // We were opened by another window.
-    return window.opener;
+    result = window.opener;
+  } else {
+    result = null;
   }
-  return null;
+  if (driverWindowCached) {
+    if (result != driverWindow) {
+      recordEvent('debug', 'Driver windows changed: was null == ' +
+           (driverWindow == null) + ', is null == ' + (result == null));
+      // notifyDone calls back into this function multiple times.  Avoid loop.
+      if (!reportingDriverWindowError) {
+        reportingDriverWindowError = true;
+        notifyDone('FAIL');
+      }
+    }
+  } else {
+    driverWindowCached = true;
+    driverWindow = result;
+  }
+  return driverWindow;
 }
 
 function usingBrowserController() {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index d00f39e..d5c5c06 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2155,6 +2155,8 @@
       "pkg_polymer_e2e_test_good_import_test": "polymer_gi",
       "tests_co19_src_Language_12_Expressions_14_Function_Invocation_":
           "co19_fn_invoke_",
+      "tests_co19_src_LayoutTests_fast_css_getComputedStyle_getComputedStyle-":
+          "co19_css_getComputedStyle_",
       "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
           "caretRangeFromPoint-": "co19_caretrangefrompoint_",
       "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
@@ -2162,6 +2164,7 @@
       "tests_co19_src_LayoutTests_fast_dom_HTMLLinkElement_link-onerror-"
           "stylesheet-with-": "co19_dom_link-",
       "tests_co19_src_LayoutTests_fast_dom_": "co19_dom",
+      "tests_co19_src_LayoutTests_fast_canvas_webgl": "co19_canvas_webgl",
       "tests_co19_src_LibTest_core_AbstractClassInstantiationError_"
           "AbstractClassInstantiationError_": "co19_abstract_class_",
       "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_"
@@ -2196,6 +2199,8 @@
           "co19_shadowdom_",
       "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-"
           "shadow-trees_": "co19_shadow_html_",
+      "tests_co19_src_WebPlatformTest_html_webappapis_system-state-and-"
+          "capabilities_the-navigator-object": "co19_webappapis_navigator_",
       "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_"
     };
 
diff --git a/utils/analysis_server/.gitignore b/utils/analysis_server/.gitignore
new file mode 100644
index 0000000..010faca
--- /dev/null
+++ b/utils/analysis_server/.gitignore
@@ -0,0 +1,3 @@
+/analysis_server.Makefile
+/analysis_server.target.mk
+
diff --git a/utils/analysis_server/analysis_server.gyp b/utils/analysis_server/analysis_server.gyp
new file mode 100644
index 0000000..99e059b
--- /dev/null
+++ b/utils/analysis_server/analysis_server.gyp
@@ -0,0 +1,37 @@
+# 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.
+
+{
+  'targets': [
+    {
+      'target_name': 'analysis_server',
+      'type': 'none',
+      'dependencies': [
+        '../../runtime/dart-runtime.gyp:dart',
+        '../../pkg/pkg.gyp:pkg_packages',
+        '../../pkg/pkg_files.gyp:pkg_files_stamp'
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_analysis_server_snapshot',
+          'inputs': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '../../sdk/lib/_internal/libraries.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+            '<(SHARED_INTERMEDIATE_DIR)/pkg_files.stamp',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/analysis_server.dart.snapshot',
+          ],
+          'action': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '--snapshot=<(SHARED_INTERMEDIATE_DIR)/analysis_server.dart.snapshot',
+            '--package-root=<(PRODUCT_DIR)/packages/',
+            '../../pkg/analysis_server/bin/server.dart',
+          ],
+        },
+      ],
+    },
+  ],
+}
diff --git a/utils/pub/pub.gyp b/utils/pub/pub.gyp
index bb1d429..bf34ab9 100644
--- a/utils/pub/pub.gyp
+++ b/utils/pub/pub.gyp
@@ -23,15 +23,18 @@
             '<(SHARED_INTERMEDIATE_DIR)/pub_files.stamp',
             '<(SHARED_INTERMEDIATE_DIR)/dart2js_files.stamp',
             '<(SHARED_INTERMEDIATE_DIR)/pkg_files.stamp',
+            '<(SHARED_INTERMEDIATE_DIR)/pub_packages.stamp',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
           ],
           'action': [
+            'python',
+            '../../tools/create_pub_snapshot.py',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '--package-root=<(PRODUCT_DIR)/pub_packages/',
-            '--snapshot=<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
-            '../../sdk/lib/_internal/pub/bin/pub.dart',
+            '../../sdk/lib/_internal/pub/bin/async_compile.dart',
+            '<(PRODUCT_DIR)/pub_packages/',
+            '<(SHARED_INTERMEDIATE_DIR)',
           ],
         },
       ],